用IDA分析MachO文件
1. IDA -> File -> New instance 2. New -> 新打开一个窗口 3. 因为用的是虚拟机, 所以用File -> Open a. 选择All Files b. 开始分析 -> 黄色的小球代表正在分析 -> 绿色 -> 分析完毕 c. 选择要分析的文件 (分析微信的项目, 花了三个小时...) 4. 分析完毕后, 按空格进入
MonkeyDev做符号的恢复
创建一个MonkeyApp Build Setting -> Monkey -> MONKEYDEV_RESTRORE_SYMBOL -> YES 用MonkeyDev进行符号的恢复 -> 再用IDA分析
静态分析
- 要分析的方法OnOpenRedEnvelopes (上篇文章有定位到该方法)
- 同时要分享WCRedEnvelopesReceiveHomeView的头文件
- 打开微信头文件合集 (砸壳并class dump 拿到的)
- com + f -> @interface WCRedEnvelopesReceiveHomeView (好像指令是com + a) -> 跳转对应头文件
- 伪代码分析
- self.m_dicBaseInfo[@"isSender"]
image.png
b.分析到代理, 调用了对应的方法
动态调试
- hook代码如下, 来查看点击红包时的, 控制台的打印, 需要查下MSHookIvar
%hook WCRedEnvelopesReceiveHomeView - (void)OnOpenRedEnvelopes{ //MSHookIvar NSDictionary * dict = MSHookIvar<NSDictionary *>(self,"m_dicBaseInfo"); NSArray * arr = [dict allKeys]; //打印字典 for(int i = 0;i < arr.count ;i++){ NSLog(@"%@ : %@",arr[i],[dict objectForKey:arr[i]]); } //代理 id delegate = MSHookIvar<id>(self,"m_delegate"); NSLog(@"delegateClass:%@",[delegate class]); %orig; } %end
- 点看红包, 查看控制台打印的数据
image.png
- 从上面的截图, 可以看出来
- 代理类 -> WCRedEnvelopesReceiveControlLogic
- 然后继续分析IDA解析的汇编
image.png
c.发现代理调用的方法是 -> WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes
静态分析代理方法
- 在IDA中搜索WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes
- 发现有:结尾的, 这种是带有参数的意思, 而这里我们分析不带参数的
image.png
- 找到方法后, 右边可以双击, 发现最终调用的还是带参数的
- 上面可以看出来参数为0, 也就是#0
- 伪代码
{[self WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:0];}
- 继续往下进行静态分析
image.png
b.
image.png
c.这里是初步静态方法分析, 那么实际开发过程中, 要静态分析和动态调试相结合, 上面分析完之后, 要动态调试Hook打印验证并查看一下上面的对象是什么东西.
动态调试代理方法
- 经过上面分析, 我们要进行相应的方法hook, 并打印验证
mage.png
- 这里注意:
- 要进行相应属性的声明 (要去头文件里面查找验证是否有相应的方法)
- 注意声明的顺序, 顺序错误也会报错
image.png
- 然后运行代码, 注意USB要先映射
- 点击打开, 查看控制台打印如下
image.png
- IDA里面还有个非常好用的功能 -> F5查看当前汇编的伪代码.
image.png
- 通过伪代码的分析, 更加应征了我们上面静态分析的结果
- 接下来我们要通过IDA的伪代码来继续分析.
- com + A
- 右键 -> HTML
- 打开刚才生成的HTML文件