IDA 动态调试 android so

本文详细介绍了如何使用IDAPro对没有源代码的Android应用so文件进行逆向工程,包括设置JNI接口、配置调试环境、端口转发、调试模式启动和单步调试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇介绍

使用 IDA 可以单步调试 so,即使没有源代码也没关系,这样就可以逆向目标应用的so,分析内部逻辑,本篇就介绍下如何操作。

ida debug so

首先得准备一个android app,带jni的。我这边用了一个加法的例子,jni 代码如下:

extern "C"
JNIEXPORT jint JNICALL
Java_com_example_idadebugdemo_MainActivity_addResultFromJNI(JNIEnv *env, jobject thiz, jint first,
                                                            jint second) {
    // TODO: implement addResultFromJNI()
    return first + second;
}

写完后的界面如下:

接下来就开始调试了:
运行 android server,从IDA_Pro_7.7\dbgsrv下拷贝对应的二进制到手机/data/local/tmp目录下,目前大部分Android手机都是64位的,选择android_server64就可以了,然后给一个执行权限

flame:/data/local/tmp # ./android_server64
IDA Android 64-bit remote debug server(ST) v7.7.27. Hex-Rays (c) 2004-2022                           
Listening on 0.0.0.0:23946...               

接下来在pc端配置下端口转发,这样pc端才可以和手机正常通信

adb forward tcp:22222 tcp:23946

占用的电脑端口就是22222,在配置ida的时候也用这个端口就好了。

接下来以调试模式启动目标应用:

adb shell am start -D -n  com.example.idadebugdemo/com.example.idadebugdemo.MainActivity

这时候手机就会出现一个弹窗:

接下来就是配置ida了,用ida 把so 加载进去后,配置下debugger:

接下来继续设置bugger,将Events中的3个suspend选上,这样即使目标应用有反逆向手段也可以在调试中绕过去。

接下来再配置下端口:

然后attach 目标应用:

接下来指令就会停止到一条svc 指令上:

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

图片

接下来设置下jdwp调试端口:

E:\02documents\01projects\01cpp\zego>adb shell
flame:/ # ps -ef |grep ida
radio          1133      1 0 15:45:29 ?     00:00:00 imsqmidaemon
u0_a141        2197    903 0 15:45:34 ?     00:00:00 .qtidataservices
u0_a144        2341    903 0 15:45:34 ?     00:00:00 .qtidataservices
u0_a142        2587    903 0 15:45:34 ?     00:00:00 .qtidataservices
u0_a3         27700    903 0 14:37:39 ?     00:00:00 com.example.idadebugdemo
root          27842  27838 0 14:50:02 pts/1 00:00:00 grep ida

adb forward tcp:8700 jdwp:27700 

继续建立jdb链接:

jdb -connect "com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700"

接着就可以点F9运行了。当应用开始加载到目标so后,就会出现一个弹窗

这时候就根据实际情况选择就好,最好是搞成一样的so,这样调试起来会方便一些。

接下来就可以找目标地址打断点了,当然也可以提前打断点:

接下来就可以触发app逻辑了:

这时候就命中断点了:

接下来就可以单独调试了,甚至通过修改寄存器值修改代码逻辑,接下来就试试:

我们输入的是 1 +1,寄存器w8,w9的值已经加载成对应的值了,接下来我们都修改成2:

继续运行看看:

这样就完成单步调试和修改逻辑了。

### IDA Pro 动态调试窗口介绍 #### 调试控制面板 在启动调试会话之后,最常用的界面之一是调试控制面板。此面板提供了对当前进程状态的基本操作按钮,如暂停、继续执行、单步步入、单步步过等功能[^1]。 #### 寄存器视图 寄存器视图展示了CPU内部各个寄存器的状态,在ARM架构下尤其重要的是PC(程序计数器)、LR(链接寄存器)等特殊寄存器的内容变化情况。这对于理解函数调用关系非常有帮助[^2]。 #### 堆栈窗口 堆栈窗口用于查看当前线程的调用链路以及局部变量的信息。当遇到复杂的应用逻辑时,通过观察堆栈可以更好地追踪到具体发生异常的位置。 #### 反汇编窗口 反汇编窗口是最核心的部分,它将二进制指令转换成人类可读的形式展示出来。对于Android应用来说,这里不仅能看到native层代码对应的汇编指令,还能看到Java字节码被翻译后的伪汇编码。 #### 数据窗口 数据窗口允许用户监视特定内存地址范围内的数值变动状况。这有助于分析应用程序如何处理和存储数据,尤其是在逆向工程过程中寻找关键算法实现细节方面具有重要作用。 #### Modules窗口 Modules窗口列出了加载到目标进程中所有的模块(DLLs, .so files),但在某些情况下可能因为保护机制而未能正确显示所有项。如果发现缺少预期中的`.dex`或`.so`文件,则可能是由于加壳或其他形式的安全措施所致。 ```bash adb shell am start -D -n 包名/主Activity ``` 上述命令可用于以调试模式启动指定的应用程序实例,以便于后续连接IDA进行深入研究。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值