[原创]使用IDA调试SO脱壳,环境准备及各步骤原理详解
发表于:
2017-10-21 10:58
14753
[原创]使用IDA调试SO脱壳,环境准备及各步骤原理详解
最近在捣鼓移动端的脱壳,虽然目前这方面的教程有挺多的了,但还是走了很多弯路,现在希望把这些内容记录下来帮助有需要的人
首先请准备一台手机,这台手机需满足以下三个条件:
首先解释为什么要是真机,因为模拟器经常会遇见各种各样的问题(亲测)导致有些步骤进行不下去。 关于第二点,因为目前网上能找到的教程都是几年前的,那个时候的安卓系统仍然是用着dvm虚拟机,加载so文件用到的库是libdvm,而5.0以上的系统已经统一使用ART进行加载了,所以如果你用5.0以上系统照着原来的教程做,就会发现做了一半就跟不下去了。再一个就是移动端的壳发展到现在已经更迭了好几代了,一代比一代难脱,要入门最好还是从第一代开始脱。 至于第三点的话,自然就是因为准备环境时需要往手机根目录下放一些文件,或是安装xposed框架。
程序的话,自然是要找一个已经加了壳的应用,且这个应用本身不会太复杂,以防反编译的时候出现一些奇奇怪怪的问题。 关于这点,参考这篇文章: https://www.v2ex.com/t/298813 这个链接里有目前几款主流加壳应用的官网地址,在其官网里一般都会有介绍哪些APP使用了他们家的壳,我在其中找到了计算管家 这款看起来就很简单的软件。 接下来就是要找到这款软件几年前的版本,在这里可以用PP助手或是安智市场,这两个应用商店都可以下到历史版本的APP。 在这里我使用了在安智下载的计算管家 3.1.1版本的APP
找到IDA的根目录,进入dbgsrv的子目录下,可以看见有一个名为android_server 的文件,这个就是要使用IDA调试so文件所需要的程序。你想啊,我在电脑上怎么才能调试手机上的程序呢?一个方案当然是我在手机上弄一个调试器,但手机屏幕这么小,根本不方便调试,那么最好就是我在手机上这个调试器只提供调试功能,而把操作界面放到电脑上来,而android_server 这个文件就是起到这个作用了。 接下来我们需要把这个文件弄到手机根目录下去。在这里我们可以在手机上下个RE管理器或者ES文件管理器(可能有人会说直接用adb push,但是有些机子,即使已经root了,也会因为各种各样的权限问题导致传不下去),先把文件通过数据线转到手机内置或外置存储卡上,然后使用上述APP将根目录挂载为可读写,然后将这个文件复制过去。在这里你可以任意更改这个文件的名字,也可以放在任意地方(网上有的说放在/data下,有的放在/data/local/tmp下,其实位置并不是固定的),我为了方便运行这个程序,直接放在了根目录下,改名为as,然后通过adb shell将这个文件权限改为777。
为了使用jdb恢复程序的运行,我们需要: APK的AndroidManifest.xml中debuggable为true 或是根目录下的 ro.debuggable的值为1,如下图所示: 关于这一步怎么做,参考这篇文章: http://blog.csdn.net/feibabeibei_beibei/article/details/52744231 文章中提到了4种方法,其中第二种因为壳没脱下来,没办法回编译,更改不了,第三种太麻烦。就只剩下第一种和第四种。 第一种需要安装第xposed,有的手机可能安装不了这个。 就剩下第4种,这种方法因为某种原因也不能在我手机上正确运行,所幸我找到了mprop这个软件的最新版: https://bbs.pediy.com/thread-215311.htm 第4种方法因为是修改内存,所以default.prop中的值仍然是原来的,而且重启后要重新运行一次。
打开手机的usb调试,连接上数据线,在电脑上的cmd里运行adb shell,有的人可能运行不成功,有可能是因为adb被占用的原因(我曾经因为使用了酷狗,一直被它自己的音乐传输后台程序给占用着),进入到shell后,输入su获取root获取,然后./as运行android_server,这里最好用su切换root权限后再运行,以防出现权限不够的情况。 在这里可以看到它在监听端口23946,等着别人来连接它。
上一步里android_server在监听端口23946,我们可以用adb forward tcp:23946 tcp:23946这个命令将pc端的23946端口转到手机端的23946,这样ida附加调试的时的地址就只需要填127.0.0.1,即本机地址了。 实际上这一步并不是必要的,只不过如果省略的话,ida附加时要填上手机的IP,这样会比较麻烦。
使用AndroidKiller打开APK文件进行反编译,可以看到 文件的包名和入口 在命令行里输入如下命令,以调试模式启动APP:
命令最末尾那个就是我们APP对应的包名/入口 ,其他部分不能修改。
打开一个空的IDA,选择debugger->attach->Remote ARMLinux/Android debugger,然后在选择debug options里选择suspen on process entry point,使其断在程序入口点,这里如果进行了端口转发在hostname里填上127.0.0.1,如果没有,就填上手机的IP地址,点击确定之后找到对应的程序,加载。
这一步也不是必要的,DDMS原本是ecplipse上的一个插件,如果你用的是android studio,可以用tools->Android->Android Device Monitor打开它。可以看见,我们要调试的程序出现在了这里(如果没有是因为ro.debuggable没有设置成功), 待调试的程序前面有一个红色的虫子,条目的最后也多了个/8700,这里就是DDMS帮我们进行了端口转发,如果没有打开DDMS,则要自己进行端口转发
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-1-11 19:38
被kanxue编辑
,原因: