90

移动样本之初学脱壳

 5 years ago
source link: http://www.10tiao.com/html/523/201807/2458290809/2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.


概况


本次分析的样本来自,ISCC竞赛(http://www.isclab.org.cn/)移动逆向的赛题,作为本人的练手之作。本次分析过程中,主要通过IDA调试Dump出dex文件,并且进行简单地代码阅读即可完成Capture Flag(拔旗)!



样本分析


样本信息




详细分析


1.由JEB,查看Manifest根据带

有"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"确定该activity为入口活动,由android:name确定入口类为"org.isclab.shh.protectapp.MainActivity"



图[1]:确定入口活动


2.根据jeb左侧列表未找到MainActivity类,隐藏入口类,确定该APP已经加固。



图[2]:类列表


3.根据APP应用的启动流程可以知道,dex文件最终会被加载进内存,所以思路就是,只要在载入内存前,找到并dump出来即可。这里因为测试机是Android4.4还在使用DVM虚拟机,所以只要找到libdvm.so下的dvmDexFileOpenPartial函数并下断点即可。


首先将IDA目录下的android_server文件push进/data/local下(只要让文件可执行就行),赋予权限chmod 777 /data/local/android_server,然后./data/local/android_server执行(为了让ida可以远程连接,需要手机ARM架构)



图[3]:android_server执行


4. 端口转发adb forward tcp:23946 tcp:23946,让手机中的23946端口映射到PC本地23946端口,用来IDA和手机通信连接(这里需要注意:一旦android_server断开了,重启后需要重新端口转发,要不然IDA连接不到手机的进程)


5. 执行adb shell am start –D –n com.example.protectapp/ org.isclab.shh.protectapp.MainActivity(包名/入口类),让需要脱壳的程序在开启入口活动前进入等待调试连接状态。



图[4]:程序等待调试状态


6.打开IDA,选择远程调试连接,然后输入127.0.0.1进行本地调试,并勾选这三个选项,然后Ctrl+F搜所相关字符串,选择需要调试的进程



图[5]:远程连接



图[6]:填写选项


图[7]:选择进程


7. 打开Android Device Monitor(android studio自带工具),必须选中需要调试的进程(这里注意一下,如果没有出现进程列表,尝试1.adb kill-server,2.adb start-server然后重新从执行android_server开始),然后adb 连接安卓应用,jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700



图[8]:选中需要调试的进程



图[9]:jdb连接程序


8.打开第6步填好选项的IDA,选择libdvm.so文件(modules模块下,也可以经过Debugger->Debugger windows->Modules List),双击进入,选择dvmDexFileOpenPartialPKviPP6DvmDex 函数并下断点



图[10] 选择so文件



图[11] 选择断点函数



图[12] F2下断点


9. F9运行,出现Add map…、Binary paths一路cancel(这是加载so文件,默认cancel自动加载就行),出现警告就点击ok,一旦暂停就继续F9运行,会出现三次Exception Handling..分别点击Yes->No->Yes即可,最后运行到断点函数(这里提一下:如果有反调试是不能运行到断点的,下别的断点,需要参考文章[1])



图[13] 选择cancel



图[14]  选择cancel



图[15] 



图[16] 出现异常Yes



图[17] 运行到断点函数加载位置


10. 编写.idc脚本,Shift+F2进入脚本执行界面,Import选择脚本文件,然后Run运行脚本,完成后Dump被隐藏的dex文件。(R0存放dex文件开始位置,R1是文件大小)



图[18] 导入脚本窗口


static main(void)

{
        auto fp,dex_addr,end_addr;

        fp = fopen("d: \\dump.dex","wb"); //dump出的dex文件存放位置

        end_addr=r0+r1;

        for(dex_addr=r0;dex_addr<end_addr;dex_addr++)

                  fputc(Byte(dex_addr),fp);

}


11. 将dex文件拖进jeb,从入口onCreate开始分析,找到判断flag正确与否的函数protectMethod,进入可以定位到flag



图[19] onCreate活动入口方法



图[20] Flag位置



总结


本次分析只是很基础的脱壳,过程中或有很多工具上的报错、异常,需要有一颗平静的心。面对各种异常,熟练使用百度、GOOGLE解决问题;本次报告的中心思想:不管你如何隐藏你的dex文件,只要应用可以正常开启,就始终会将dex加载进内存的,守住加载点,就可以成功脱壳。


参考文章

[1] https://blog.csdn.net/jiangwei0910410003/article/details/51620236




看雪ID:xiongcc    

bbs.pediy.com/user-229968


本文由看雪论坛 xiongcc  原创

转载请注明来自看雪社区







戳原文,立即看!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK