前言
在我们拿到别人的可执行文件时,应该是脱了符号的,那么如何调试获取自己想要的内容呢?或者又有哪些好用的工具呢?
符号恢复
符号恢复如下代码:
./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