1.按着变量按y 输入JNIEnv* 即可查看具体方法名
672 GetStringUTFLength
676 GetStringUTFChars
680 ReleaseStringUTFChars
684 GetArrayLength
688 NewObjectArray
3.字符串内容窗口快捷键 ctrl f12
- ida view视图中 ctrl s 打开段信息 里面的位置是相对位置
debug view 调试视图中可以快速定位到想要调试的so文件映射到内存的地址
此时下方可以直接搜索指定文件名
5.cat /proc/[pid]/maps 可以查看一个进程的内存映射信息
这里一般多个so文件。因为有的是代码so 有的是数据so 一般是看代码so位置,一般代码so有一个特点 就是有执行权限x
6.跳转指定地址快捷键
ctrl +g 跳转指定内存位置
- 假设想跳转A函数 然后下断点 那么可以使用上面说的ctrl s 查找so文件的内存开始基地址 然后再用IDA View 查看A函数的相对地址,相加就是绝对地址
- 只要程序不退出 一般这里的基地址在运行中的值就不会变,因为程序数据已经加载进内存了;同时,如果so文件不改变,相对地址也是不会变的
7.有时候发现跳转到指定位置后,看到的全是DCB数据,这时候选择函数地址,点击p键就可以看到ARM指令源码了。
- F8单步调试 F7单步进入调试
- PC 在ARM中是一个特殊的寄存器,用来储存当前指令的地址
- shirt F12 可以快速查看so文件中的字符串信息
- F5可以将ARM指令转化成可读的c代码,同时可以使用Y键,修改JNIEnv的函数方法名
- ctrl s 有两个用途,在IDA View页面中可以查看so文件的所有段信息,在调试页面可以查看程序所有so文件映射到内存的基地址
- G 可以再调试界面上快速到指令的绝对地址,进行下断点调试。如果跳转到目的地址后,发现是DCB数据的话,可以使用P键进行转化。
9.在每次使用BLX 和BL指令调用这些函数的时候,都发现了一个规律;在调用他们之前都是用MOV指令来传递参数值的。
- 在每次调用有返回值函数之后的命令,一般是比较指令,比如CMP,CBZ,或者是strcmp等。
11.IDA调试设置
- IDA安装目录 dbgsrv/android_server 推到手机并执行
- 将端口转发出去 adb forward tcp:23946(进行调试程序段) tcp:23946(被调试程序段)
- 也可以启动的时候指定端口 ./android_server -p12345 端口号参数之间没有空格
- 双开ida 一个用于静态分析 一个用于调试 调试那个选择go 然后Debugger选项卡中选择Android debugger
- 一般会断在libc.so 中,libc是c层中最基本的函数库,封装了io 文件 socket等基本系统调用。 linker是用于加载so文件的模块,所以后面在分析如何在.init_array处下断点,还有一个就是libdvm.so 文件,它包含了所有底层加载dex的一些方法,在后面动态调试需要dump出加密之后的dex文件,就需要调试这个so文件。
- ctrl s找到需要调试so的基地址 然后另一个ida打开so文件,查看函数的相对地址相加,g键快速跳转到这个绝对地址。
- 左上角绿按钮运行
12.alt +t text search