欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]移动样本之初学脱壳

[原创]移动样本之初学脱壳

概况

本次分析的样本来自,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);

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功