IDA 调试 Android 方法及简单的脱壳实现

admin 2023年5月18日09:41:46评论160 views字数 2374阅读7分54秒阅读模式
IDA 调试 Android 方法及简单的脱壳实现
IDA 调试 Android 方法及简单的脱壳实现

公众号:易锦课堂

点击右方领取,回复1即可领取安卓逆向教学大礼包一份。


领取



IDA 调试 Android 方法及简单的脱壳实现


来源丨csdn

整理丨阿星

注:如侵联删

IDA 调试 Android 方法及简单的脱壳实现

最近小编在csdn上看到一篇很不错的文章,刚好朋友们需要,小编就给摘录下来了,希望可以帮助到咱们刚学习安卓逆向的朋友们,这篇文章是关于IDA调试的方法很有用,大家可以多看看。


前置环境


JDK,IDA PRO,Android NDK,Android Killer,JEB,Root并开启开发者模式USB调试的手机


动态启动调试


Android Killer 反编译 x.apk,取出 classes.dex Dalvik文件,记录包名和启动类名。


IDA 调试 Android 方法及简单的脱壳实现


修改 AndroidManifest.xml 文件,在<application>标签里添加属性 android:debuggable="true"  这一步越早修改越好,防止忘记改。

可以查看一下AndroidManifest.xml 他们的对应关系,加深理解。


IDA 调试 Android 方法及简单的脱壳实现


用AndroidKiller 重新编译修改过的x_fix.apk。

adb install x_fix.apk 安装到手机
将 IDA 安装目录 dbgsrv 目录下的 android_server 文件拷入手机
adb push dbgsrvandroid_server /data/data/android_server
接着执行
adb shell chmod 655 /data/data/android_server添加可执行权限
adb shell /data/data/android_server 将其运行起来


IDA 调试 Android 方法及简单的脱壳实现


在实际环境中可能会遇到上图中的一些错误,图中也给出了解决方法。
需要额外说明的是,当 adb root 失败时,需要在手机中安装一下“超级adbd”打开应用选择启用超级adbd ,再执行adb root 就可以了。
运行后可以看到 Listening on port #23946 … 字样就说明 server 运行成功了,并且已经打开了手机端的 23946 端口等待接收命令。
为了方便PC端IDA 连接调试手机,可以在本机做端口转发。另起一个cmd,输入:
adb forward tcp:23946 tcp:23946

将之前保存出的 classes.dex 托入 IDA。在IDA菜单中选择 【Debugger】-> 【Debugger Options…】添加以下选项


IDA 调试 Android 方法及简单的脱壳实现


再点击 Set specific options,添加adb 路径及刚刚保存的包名和入口名,如图


IDA 调试 Android 方法及简单的脱壳实现


【Debugger】-> 【Process Options…】的配置如图


IDA 调试 Android 方法及简单的脱壳实现


接下来就可以按IDA上的启动键,启动手机端的APP进行调试了,如图


IDA 调试 Android 方法及简单的脱壳实现


你可以在【View】->【open subviews】->【functions】调出函数列表,再配合Android killer 或 JEB 分析的代码位置进行下断调试了。


动态附加调试

正常流程

IDA 调试 Android 方法及简单的脱壳实现


IDA 调试 Android 方法及简单的脱壳实现


在手机端运行程序后,按上图的步骤直接附加就可以了。

如果出现 Bogus or irresponsive remote server 的错误提示

修改 SELinux安全策略限制
adb shell su -c setenforce 0


再重新运行 android_server 重新转发,再试。

反调试/解密函数运行前进行动态调试

很多程序加入了反调试机制,或者是伪dex文件在程序运行时解密真正的dex文件以壳的方式保护APP。针对此两种方法可采用在程序运行前挂起程序,再用IDA挂载,在关键位置下断,来破解类此防护。
举一个网上的例子。
下载 ori.apk 按之前的操作记录包名等,加入Debug属性,安装到手机
运行调试启动命令
adb shell am start –D –n loading.androidmanual/loading.androidmanual.BeginningActivity
这时程序会被挂起,等待调试器接入。
用IDA 载入,调试选项如下


IDA 调试 Android 方法及简单的脱壳实现


加载时可记录一下该应用的pid 之后会用到,忘记记录也没关系,附加后在IDA 的输出log里可以找到pid的信息


IDA 调试 Android 方法及简单的脱壳实现


运行 adb forward tcp:7788 jdwp:977 命令,转发要调试的进程到端口7788(随便写),
运行 jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=7788 使用jdb 载入调试。
此时程序处于阻塞状态,没关系,返回IDA,在Modules窗口查找libdvm.so,双击进入Module: libdvm.so 窗口,查找_Z21dvmDexFileOpenPartialPKviPP6DvmDex 函数,双击定位过去,在函数头部下断。


IDA 调试 Android 方法及简单的脱壳实现


因为要Load Dex 文件都要经过此函数就像 LoadLibrary同样的道理。
接下来点击IDA继续运行程序就会在此断点断下来。


IDA 调试 Android 方法及简单的脱壳实现


R0 寄存器中的地址就是 Dex 的起始地址。点击旁边的回车图标跳转到相应的位置。在 View-PC 窗口中右键,选择Jump in a new hex window 可以更好的观察内存中的信息


IDA 调试 Android 方法及简单的脱壳实现


这就是壳中释放出来的程序真正的dex文件了。根据Dex 文件结构,我们知道从起始位置偏移0x20字节是这个文件的大小,在这里也就是 0x0FAEB4。有了起始位置和文件大小就可以Dump了。我们直接写IDA 的脚本来dump。【file】->【Script Command…】。输入以下代码:


IDA 调试 Android 方法及简单的脱壳实现

IDA 调试 Android 方法及简单的脱壳实现


Dex文件保存后就可以丢进JEB进行分析了……


如果是反调试机制,那么就从一开始加载的so文件入手进行分析。同样用IDA挂载起来

按照上面的步骤找到JNI_OnLoad函数并下断,F9运行起来后就可以跟踪分析了。

有问题或者不对的  记得反馈我


小编在下面放了很多干货,学习工具包,需要的同学朋友扫码领取哦,当然也有学习交流群,大家也可以在这里来一起讨论讨论!


QQ群:779719294


IDA 调试 Android 方法及简单的脱壳实现


原文始发于微信公众号(映山红coin安全团队):IDA 调试 Android 方法及简单的脱壳实现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月18日09:41:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   IDA 调试 Android 方法及简单的脱壳实现https://cn-sec.com/archives/1056432.html

发表评论

匿名网友 填写信息