Android安卓破解之逆向分析SO常用的IDA分析技巧
2017-03-27 17:41
429 查看
转自:http://blog.csdn.net/asmcvc/article/details/51026030
参考:
网易云加密:http://apk.aq.163.com
网易云捕:http://crash.163.com
1、结构体的创建及导入,结构体指针等。
以JniNativeInterface, DexHeader为例。
解析Dex的函数如下:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/C77EFB0962DC499BB8EFE6D9F03DB629/version/187?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
F5后如下:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/B7D5FC6B8DB8472CB9E5AF08C7EF54D3/version/191?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
File->load file->parser c header file,导入Dex.h
上图中a1,右键转成结构体,选择dexheader,效果如下:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/FB89A67B39654BB99231E46526BC5008/version/199?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
2、函数指针时的参数个数调整,不定参数等。
以__android_log_print为例,选中该函数。
![](http://note.youdao.com/yws/api/group/17284160/noteresource/D5D88774A95E4AE4B1BF47C68262A18E/version/190?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
Edit->operand type-> set operand type,修改参数如下:
int (__cdecl *)(int, char *, char *, char *, int *, int *),F5刷新后,效果如下:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/91AAF0FA25C2448EAA0CC81A8A67DDEC/version/177?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
3、thumb/arm模式的转换
快捷键ALT +G,其中0x01是THUMB,0x00是ARM模式。一般4个字节ARM模式,两个字节为THUMB模式,如:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/B849FF916A5842CE8E28B83785B3E4A9/version/192?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
4、函数被误认为chunk,导致调用者函数多个入口。
以Java_by_Ericky_crackme01_JNI_EatRice为例,可以看到有两个入口。
![](http://note.youdao.com/yws/api/group/17284160/noteresource/A5BFD7E74C63475B908190CC7A602AF7/version/202?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
![](http://note.youdao.com/yws/api/group/17284160/noteresource/A8F2E2E943D84189918F79A700D691B9/version/200?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
来到第一个入口的结束位置为BX跳转指令, 应该让他跳转到第二个入口出,才正确。
![](http://note.youdao.com/yws/api/group/17284160/noteresource/18ABDFD9882045649B4C0A0C83F62928/version/176?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
所有首先要remove function tail,
选中,结尾处,然后edit->functions->remove function tail,效果:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/C189A1779ECE43888126CB0841511631/version/204?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
然后再将跳转指令BL,修改为Call,edit->others->force bl call,效果
![](http://note.youdao.com/yws/api/group/17284160/noteresource/8ED657C6E7A9438E9BD28843B11B7175/version/179?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
![](http://note.youdao.com/yws/api/group/17284160/noteresource/A5A372C9B8314E1F9BD537A38F9E0116/version/180?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
5、C++RTTI,类名识别。
来的 JNI_OnLoad处
![](http://note.youdao.com/yws/api/group/17284160/noteresource/DF6B096175C84663A37E64D4EE37CAA5/version/197?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
sub_A558为构造函数。
![](http://note.youdao.com/yws/api/group/17284160/noteresource/DE6A2ED20C4A4986BC5C9B2E2ACFEA2A/version/189?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
![](http://note.youdao.com/yws/api/group/17284160/noteresource/278DBACCD8B64E5499EEBDDFD3EAB4F9/version/175?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
可以得在该函数名为9ArtLoader,
![](http://note.youdao.com/yws/api/group/17284160/noteresource/98855076B05F43E3A53BDD2032AE5710/version/193?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
6、创建函数,设定函数结尾地址。
F5,效果如下:
![](http://note.youdao.com/yws/api/group/17284160/noteresource/141DA31DCB964D26B317940A860880C2/version/186?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
解决办法,按P,再F5。如果P没有效果,则可以选中后再按P。
7、Elf的修复,内存dump该so及其以来文件,然后修改dump出来的基址,File-->LoadFile-->binary file。
dump命令为:
dd if=/proc/1935/mem of=/sdcard/alimsc4 skip=1578049536 ibs=1 count=3993600
8、数据复制、patch。
选中数据,然后edit->export data,即可
![](http://note.youdao.com/yws/api/group/17284160/noteresource/ABF81DA179FA45A9B9BB65B75B64F4CD/version/184?method=get-resource&shareToken=FF3BEDF2C4744A9AB0E5170E185B767E&entryId=85673662)
9、脚本,idc,IDAPython
http://magiclantern.wikia.com/wiki/IDAPython/intro
http://drops.wooyun.org/tips/11849
http://drops.wooyun.org/tips/12060
10、lsof查看被删除的文件,cat从内存中得到被删除的文件
root@android:/ # lsof |busybox grep com.sxiaoao.car3d3
system_se 523 system 298 /data/app/com.sxiaoao.car3d3-2.apk
com.sxiao 10370 u0_a65 44 /data/data/com.sxiaoao.car3d3/files/app_sdk103700_.jar (deleted)
com.sxiao 10370 u0_a65 48 /data/app/com.sxiaoao.car3d3-2.apk
com.sxiao 10370 u0_a65 49 /data/app/com.sxiaoao.car3d3-2.apk
10370是进程号 44是打开文件的fd 文件fd映射在/prop/pid/fd里面
用cat命令把文件拷贝出来
1|root@android:/ # cat /proc/10370/fd/44 > /data/local/tmp/test.jar
11、arm指令模拟器
12、为什么不能F5, 不能全信F5
参考:
网易云加密:http://apk.aq.163.com
网易云捕:http://crash.163.com
1、结构体的创建及导入,结构体指针等。
以JniNativeInterface, DexHeader为例。
解析Dex的函数如下:
F5后如下:
File->load file->parser c header file,导入Dex.h
上图中a1,右键转成结构体,选择dexheader,效果如下:
2、函数指针时的参数个数调整,不定参数等。
以__android_log_print为例,选中该函数。
Edit->operand type-> set operand type,修改参数如下:
int (__cdecl *)(int, char *, char *, char *, int *, int *),F5刷新后,效果如下:
3、thumb/arm模式的转换
快捷键ALT +G,其中0x01是THUMB,0x00是ARM模式。一般4个字节ARM模式,两个字节为THUMB模式,如:
4、函数被误认为chunk,导致调用者函数多个入口。
以Java_by_Ericky_crackme01_JNI_EatRice为例,可以看到有两个入口。
来到第一个入口的结束位置为BX跳转指令, 应该让他跳转到第二个入口出,才正确。
所有首先要remove function tail,
选中,结尾处,然后edit->functions->remove function tail,效果:
然后再将跳转指令BL,修改为Call,edit->others->force bl call,效果
5、C++RTTI,类名识别。
来的 JNI_OnLoad处
sub_A558为构造函数。
可以得在该函数名为9ArtLoader,
6、创建函数,设定函数结尾地址。
F5,效果如下:
解决办法,按P,再F5。如果P没有效果,则可以选中后再按P。
7、Elf的修复,内存dump该so及其以来文件,然后修改dump出来的基址,File-->LoadFile-->binary file。
dump命令为:
dd if=/proc/1935/mem of=/sdcard/alimsc4 skip=1578049536 ibs=1 count=3993600
8、数据复制、patch。
选中数据,然后edit->export data,即可
9、脚本,idc,IDAPython
http://magiclantern.wikia.com/wiki/IDAPython/intro
http://drops.wooyun.org/tips/11849
http://drops.wooyun.org/tips/12060
10、lsof查看被删除的文件,cat从内存中得到被删除的文件
root@android:/ # lsof |busybox grep com.sxiaoao.car3d3
system_se 523 system 298 /data/app/com.sxiaoao.car3d3-2.apk
com.sxiao 10370 u0_a65 44 /data/data/com.sxiaoao.car3d3/files/app_sdk103700_.jar (deleted)
com.sxiao 10370 u0_a65 48 /data/app/com.sxiaoao.car3d3-2.apk
com.sxiao 10370 u0_a65 49 /data/app/com.sxiaoao.car3d3-2.apk
10370是进程号 44是打开文件的fd 文件fd映射在/prop/pid/fd里面
用cat命令把文件拷贝出来
1|root@android:/ # cat /proc/10370/fd/44 > /data/local/tmp/test.jar
11、arm指令模拟器
12、为什么不能F5, 不能全信F5
相关文章推荐
- Android安卓破解之逆向分析SO常用的IDA分析技巧
- Android安卓破解之逆向分析SO常用的IDA分析技巧
- Android逆向之旅---Android中分析某短视频的数据请求加密协议(IDA动态调试SO)第二篇
- Android逆向之旅---Android中分析抖音和火山小视频的数据请求加密协议(IDA动态调试SO)
- Android逆向之旅---Android中分析某拍短视频的数据请求加密协议(IDA动态调试SO)第二篇
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---Android中分析某手短视频的数据请求加密协议(IDA静态分析SO)第三篇
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---Android中分析某音短视频的数据请求加密协议(IDA动态调试SO)第一篇
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
- Android逆向之旅---Android中分析某短视频的数据请求加密协议(IDA静态分析SO)第三篇
- 安卓逆向学习笔记 (3)- 使用IDA Pro静态分析so文件
- 使用IDA逆向Android的.so动态库文件
- 【Android SDK程序逆向分析与破解系列】之二:Android可执行程序DEX分析(一)
- 无名安卓Android逆向数据分析培训视频教程