ACat_
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

本篇文章主要针对AliCrackm.apk程序逆向分析实战进行了描述,也是针对Android逆向中的动态调试以及反反调试技术的一个练习和实战。
打开程序,输入验证码提交后提示校验失败,
利用jadx_gui打开,代码逻辑为输入验证码传入so库,校验成功加载ResultActivity,否则弹出验证码校验失败,
将apk文件后缀修改为zip,解压后将lib下的so文件拖入IDA分析,
先看Java_com_yatong_crackme_MainActivity_securityCheck,
查看代码逻辑上边两个if循环中byte_6359和byte_635A,没有什么重要的逻辑,下边GetStringUTFChars将string类型转换为char,将返回值给v5,下边是off_628C的返回值给v6和一个while循环,
查看代码逻辑上边两个if循环中byte_6359和byte_635A,没有什么重要的逻辑,下边GetStringUTFChars将string类型转换为char,将返回值给v5,下边是off_628C的返回值给v6和一个while循环,
发现字符串“aWojiushidaan”,提交测试发现不是答案,对while分析发现是一死循环,因此初步判断可能off_628C可能是验证码校验逻辑,查看地址为12A4,
该静态注册分析完发现还有一个JNI_Onload动态注册,继续分析,
可以看到一个if循环,下边有sub_16A4和sub_17F4两个函数,继续分析sub_17F4,
可以看出一些字段都进行了加密,无法看出其中内容,继续查看sub_16A4,发现分别有sub_130C和dword_62B0,进行查看也进行加密,
因为该动态注册中的字段都进行了加密,无法查看,因此可能程序运行后会进行解密,接下来考虑动态调试。
因为要动态调试,因此利用AndroidKiller打开apk,在AndroidManifest.xml中添加android:debuggable="true",然后进行重新编译,这个时候就支持调试了,
安装重新编译后的apk,
将IDA中的android_server push到模拟器上,
adb连接模拟器,并切换root账号,
进入/data/loacal/tmp下给android_server修改权限,
运行android_server,
端口转发,并挂起该程序,
打开IDA,Attach该程序,
点击ok,
选择该程序包名,点击ok,加载完成后勾选对应的选项,
F9运行,并加载该程序,
Module list查看加载so库,
Libcrackme.so加载完成,选择静态注册调试,
F9进行运行程序,
程序崩溃,那么可以判断该程序有反调试,可以判断JNI_Onload则为反调试代码逻辑,
选择JNI_Onload进行加载,
在JNI_Onload处下断点,
F9运行到该断点处F8向下执行,在静态分析时可以判断处有个if循环跳转,因此当向下执行到BLX R0时则F7进入,看一下内部的代码逻辑,
数据窗口跟随R0,
F8单步向下执行,可以看到dlsym以及getpid,因此可以判断是对字段进行解密,
继续向下,可以看到创建线程以及杀死进程一些列字段,那么这边便可以判断该so库代码该so库中是一个检测程序是否被调试,如果调试则中断程序的作用,
再向下便跳出了给函数,
至此该if循环代码分析完成,
继续向下可以看到sub_16A4和sub_17F4,
那么在动态调试窗口向下翻便可以看到sub_AB85B7F4,因此BLX和BL对应静态分析中的sub_16A4和sub_17F4,那么在BLX R7下断点,
将程序执行到该断点处,
进入其内部代码逻辑,可以看到sub_AB85B6A4和loc_AB85B6B8,
那便是静态分析中对应的sub_130C和dword_62B0,
通过调试验证该loc_AB85B6B8中的BL便是不断的执行进程检测调试的关键,
因此将该BL处直接NOP掉,
F2修改完成之后继续进入静态注册进行校验逻辑调试,
进入后P一下代码逻辑,
通过之前的静态分析判断处该校验逻辑在B2A4处,那么在该地址上一处下断,
F9运行到该断点,程序启动,随意输入一串字符,进行验证,
F8单步向下执行,
单步过之后进入可以看到将值给了R2,因此进入R2查看数据,看到一串字符aiyou,bucuoo,
在程序输入验证,
程序校验成功,成功获取到flag,至此针对该app的逆向分析就完成了,在本次分析中涉及 到smali代码的分析、so层代码的静态分析、IDA的动态调试以及反调试等方面的知识,也是对多方面知识的一个练习和 实战巩固。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)