iOS逆向学习-008如何分析应用

1,479 阅读3分钟

前言

在我们拿到别人的可执行文件时,应该是脱了符号的,那么如何调试获取自己想要的内容呢?或者又有哪些好用的工具呢?

符号恢复

符号恢复如下代码:

./restore-symbol symbolDemo -o symbolDemo2

只有OC的方法能够恢复符号,因为消息发送机制决定必须要有类名和方法名。

image.png

我们可以看到在代码段能找到方法名,所以只要按照一定的规律就能把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
  • 向前或者向后切换当前堆栈环境:updown
  • 直接选择某个堆栈环境:frame select 12
  • 看某个堆栈的局部变量等(函数参数,在逆向使用的时候没作用):frame variable
  • 函数在断点处直接返回:thread return 返回值
  • 内存断点(一般用在变量上面,有变化就会断住):watchpoint set variable p1->_name
  • 添加指令:

image.png

  • 给所有断点添加一行命令:target stop-hook add -o "frame variable"
  • 查看断点hook列表:target stop-hook list
  • 删除断点hook:target stop-hook delete 2或者undisplay 2

lldb好用的插件

  • facebook的chisel,使用方法readme中有
  • 还有一个就叫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语法:

image.png

Cycript高级语法:APPIDpviews()pvcs()

Cycript高级语法是封装而成的,文件后缀名为cy,具体可以这样配置 image.png

导入自定义封装的文件:@import test,写法可以参考上面别人写的。

工具下载地址

工具下载地址: pan.baidu.com/s/15J6nF7qk… 提取码: 7vp7