记一个弱锁机样本分析
本帖最后由 世事繁华皆成空 于 2015-11-21 18:59 编辑样本地址:http://www.52pojie.cn/thread-436767-1-1.html
下载这个样本花了我不少时间,楼主传的是苏宁云盘,试了n次才访问成功
0x0 样本结构
下载下来后第一时间以压缩包形式打开APP,发现程序结构很简单,没有so库,没有加壳,那就非常简单了
0x1 安装
我这里使用的模拟器,安装成功后,软件直接开始申请root权限,赋予权限后机子被锁,并有提示信息
0X2 分析
直接拉到Jeb中,反编译后发现代码文件并不多,看到一个广播,一个服务类
作为一个开发者,我们经常会使用广播和服务来执行一些后台操作或者是自启等等
来到主活动下的oncreate方法处,看到直接开启了service服务,我们来到service文件下
看到当服务被开启后,调用了主活动下的一个方法,我们观察一下那个方法
这里就是申请root权限的地方,当用户赋予权限后,即执行oncreateView方法
这里调用的系统的getSystemService("window"),获取到了windowsManager管理类
下面的lp即为WindowManager.LayoutParams,看到程序给lp定义了一些属性,首先是type,我们搜索下资料
系统窗口。非应用程序创建。
public static final int FIRST_SYSTEM_WINDOW = 2000;
当type为2000时即为系统的置顶窗口
系统内部错误提示,显示于所有内容之上。
public static final int TYPE_SYSTEM_ERROR =FIRST_SYSTEM_WINDOW +10;
接下来分析flags,1280这个值看上去很奇怪,在源码中也没有看到明确的定义,1280对应的16进制是0x500,初步判断是几个值的相加结果,首先想到的就是0x100,和0x400
那这两个值分别对应的就是全屏以及:
窗口占满整个屏幕,忽略周围的装饰边框(例如状态栏)。此窗口需考虑到装饰边框的内容。
public static final int FLAG_LAYOUT_IN_SCREEN =0x00000100;
那我们就知道了锁屏的原理,利用type和flags属性使得这个窗口被系统置顶并且忽略了所有的系统按钮,包括状态栏和返回键,等等
并且给广播设置了开机自启,每当系统启动时,都会发送一个boot completed的广播,当程序接收到后就会开启,即达到他说有的重启也无效
0x3 找寻解密方法
这个样本默认就给我们提供了一个突破口,他给我们了一个密码,判定真正的解锁码就是根据此码来生成的,由此追溯
在子线程中我们看到了调用了s方法,传入了6,生成了sj值,并将其中的0全部替换成6,我们看下s方法
很简单,一个随机数而已,并根据这个随机数进行一些处理,再替换之后就成了锁屏界面中的那个密码
这里就是锁屏界面那个按钮的功能,如果密码正确则结束自身,否则提示信息,我们看下错误信息是怎么存储的
v0.this$0.tv2.setText(g.e(j.h()));
追溯到j.h方法中
这里存储了一个加密后的字符串,就知道g.e方法就是解密方法
对密文进行4次base64解密,即为提示的错误信息
我们看到上面进行的判断处,当Edittext中的值等于js变量中的值时即为正确答案
js的值是通过 service.this.js = service.this.b(service.this.sj); 生成的,即找到b方法即可
public String b(String arg8) {
return String.valueOf((Integer.parseInt(arg8) - 100) * 3);
}
这一串就是解锁码的生成方法了,不知道为什么这么简单
解锁成功后直接卸载原程序就行了
最后附上解锁工具,直接算出解锁码
大牛你好,再见 空空出品,必为精品~ 大牛,求教怎么逆向APK。。论坛置顶的图文看不懂 请问下论坛哪儿有Android的逆向工具。 膜拜一下繁华大牛,密码的算法好简单。。。。为何P叔给了一个违规呢@Peace 我看到了违规+1?{:301_988:} 介个好啊{:301_986:} 大哥,你的这个解锁工具,怎么打开运行? 大牛果然厉害的。。。。