ida动态调试APK的so文件

一个apk分为两层,java层和so层,一般的重要的算法都会放在so层为了效率和安全,所以用一道简单的题目来学习ida对so文件的调试。

题目来源:攻防世界移动安全新手区:easyjni,算法简单,学习动调。

ps:不要用华为或者荣耀的全系列手机进行调试,即使你开了root权限

方法一、直接打开

建立通信

工具

    adb(android studio自 带或者 独立安装),安卓(root)环境。

文件导入

1
2
3
4
5
6
adb connect 127.0.0.1:62001   #真机调试没有这部,62001夜神的端口
adb devices #查看是否检测到安卓连接
adb push F:\IDA\IDA_Pro_v7.5_Portable\dbgsrv\android_server /data/local/tmp
#将ida的远程调试文件push进去,一般就这个目录,比较好记注意位数,不要搞错
adb install F:\CTF题目\Android\easyjni\jni.apk #把apk传进去
adb shell #进去shell界面

进入安卓的shell之后,命令和ubuntu基本一致。

1
2
chmod 777 /data/local/tmp/android_server
su -c /data/local/tmp/android_server

执行到这里,会发现:

image-20220412135844452

这时已经在android上成功开启了端口监听,但是还需要一个端口转发,把android的端口消息转发到本机上来:

1
adb forward tcp:23946 tcp:23946

可以用ida去远程连接了。

ida连接

打开对应位数的新的ida

image-20220412140440322

找到对应的调试器。

image-20220412140538684

然后在弹出的进程框中搜得你要调试的apk的包名字,在jeb中获得或者在jadx中找到,比如:

image-20220412140912677

这就是包名,搜索jni即可。

image-20220412140636458

可能有许多,这里找到之后直接通过搜索来确定就行。

动调

找到进程之后,进入调试界面,ctrl+s,找到对应so文件,这里会有许多的so文件,还是要自己搜一下名字,然后附加上去。

image-20220412141635356

这里我的so文件libnative.so但是找到三个,都试一试,看一下特征。

找到正确的so文件后,另开一个ida,静态分析so,找到对应的函数的对应的地址的偏移,回到动调ida,直接G过去。

image-20220412141823202

可能没有识别成函数,直接p一下就好,就可以正常的F5了。

可能的失败

1.如果报错,或者找不到进程,可能是没有开启全局调试指令(真机)

1
2
magisk resetprop ro.debuggable 1  #设置debuggable
stop;start; #一定要通过该方式重启,软重启

2.前面都正常,但是最后无法调试原因:

  • 不要用华为或者荣耀系列的真机。

  • 夜神模拟器是x86架构,如果调试arm的话夜神会强制转换架构出问题,用真机即可。

方法二、进程附加

建立通信

步骤同上

ida连接

so文件直接拖进ida中打开静态分析

image-20220412142210487

修改一下debug选项,然后

image-20220412142238040

这里选择远程安卓arm调试,如上图。

image-20220412142313591

debug选择附加进程

image-20220412142721554

要是这里报错就随便写点参数,基本都是默认的

之后会有一个弹窗问你这俩文件一不一样,直接选same就行了。

动调

就和别的程序一样动调了,注意ARM架构的ip指针是PC指针。