前言
在我们拿到别人的可执行文件时,应该是脱了符号的,那么如何调试获取自己想要的内容呢?或者又有哪些好用的工具呢?
符号恢复
符号恢复如下代码:
./restore-symbol symbolDemo -o symbolDemo2
只有OC的方法能够恢复符号,因为消息发送机制决定必须要有类名和方法名。
我们可以看到在代码段能找到方法名,所以只要按照一定的规律就能把OC方法的符号给恢复了,既然方法有了,肯定有大佬封装好了工具,工具可以下方下载,然后输入前面的命令就可以恢复符号了。
生成头文件
生成头文件如下命令:
./class-dump -H WeChat -o ./headers/
原理和符号恢复一样,只不过这次不是修复符号,而是把类分成一个个文件,生成熟悉的头文件出来,工具文章底部链接可以下载,在MonkeyDev](github.com/AloneMonkey…
lldb轻量级代码调试工具
常用命令
- 多个符号断点:
br set -n test -n test1 - 内存地址下断点:
br set -a 0x10006782 - 继续执行:
c - 单步往下走:
n - 断点列表展示:
br list - 使一组或者某个断点失效:
br disable 1 - 删掉一组或者某个断点:
br delete 1 - breakpoint使用帮助:
help breakpoint - 通配符下断点:
br set -r '\[EncryptString .*\]' - 执行代码:
p [self.model addObject:[[Person alloc] init]]; - 查看堆栈信息:
bt - 向前或者向后切换当前堆栈环境:
up或down - 直接选择某个堆栈环境:
frame select 12 - 看某个堆栈的局部变量等(函数参数,在逆向使用的时候没作用):
frame variable - 函数在断点处直接返回:
thread return 返回值 - 内存断点(一般用在变量上面,有变化就会断住):
watchpoint set variable p1->_name - 添加指令:
- 给所有断点添加一行命令:
target stop-hook add -o "frame variable" - 查看断点hook列表:
target stop-hook list - 删除断点hook:
target stop-hook delete 2或者undisplay 2
lldb好用的插件
chisel好用的语法
- 查看应用层图结构:
pviews - 查看层图结构:
pviews self.view - 查看父层图结构:
pviews -u self.view - 查看控制器结构:
pvc - 查看类继承结构结构:
pclass obj - 查看对象方法:
pmethods obj - 查看对象成员变量:
pinternals obj - 查看当前所在控制器:
fvc -v view - 查看当前页面该类的view:
fv CSView - 查看view所在的位置(在视图页面会闪一下):
flicker view
LLDB好用的语法
- 查看某个类的view:
search viewClass - 查看方法:
methods obj - 展示还原符号的堆栈:
sbt
Cycript
这个需要在运行的项目里注入Cycript库,个人不是特别喜欢,最大的优点应该是可以实时调试,不需要断点
Cycript库在Monkey里有,在根目录的opt文件里,自己找下。
-
远程连接
Cycript库,ip换成自己的就行(端口默认6666):cycript -r 192.169.1.10:6666 -
连接完后可以用熟悉的
OC语法:
Cycript高级语法:APPID、pviews()、pvcs()等
Cycript高级语法是封装而成的,文件后缀名为cy,具体可以这样配置
导入自定义封装的文件:@import test,写法可以参考上面别人写的。
工具下载地址
工具下载地址: pan.baidu.com/s/15J6nF7qk… 提取码: 7vp7