IDA Pro动态调试APP中SO(详细版本)
- 内容介绍
- 文章标签
- 相关推荐
0x01 前言
一直想学习一下IDA PRO的动态调试,这样在逆向APP的时候,如果遇到突然的中断就可以一步一步调试,发现问题所在。但苦于模拟器坑太多,网上大多调试都只到jdb联通,至于后面的怎样定位到关键点,如何下断点,以及如何修改内存keypatch,大多都是零零散散的,写这篇文章也是首次进行动态调试SO成功,到关键点下断点,并修改相关内存指令得到想要的结果后的记录。笔者是小白入门,若本文有不正确的地方,欢迎大佬指正。
0x02 环境准备
- Pixel 2 真机一部(需要root后的真机,如果不是真机,则使用jdb的时候可能会报jdb错误)
- IDA PRO (逆向软件)
- Android Studio (需要使用到里面的monitor做转发,当然也可以自己转发)
- java 8 (java8 自带jdb,最新版本java没有jdb了,所以如果找不到jdb可以手动进行安装)
- Native开发的APP一个 (逆向对象)
0x03 IDA PRO连接调试应用
(1)在IDA Pro的安装路径dbgsrv目录下找到android_server (android_server需要用ida.exe连接,用于调试32位程序,android_server64需要用ida64.exe链接,用于调试64位程序,笔者的程序so需要用64位的ida调试,所以下面的将用ida64.exe和android_server64用作演示)
请添加图片描述1348×850 134 KB
(2)将android_server64放入真机的/data/local/tmp路径下并赋权,以root身份运行,运行命令即截图如下
adb push android_server /data/local/tmp
su
cd /data/local/tmp
chmod 755 android_server64
./android_server64
请添加图片描述949×590 47.4 KB(3)转发端口
adb forward tcp:23946 tcp:23946
请添加图片描述948×593 46.2 KB(4)启动monitor,启动要调试的应用(被调试应用的Androidmanifest.xml文件中需要有debuggable=“true”,或者手机的ro.debuggable=1即所有应用可调试,否则无法进入调试模式),输入命令后可以看到monitor中对应app的包名旁边有个红色的小虫子,而且手机商进入了等待调试界面。
adb shell am start -D -n com.example.nativeapp/com.example.nativeapp.MainActivity
请添加图片描述1704×743 130 KB(5)代开IDA PRO 32bit,进行附加进程
请添加图片描述1437×633 39.7 KB请添加图片描述1439×735 89.1 KB上一步点击ok后会弹出附加进程选择的框,里面有很多进程,可以用快捷键ctrl+F 进行搜索,然后选择自己要调试的进程,点击ok即可
请添加图片描述1440×898 71.9 KB出现以下界面表示IDA PRO已经连接上了,但是此时还无法调试,需要用jdb让程序继续运行
请添加图片描述1541×897 168 KB(6)打开DDMS查看端口号
请添加图片描述1121×707 52.1 KB(7)使用jdb进行附加,附加成功后可以看到ddms上的小虫会变成绿色
jdb -connect com.sun.jdi.SocketAttach:port=8600,hostname=localhost
请添加图片描述1379×713 104 KB如果报无法附加到VM,如下图,多半是用了模拟器,可以尝试下用真机。
请添加图片描述998×436 73.1 KB至此IDA PRO已经成功连接到调试应用了,可以开始进行应用的调试了。
0x04 IDA PRO动态调试SO
IDA连接上被调试应用后就可以开始调试了,可以按上方工具栏中的绿色按钮,或者快捷键F9,让程序继续执行,让APP继续运行起来。然后关注下方output窗口的输出,可以查看自己需要调试的SO是否被加载
请添加图片描述1541×897 190 KB比如运行到这儿,可以看到加载了我们app的so文件,如果我们需要在它运行前进行修改(例如绕过一些反调试,否则等函数运行起来后会自动终端我们的调试),那么此时就可以进入so,开始下断点,然后步调试。但是我们此次只需要修改程序运行时的返回结果,完全可以等他加载完后慢慢分析,所以我们可以不停的F9,直至程序全部加载完。
请添加图片描述1919×1054 533 KB当上方的按钮变为灰色时候,表示程序已经完全加载了,可以看到手机界面,app的主界面也被加载出来。
请添加图片描述1917×1049 354 KB现在我们可以边调试边运行程序了,比如我现在需要输入sn,点击提交,可以看到程序运行,返回failed。(在输入sn的时候,点击屏幕可能会没反应,这个时候可以回到ida界面看看运行按钮是否变为绿色,表示有程序运行,按下F9继续运行即可,然后就可以正常输入了)
请添加图片描述1921×1052 374 KB由于提交的逻辑写在SO里,所以我们要查看SO,并修改SO的逻辑,使得我们输入错误的SN也能返回SO。可以在IDA右边的侧边栏Moudles窗口找到进行搜索,找到我们需要分析的so
请添加图片描述1919×1052 404 KB双击SO,会弹出该函数的函数列表,可在函数列表中找到对应 逻辑的函数checkSN,双击后左侧会跳至对应的so文件部分
请添加图片描述1923×1053 479 KB可使用F5查看伪代码,原本这儿可以修改a1的类型为JNIEnv* ,函数可以更加直观,动态调试的时候没法,可以再开一个窗口静态分析SO,梳理逻辑,此处由于篇幅,就不作详细说明了。根据分析逻辑后,可以判断出,该函数的校验逻辑为判断输入的值是否等于123456,因此我们修改的点可以在判断这儿。
请添加图片描述1919×1051 332 KB光标点击==符号,然后按Tab键跳转到汇编语言,在CSET处用快捷键F2下断点,然后继续运行程序,程序会到断点处停住,此时可以F8单步调试,通过网上查询发现CSET的功能为: CSET W0, EQ ; if (cond == true) W0 = 1, else W0 = 0。(操作符如下:相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE))
请添加图片描述1919×1053 502 KB我们要将错误的返回为正确的,所以此处需要把相等,改为不等,点击下方HEX View窗口,右键把PC窗口的16进制同步过来准备修改
请添加图片描述1917×1053 532 KB同步后可以看到 CSET W0, EQ对应的16进制为E0179F1A,现在我们需要把它修改为 CSET W0, NE
请添加图片描述1917×1053 543 KB通过在线网页arm转化可查询到 CSET W0, NE的16进制码为E0079F1A
请添加图片描述1893×354 22.7 KB我们只需要修改第二组数17为07即可,单击Hex View窗口中对应的16进制数,按F2进入编辑模式,将17改为07后,按F2进行保存,即可看到对应的命令变为CSET W0, NE
请添加图片描述1918×1052 543 KB继续运行程序,即可看到,应用成功返回success
请添加图片描述1919×1052 481 KB
0x05 结语
IDA PRO动态调试还有很多内容,目前只是很简单的一部分,还在挖掘中…
网友解答:--【壹】--:
理论来说可以,都是反编译看资源看逻辑,然后打补丁
--【贰】--:
好详细的教程,感谢佬无私分享。是不是有skill可以直接用?
--【叁】--:
对了,大佬,可以不用真手机吗?直接用模拟机可以吗?。◕‿◕。
--【肆】--:
可以用模拟机,但是模拟机会有很多问题,如果能解决也还行,所以如果是入门的话建议真机,省事
--【伍】--:
用的比较多的还是9.3,现在加上mcp已经可以完成大部分需求
--【陆】--:
对 ida pro 版本有要求吗,我还是9.0,快一年没用过了
--【柒】--:
大佬厉害,mark,学习一下,一直没有深入研究这个
--【捌】--:
现在应该有各种各样的skill出来了,不过在哪儿找是个问题
--【玖】--:
你可以这样,你把你发的教程直接扔给ai你可以这样,你把你发的教程直接扔给ai让他制作技能
--【拾】--:
这个没有,新版本只是会有新功能而已,现在这么快么,已经到9.0了么…,我用7.7的时候已经能初步接入AI逆向函数了,现在是不是更方便了…
--【拾壹】--:
佬是mac吗,我最近也在试一试app逆向学习
--【拾贰】--:
正好最近可能要重回逆向了,回头试试,之前汇编实在看得难受
--【拾叁】--:
我也是mac,不过一般我会起一个kali虚拟机,在里面搞
--【拾肆】--:
谢谢大佬这个教程是不是反编译动态调试可以调试游戏呢
。◕‿◕。
0x01 前言
一直想学习一下IDA PRO的动态调试,这样在逆向APP的时候,如果遇到突然的中断就可以一步一步调试,发现问题所在。但苦于模拟器坑太多,网上大多调试都只到jdb联通,至于后面的怎样定位到关键点,如何下断点,以及如何修改内存keypatch,大多都是零零散散的,写这篇文章也是首次进行动态调试SO成功,到关键点下断点,并修改相关内存指令得到想要的结果后的记录。笔者是小白入门,若本文有不正确的地方,欢迎大佬指正。
0x02 环境准备
- Pixel 2 真机一部(需要root后的真机,如果不是真机,则使用jdb的时候可能会报jdb错误)
- IDA PRO (逆向软件)
- Android Studio (需要使用到里面的monitor做转发,当然也可以自己转发)
- java 8 (java8 自带jdb,最新版本java没有jdb了,所以如果找不到jdb可以手动进行安装)
- Native开发的APP一个 (逆向对象)
0x03 IDA PRO连接调试应用
(1)在IDA Pro的安装路径dbgsrv目录下找到android_server (android_server需要用ida.exe连接,用于调试32位程序,android_server64需要用ida64.exe链接,用于调试64位程序,笔者的程序so需要用64位的ida调试,所以下面的将用ida64.exe和android_server64用作演示)
请添加图片描述1348×850 134 KB
(2)将android_server64放入真机的/data/local/tmp路径下并赋权,以root身份运行,运行命令即截图如下
adb push android_server /data/local/tmp
su
cd /data/local/tmp
chmod 755 android_server64
./android_server64
请添加图片描述949×590 47.4 KB(3)转发端口
adb forward tcp:23946 tcp:23946
请添加图片描述948×593 46.2 KB(4)启动monitor,启动要调试的应用(被调试应用的Androidmanifest.xml文件中需要有debuggable=“true”,或者手机的ro.debuggable=1即所有应用可调试,否则无法进入调试模式),输入命令后可以看到monitor中对应app的包名旁边有个红色的小虫子,而且手机商进入了等待调试界面。
adb shell am start -D -n com.example.nativeapp/com.example.nativeapp.MainActivity
请添加图片描述1704×743 130 KB(5)代开IDA PRO 32bit,进行附加进程
请添加图片描述1437×633 39.7 KB请添加图片描述1439×735 89.1 KB上一步点击ok后会弹出附加进程选择的框,里面有很多进程,可以用快捷键ctrl+F 进行搜索,然后选择自己要调试的进程,点击ok即可
请添加图片描述1440×898 71.9 KB出现以下界面表示IDA PRO已经连接上了,但是此时还无法调试,需要用jdb让程序继续运行
请添加图片描述1541×897 168 KB(6)打开DDMS查看端口号
请添加图片描述1121×707 52.1 KB(7)使用jdb进行附加,附加成功后可以看到ddms上的小虫会变成绿色
jdb -connect com.sun.jdi.SocketAttach:port=8600,hostname=localhost
请添加图片描述1379×713 104 KB如果报无法附加到VM,如下图,多半是用了模拟器,可以尝试下用真机。
请添加图片描述998×436 73.1 KB至此IDA PRO已经成功连接到调试应用了,可以开始进行应用的调试了。
0x04 IDA PRO动态调试SO
IDA连接上被调试应用后就可以开始调试了,可以按上方工具栏中的绿色按钮,或者快捷键F9,让程序继续执行,让APP继续运行起来。然后关注下方output窗口的输出,可以查看自己需要调试的SO是否被加载
请添加图片描述1541×897 190 KB比如运行到这儿,可以看到加载了我们app的so文件,如果我们需要在它运行前进行修改(例如绕过一些反调试,否则等函数运行起来后会自动终端我们的调试),那么此时就可以进入so,开始下断点,然后步调试。但是我们此次只需要修改程序运行时的返回结果,完全可以等他加载完后慢慢分析,所以我们可以不停的F9,直至程序全部加载完。
请添加图片描述1919×1054 533 KB当上方的按钮变为灰色时候,表示程序已经完全加载了,可以看到手机界面,app的主界面也被加载出来。
请添加图片描述1917×1049 354 KB现在我们可以边调试边运行程序了,比如我现在需要输入sn,点击提交,可以看到程序运行,返回failed。(在输入sn的时候,点击屏幕可能会没反应,这个时候可以回到ida界面看看运行按钮是否变为绿色,表示有程序运行,按下F9继续运行即可,然后就可以正常输入了)
请添加图片描述1921×1052 374 KB由于提交的逻辑写在SO里,所以我们要查看SO,并修改SO的逻辑,使得我们输入错误的SN也能返回SO。可以在IDA右边的侧边栏Moudles窗口找到进行搜索,找到我们需要分析的so
请添加图片描述1919×1052 404 KB双击SO,会弹出该函数的函数列表,可在函数列表中找到对应 逻辑的函数checkSN,双击后左侧会跳至对应的so文件部分
请添加图片描述1923×1053 479 KB可使用F5查看伪代码,原本这儿可以修改a1的类型为JNIEnv* ,函数可以更加直观,动态调试的时候没法,可以再开一个窗口静态分析SO,梳理逻辑,此处由于篇幅,就不作详细说明了。根据分析逻辑后,可以判断出,该函数的校验逻辑为判断输入的值是否等于123456,因此我们修改的点可以在判断这儿。
请添加图片描述1919×1051 332 KB光标点击==符号,然后按Tab键跳转到汇编语言,在CSET处用快捷键F2下断点,然后继续运行程序,程序会到断点处停住,此时可以F8单步调试,通过网上查询发现CSET的功能为: CSET W0, EQ ; if (cond == true) W0 = 1, else W0 = 0。(操作符如下:相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE))
请添加图片描述1919×1053 502 KB我们要将错误的返回为正确的,所以此处需要把相等,改为不等,点击下方HEX View窗口,右键把PC窗口的16进制同步过来准备修改
请添加图片描述1917×1053 532 KB同步后可以看到 CSET W0, EQ对应的16进制为E0179F1A,现在我们需要把它修改为 CSET W0, NE
请添加图片描述1917×1053 543 KB通过在线网页arm转化可查询到 CSET W0, NE的16进制码为E0079F1A
请添加图片描述1893×354 22.7 KB我们只需要修改第二组数17为07即可,单击Hex View窗口中对应的16进制数,按F2进入编辑模式,将17改为07后,按F2进行保存,即可看到对应的命令变为CSET W0, NE
请添加图片描述1918×1052 543 KB继续运行程序,即可看到,应用成功返回success
请添加图片描述1919×1052 481 KB
0x05 结语
IDA PRO动态调试还有很多内容,目前只是很简单的一部分,还在挖掘中…
网友解答:--【壹】--:
理论来说可以,都是反编译看资源看逻辑,然后打补丁
--【贰】--:
好详细的教程,感谢佬无私分享。是不是有skill可以直接用?
--【叁】--:
对了,大佬,可以不用真手机吗?直接用模拟机可以吗?。◕‿◕。
--【肆】--:
可以用模拟机,但是模拟机会有很多问题,如果能解决也还行,所以如果是入门的话建议真机,省事
--【伍】--:
用的比较多的还是9.3,现在加上mcp已经可以完成大部分需求
--【陆】--:
对 ida pro 版本有要求吗,我还是9.0,快一年没用过了
--【柒】--:
大佬厉害,mark,学习一下,一直没有深入研究这个
--【捌】--:
现在应该有各种各样的skill出来了,不过在哪儿找是个问题
--【玖】--:
你可以这样,你把你发的教程直接扔给ai你可以这样,你把你发的教程直接扔给ai让他制作技能
--【拾】--:
这个没有,新版本只是会有新功能而已,现在这么快么,已经到9.0了么…,我用7.7的时候已经能初步接入AI逆向函数了,现在是不是更方便了…
--【拾壹】--:
佬是mac吗,我最近也在试一试app逆向学习
--【拾贰】--:
正好最近可能要重回逆向了,回头试试,之前汇编实在看得难受
--【拾叁】--:
我也是mac,不过一般我会起一个kali虚拟机,在里面搞
--【拾肆】--:
谢谢大佬这个教程是不是反编译动态调试可以调试游戏呢
。◕‿◕。

