【www.guakaob.com--实践技能】
新技能Get!如何破解安卓手机图案解锁
安卓手机的图形锁(九宫格)是3×3的点阵,按次序连接数个点从而达到锁定/解锁的功能。最少需要连接4个点,最多能连接9个点。网上也有暴力删除手机图形锁的方法,即直接干掉图形锁功能。但假如你想进入别人的手机,但又不想引起其警觉的话……你可以参考一下本文。
前提条件:手机需要root,而且打开调试模式。一般来讲,如果用过诸如“豌豆荚手机助手”、
“360手机助手”一类的软件,都会被要求打开调试模式的。如果要删除手机内置软件,则需要将手机root。
原理分析
首先科普一下,安卓手机是如何标记这9个点的。通过阅读安卓系统源码可知,每个点都有其编号,组成了一个3×3的矩阵,形如:
00 01 02
03 04 05
06 07 08
假如设定解锁图形为一个“L”形,如图:
那么这几个点的排列顺序是这样的:00 03 06 07 08。系统就记下来了这一串数字,然后将这一串数字(以十六进制的方式)进行SHA1加密,存储在了手机里的/data/system/gesture.key文件中。我们用数据线连接手机和电脑,然后ADB连接手机,将文件下载到电脑上(命令:adb pull /data/system/gesture.key gesture.key),如图:
用WinHex等十六进制编辑程序打开gesture.key,会发现文件内是SHA1加密过的字符串:c8c0b24a15dc8bbfd411427973574695230458f0,如图:
当你下次解锁的时候,系统就对比你画的图案,看对应的数字串是不是0003060708【画图案解锁怎么画?】
对应的
加密结果。如果是,就解锁;不是就继续保持锁定。那么,如果穷举所有的数字串排列,会有多少呢?联想到高中的阶乘,如果用4个点做解锁图形的话,就是9x8x7x6=3024种可能性,那5个点就是15120,6个点的话60480,7个点181440,8个点362880,9个点362880。总共是985824种可能性(但这么计算并不严密,因为同一条直线上的点只能和他们相邻的点相连)。
满打满算,也不到985824种可能性。乍一看很大,但在计算机面前,穷举出来这些东西用不了几秒钟。
破解过程
知道了原理,就着手写程序来实现吧。这里使用了Python来完成任务。主要应用了hashlib模块(对字符串进行SHA1加密)和itertools模块(Python内置,生成00-09的排列组合)。 主要流程为:
1、ADB连接手机,获取gesture.key文件
2、读取key文件,存入字符串str_A
3、生成全部可能的数字串
4、对这些数字串进行加密,得到字符串str_B
5、将字符串str_A与str_B进行对比
6、如果字符串A,B相同,则说明数字串num就是想要的解锁顺序
7、打印出数字串num
下面为程序:
总结
从程序本身来说,得到解锁密码后应该用break跳出循环并终止程序运行。但Python并没有跳出多重循环的语句,如果要跳出多重循环,只能设置标志位然后不停进行判定。为了运行速度就略去了“跳出循环”这个步骤。(有没有更好的实现跳出多重循环的方法?)另外也略去了很多容错语句。
从破解目的来说,如果单单是忘记了自己的手机图形锁密码,完全可以用更简单的办法:ADB连接手机,然后“adb rm /data/system/gesture.key”删除掉gesture.key文件,此时图形锁就失效了,随意画一下就能解锁。但本文开篇假设的是“为了不被察觉地进入到别人的手机里”,所以就有了这篇文章。
最后提一个安全小建议:如果手机已root,还要用“XX手机助手”,还想设置图形锁的话——在手机“设置”选项里,有一个“锁定状态下取消USB调试模式”(这个名字因手机而异,而且有的有此选项,有的手机就没有),开启此功能之后,在手机锁定状态下就能够防范此类攻击了。此文技术原理很简单,还望各位大大传授些高大上的Python编程技巧。
篇一:忘记手机解锁图案该怎么办?
忘记
手机解锁图案该怎么办?
这个问题在android系统手机当中比较常见,图案解锁方式就是被它给带动流行起来的。现
在依旧有不少人偏爱这种图案解锁方式,毕竟这样的操控既新颖而且确实比数字密码解锁有
乐趣的多了。但是随着大量入门用户接触到这类智能手机并且使用这种解锁方式时,由于操
控不当就出现了不少问题,最常见的情况就是忘记了设定的解锁图案,结果导致手机无法解
锁使用。
【忘记手机解锁图案该怎么办】方法一:
比较常见的就是
google账号解锁,当你使用手机之前就注册了google账号并且在手机当中进行了账户添加
登陆,就算你忘记了解锁图案也可以通过输入google账号来解决此问题。不过由于大量的入
门用户才接触智能手机,虽然android系统火热但是用户对它还不太了解,很多人都没有
google账号,所以这个方法的普及程度并不是很理想。
【忘记手机解锁图
案该怎么办】方法二:
方法三:
当然如果你实在是
搞不明白弄不清楚,那么直接在网上下载相应的软件,然后按照教程步骤点击几下鼠标就可
以清除手机图案进行解锁了,这也不失为是一个傻瓜式的便捷办法。
忘记手机解锁图案,第三方软件可以轻松搞定
篇二:手机解锁图案忘记了怎么办
方法
/步骤 1对于锁屏图案的破解,我们也可以通过清除用户数据功能来实现。首先关闭手机,
同时将手机电池拆下,等待5秒钟后,再安装上。同时按住“音量+”和“电源键”不放。手
机就会自动进入recovery模式。
2在recovery模式
下,利用“音量+”和“音量-”将光标移动到“wipe data/factory reset”项,并按一下“电
源键”进行确认。 3在随后打开的“确认清除用户数据”界面中利用“音量+”和“音量-”
将光标移动到“yes,delete all user data”项,按一下“电源键”进行确认。 4当用户
数据清除完成后,程序会返回主界面,再次利用“音量+”和“音量-”将光标移动到“reboot
system now”项,按一下“电源键”进行确认。 5此时手机就会自动重启,重启完成后,就
会发现手机解锁密码被消除了,手机正常进入桌面。
篇三:华为手机图案解锁忘了怎么办
华为手机图案解锁忘了怎么办? 如果您忘记了荧幕解锁图形,您有五次机会可尝试将手机解
锁。如果仍失败,您还可以输入 google 账号的使用者名称及密码,将手机解锁。 1. 在解
锁画面上,您有五次机会可尝试输入解锁图形。 2. 出现要求等待 30 秒的提示时,点选确
定。 3. 如果画面此时关闭,请按下电源键,让画面重新出现,接着按下锁定画面上的控制
列,然后用手指在荧幕上向下滑动,将荧幕解锁。 4. 点选右下角的忘记解锁图形按钮 (出
现时)。 5. 输入您 google 账号的名称和密码,然后点选登入。 接着画面会提示您建立新
的荧幕解锁图形。如果您不想再使用荧幕解锁图形来保护手机,请点选取消 如果没激活谷歌
帐号的话 亲 还是刷机吧 不难的
篇四:三星手机忘记解锁图案
三星手机忘记解锁图案
1、你要把手机彻底
关机 2、同时按住手机中央的home键、电源键,当出现有三星开机画面时也不松开,然后
就可以进到初始画手机界面。
用音量键选择到第
三个选项 wipe data/factory reset (这个就是恢复出厂设置),按home键确认,接着转
到另一个屏幕,有no(有很多个no选项,不管)和yes -- delete all user(只有一个yes
-- delete all user选项,就是这个)英文选项,用音量键选择yes -- delete all user,
按home确认第三部,第二步按home
确认后,屏幕会转
到原来第一步操作时看到的选项,用音量键选择到第四个选项 wipe cache partition
( 这个是清除缓存的意思 ),之后你又会转到原来第一步操作时看到的选项。接着下面第四
步:第四步: 用音量键选择到第一选 reboot system now (就是重启系统的意思),这时
候手机就会自动重启
音量上+home+电源键同时按,出现字幕后松开电源键知道进入recovery,音量上下键选wipe
data,清除数据,不过酱紫手机上啥都没了。如果再wipe factory··就恢复出厂设置,应
用也没了。
Main_Acitivity.java
package com.example.lackpatternview;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.RelativeLayout;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout relativelayout = new RelativeLayout(this);
lackparrternview lackparrtern=new lackparrternview(this);
relativelayout.setBackgroundColor(TRIM_MEMORY_BACKGROUND); relativelayout.addView(lackparrtern);
setContentView(relativelayout);/*实例化*/
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu);【画图案解锁怎么画?】
return true;
}
}
Lackparrternview.java
package com.example.lackpatternview;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class lackparrternview extends View{
/**
* 图案解锁
* */
//选中点的数量【画图案解锁怎么画?】
private static final int POINT_SIZE=5;
//矩阵
private Matrix matrix=new Matrix();
//画笔
Paint paint =new Paint(Paint.ANTI_ALIAS_FLAG);
//9个点 private Point[][] points=new Point[3][3]; private float height,width,offsetX = 0,offsetY=0,bitmapR,movingX,movingY; private Bitmap pointnormal,pointpressed,pointerror,linepressed,lineerror; private boolean isInit,isSelect,isFinish,movingNopoint; //点的集合 private List<Point> Pointlist=new ArrayList<Point>(); public lackparrternview(Context context) { super(context); // TODO 自动生成的构造函数存根 }//构造函数 public lackparrternview(Context context, AttributeSet attrs) {
super(context, attrs); // TODO 自动生成的构造函数存根 }//构造函数 public lackparrternview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO 自动生成的构造函数存根 }//构造函数 @Override protected void onDraw(Canvas canvas){ if(!isInit){ InitPoints(); } //画点 points2Cancas(canvas); } //画线 if(Pointlist.size()>0){ Point a=Pointlist.get(0); for(int i=0;i<Pointlist.size();i++){ Point b=Pointlist.get(i); line2canvas(canvas,a,b); a=b; } } //绘制鼠标坐标点 if(movingNopoint){ line2canvas(canvas,a,new Point(movingX,movingY)); }
//将点绘制到画布上
private void points2Cancas(Canvas canvas){
for(int i=0;i<points.length;i++){
for(int j=0;j<points[i].length;j++){
Point point=points[i][j];
if(point.state==Point.STATE_ERROR){
canvas.drawBitmap(pointerror, point.x-bitmapR, point.y-bitmapR, paint); }
else if(point.state==Point.STATE_NORMAL){
canvas.drawBitmap(pointnormal, point.x-bitmapR, point.y-bitmapR, paint);
paint); } }
/**
} } else{ canvas.drawBitmap(pointpressed,point.x-bitmapR, } point.y-bitmapR, * 画线 * @param canvas 画布 * * */ private void line2canvas(Canvas canvas,Point a,Point b){ float linelength=(float) Point.distance(a, b); float degrees=getdegrees(a,b); canvas.rotate(degrees,a.x,a.y); if(a.state==Point.STATE_PRESSED){ matrix.setScale(linelength/linepressed.getWidth(), 1); matrix.postTranslate(a.x-linepressed.getWidth()/2, a.y-linepressed.getHeight()/2); canvas.drawBitmap(linepressed, matrix, paint); } else{ matrix.setScale(linelength/lineerror.getWidth(), 1); matrix.postTranslate(a.x-lineerror.getWidth()/2, a.y-lineerror.getHeight()/2); canvas.drawBitmap(lineerror, matrix, paint); } canvas.rotate(-degrees,a.x,a.y); } //初始化9个点 private void InitPoints(){ //1.获取布局宽高 width=getWidth(); height=getHeight(); //2.获取偏移量 //横屏 if(width>height){ offsetX=(width-height)/2; width=height; } //竖屏 else{
offsetY=(height-width)/2; height=width; } //3.图片资源 pointerror=BitmapFactory.decodeResource(getResources(),R.drawable.point_error); pointnormal=BitmapFactory.decodeResource(getResources(),R.drawable.point_normal); pointpressed=BitmapFactory.decodeResource(getResources(),R.drawable.point_pressed); linepressed=BitmapFactory.decodeResource(getResources(),R.drawable.line_pressed); lineerror =BitmapFactory.decodeResource(getResources(),R.drawable.line_error); //4.点的坐标 points[0][0]=new Point(offsetX + width/4,offsetY + width/4); points[0][1]=new Point(offsetX + width/2,offsetY + width/4); points[0][2]=new Point(offsetX + width - width/4,offsetY + width/4); points[1][0]=new Point(offsetX + width/4,offsetY + width/2); points[1][1]=new Point(offsetX + width/2,offsetY + width/2); points[1][2]=new Point(offsetX + width - width/4,offsetY + width/2); points[2][0]=new Point(offsetX + width/4,offsetY + width - width/4); points[2][1]=new Point(offsetX + width/2,offsetY + width - width/4); points[2][2]=new Point(offsetX + width - width/4,offsetY + width - width/4); //5.图片资源半径 bitmapR=pointnormal.getWidth()/2; //6.初始化完成 isInit=true; } public boolean onTouchEvent(MotionEvent event){ movingX = event.getX(); movingY = event.getY(); movingNopoint=false;//此点不可用 isFinish=false; Point point =null; switch(event.getAction()){ case MotionEvent.ACTION_DOWN: resetPoint(); point=checkSelectPoint();
上一篇:魔兽自己下的地图显示太大了怎么办
下一篇:火影忍者ol好听名字