手动脱壳步骤较多,时间久了容易忘记,遂将一次完整脱壳步骤记录于此。

1.工具准备

IDA6.6  android_server  adb jdb等

2.运行android_server

用adb连上真机,运行android_server。

打开android_server后,它会默认在手机端监听23946端口。

3.设置端口转发

这个转发的意思是将主机tcp端口号23946的所有通信数据转发至手机的23946端口。

4.查看应用的主activity

可以通过固件工具箱在手机上直接查看,也可以用apktool反编译出manifest,在manifest文件第一行即是包名,然后通过activity标签定位到主activity,接下来用am start启动主activity:

这时手机会停在waiting for debugger状态。

5.IDA附加

打开IDA,Debugger->Attach->Remote ArmLinux/Android debugger,然后在Hostname中添127.0.0.1,点击Debug Option,勾选上suspend on thread start/exit 以及 suspend on library load/unload:

ida

然后点击OK。接下来在出现的进程界面中找到要附加的进程,记住进程前面的ID号:

ida00

这时先别点OK,做完下一步jdwp端口转发后再确定!

6.jdwp端口转发

接下来还要做一个端口转发:

其中xxxx可以为任意端口号(不能占用已有的,最好选大一些),yyyy即是上面记下的进程ID号。

7.在dvmDexFileOpenPartial函数下断

然后会默认断在libc.so,这时候我们要找到dvmDexFileOpenPartial这个函数,然后在其入口下断(原因见:从源码中跟踪Dex的加载流程)。具体如下:Debugger -> Debugger window -> Module list,找到libdvm.so模块:

ida22

然后在这个模块中搜索dvmDexFileOpenPartial,具体函数名可以有一些差别:

ida33

接下来就是在这个函数的入口点下断:

ida44

8.jdb连接

用jdb连接进程:

这里端口号要和第六步中的xxxx端口一致。执行完命令后在IDA中点运行,然后OK(add map),OK,cancel(binary path),就会断在函数入口。

注意:如果报“handshake failed”错误的话,可以直接跳过第六步的端口转发,而在jdb连接时用8700端口:

ida55

9.dump出dex

这时看寄存器的值:

ida66

R0就是这个Dex的起始地址,R1是这个Dex的长度。用一段python脚本dump出dex:

保存这段脚本,然后在IDA中打开,跟着提示输入起始偏移(R0)和总长度(R1)即可dump出dex。用jeb直接打开这个Dex:

ida77

至此,完成所有脱壳工作,接下来就是crack了。

 

观看更多有关 的文章?

*

+
跳转到评论