欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS逆向教程之动态调试详解

程序员文章站 2023-12-17 14:54:22
前言 有时候想更了解别人app的调用流程,就需要在app运行的时候进行动态调试。动态调试指的是将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等。...

前言

有时候想更了解别人app的调用流程,就需要在app运行的时候进行动态调试。动态调试指的是将程序运行起来,通过下断点、打印等方式,查看参数、返回值、函数调用流程等。

下面话不多说了,来随着小编一起看看详细的介绍吧

xcode的动态调试原理

首先了解一下 xcode 编译和调试器的发展。xcode 中的编译器发展历程:gcc -> llvm,调试器的发展历程:gdb -> lldb 。

xcode 调试安装到手机上的应用的原理:xcode 通过 lldb 调试器把调试指令发送到手机上的 debugserver, debugserver 再与相应的 app 进行交互,达到调试的效果。

debugserver 一开始是存放在mac的xcode里面,路径:

/applications/xcode.app/contents/developer/platforms
/iphoneos.platform/devicesupport
/9.1/developerdiskimage.dmg
/usr/bin/debugserver

当 xcode 识别到手机设备时,xcode 会自动将 debugserver 安装到手机上。

xcode 调试的局限性:一般情况下,只能调试通过 xcode 安装的app,无法调试其它app。

给debugserver赋予权限

默认情况下 /developer/usr/bin/debugserver 缺少一定的权限,只能调试通过xcode安装的app,如果希望调试其它app,需要对 debugserver 重新签名,签上可以调试其它app的权限。

需要的两个权限为:get-task-allow 和 task_for_pid-allow

iphone上的 /developer 目录是只读的,无法直接对 /developer/usr/bin/debugserver 文件签名,需要先把 debugserver 复制到mac。

通过 ldid 命令导出文件以前的签名权限:

$ ldid -e debugserver > debugserver.entitlements

debugserver.entitlements 这个文件其实是个 plist 文件,在这个文件中加上上面提到的两个权限后,再通过 ldid 命令对文件重新签名。

$ ldid -sdebugserver.entitlements debugserver

然后将已经签好权限的 debugserver 放到 /usr/bin 目录,便于找到 debugserver 指令。

debugserver附加到某个app进程

$ debugserver *:端口号 -a 进程
  • *:端口号:使用iphone的某个端口启动debugserver服务(不是保留端口)
  • -a进程:输入app的进程信息(进程id或者进程名称)

mac远程连接iphone上的debugserver服务

启动lldb:

// 在终端输入
$ lldb

连接debugserver服务

(lldb) process connect connect://手机ip地址:debugserver服务端口号

使用lldb的c命令让程序先继续运行

(lldb) c

到此,就可以远程调试别人的app了。

常用的lldb指令

给viewcontroller的test方法设置断点

breakpoint set -n "-[viewcontroller test]"

查看指令用户使用 help 指令: help breakpoint 等。

打印线程的堆栈信息: thread backtrace

很多命令不在这里赘述,请参考:

aslr

获取 aslr 的偏移量:

image list -o -f

打印结果的第二列前面的地址就是我们需要的 aslr 的偏移量offset。

假如我们想给某个类中的test方法添加断点,那么通过 hooper 工具找到该方法的第一个内存地址,假如为0x010101,然后地址加上我们得到的 aslr 的偏移量就是该方法的实际地址。然后通过该地址给方法下断点。

breakpoint set -o 0x010101+offset

到此就给该方法添加了断点,之后当程序调用该方法的时候,会停在该断点出。

结语

练习 lldb 的各种指令时,推荐先在 xcode 上练习各种用法,因为会有提示和直观的输出结果,更容易我们理解。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: