Featured image of post 一次IDA动态调试安卓apk记录

一次IDA动态调试安卓apk记录

一次IDA动态调试安卓apk记录

  • 在mt管理器中点开目标app的属性进行手动提权

  • 也可以adb进入提权

  • 重命名android_serveras,可以防止一些反调试

  • 此处运行编辑好的.bat文件,也可以用命令行替代

  • 运行成功就会显示如下画面(只需点击IDAdebug1.bat即可)

  • 打开ida pro,设置Hostname127.0.0.1 使用默认端口号为23946

  • 对check函数下断点

然后

  • 附加到对应进程,会出现如下所示窗口,选择same

  • 然后程序会停在如图所示的地方,这时候要点开始调试(蓝色小三角),在手机输入任意字符串后点击验证

  • 等待程序运行到断点

  • 步进到比较函数处

  • 点击_wuaipojie0123456就可以看到比较的值,即为flag

  • 在第一次调试过程遇到了反调试,在JNI_OnLoad

  • 将对应代码patch掉后,右键保存

  • 点击Apply patches覆盖掉原本的so文件,然后将这个so文件替换原本的apk/lib/arm64-v8a中的so文件,重新安装该应用,再次运行上述操作,即可绕过反调试

补充常见寄存器知识

在进行动态调试,以下是一些常用的寄存器介绍:

寄存器名称 功能介绍
R0-R12 通用寄存器,用于存储临时数据。在函数调用时,R0-R3用于存储前四个参数,其余的参数通过堆栈传递。返回值也通过R0R1传递。
R13 (SP) 堆栈指针寄存器,指向当前堆栈的顶部。
R14 (LR) 链接寄存器,存储子程序的返回地址。
R15 (PC) 程序计数器,指向下一条要执行的指令。
CPSR 当前程序状态寄存器,保存程序的状态信息,如算术运算的结果标志、中断禁止标志等。
FPSCR 浮点状态和控制寄存器,如果你在调试的代码中涉及到浮点运算,那么这个寄存器会比较重要。

常用快捷键

快捷键 功能
F2 在所在行下断点
F5 可以将ARM指令转化为可读的C代码,同时可以使用Y键,对JNIEnv指针做一个类型转换,从而对JNI里经常使用的JNIEnv方法能够识别
F7 单步进入调试
F8 按照顺序一行一行,单步调试
F9 直接跳到下一个断点处
Shift + F12 快速查看so文件中的字符串信息,分析过程中通过一些关键字符串能够迅速定位到关键函数
Ctrl + s 有两个用途,在IDA View页面中可以查看文件so文件的所有段信息,在调试页面可以查看程序中所有so文件映射到内存的基地址。tips:在进行so调试过程中,很有用的一个小技巧就是IDA双开,一个用于进行静态分析;一个用于动态调试。比如说调试过程中要找到一个函数的加载到内存中的位置
Esc 回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
g 直接跳到某个地址
y 更改变量的类型
x 对着某个函数、变量按该快捷键,可以查看它的交叉引用
n 更改变量的名称
p 创建函数

可能遇到的问题

  • 1.jdb 不是内部或外部命令,也不是可运行的程序或批处理文件。

​ http://t.csdn.cn/paKAt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
java.io.IOException: handshake failed - connection prematurally closed
        at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:136)
        at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)
        at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
        at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)
        at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)
        at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)
        at com.sun.tools.example.debug.tty.Env.init(Env.java:63)
        at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1066)
致命错误:
无法附加到目标 VM
解决方法:有可能是手机问题,建议低版本真机,不要用模拟器!切命令顺序不要乱!另外也有可能软件有反调试!
  • 3.动态调试中找不到so文件 解决方法:可以尝试手动复制一份对应的so文件放到data/app/包名/lib目录下

  • 4.device offline 解决方法:重新插拔usb,再不行就重启机子

  • 5.0.0.0.0:23946: bind: Address already in use 解决方案: adb shell "su -c 'lsof | grep 23946'" //获取pid adb shell "su -c 'kill -9 PID'" //这里的pid要根据上一步获取的填写

  • 6.常见反调试

  • 调试端口检测

    检测常见的23946端口,所以在运行时可以加-p指定一个另外的端口来过掉这个检测

    例如,使用./as -p 12345命令启动调试server,将调试端口改为12345,然后在IDA Pro中相应地修改端口号为12345进行连接。

  • 调试进程名检测

    固定的进程名 android_server gdb_server等等,所以要改个名字,例如as64

  • ptrace检测

    每个进程同时刻只能被1个调试进程ptrace ,主动ptrace本进程可以使得其他调试器无法调试

    实现代码:

1
2
3
4
int ptrace_protect()//ptrace附加自身线程 会导致此进程TracerPid 变为父进程的TracerPid 即zygote
{
    return ptrace(PTRACE_TRACEME,0,0,0);;//返回-1即为已经被调试
}

推荐一个安卓的显示控制软件:QtScrcpy

  • 打开如下按钮后可以实现电脑的模拟点击,非常好用

参考文件:

《安卓逆向这档事》十二、大佬帮我分析一下

IDA修改exe并保存运行

使用IDA进行动态调试与过反调试(上)(三)

Licensed under CC BY-NC-SA 4.0
前途似海,来日方长。

<