用IDA分析MachO文件
- IDA -> File -> New instance
- New -> 新打开一个窗口
- 因为用的是虚拟机, 所以用File -> Open
- 选择All Files
- 开始分析 -> 黄色的小球代表正在分析 -> 绿色 -> 分析完毕
- 选择要分析的文件 (分析微信的项目, 花了三个小时...)
- 分析完毕后, 按空格进入
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
- 分析到代理, 调用了对应的方法
动态调试
- 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
- 发现代理调用的方法是 -> WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes
静态分析代理方法
- 在IDA中搜索WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes
-
发现有:结尾的, 这种是带有参数的意思, 而这里我们分析不带参数的
image.png
- 找到方法后, 右边可以双击, 发现最终调用的还是带参数的
- 上面可以看出来参数为0, 也就是#0
- 伪代码{[self WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes:0];}
- 继续往下进行静态分析
-
image.png
-
image.png
- 这里是初步静态方法分析, 那么实际开发过程中, 要静态分析和动态调试相结合, 上面分析完之后, 要动态调试Hook打印验证并查看一下上面的对象是什么东西.
动态调试代理方法
-
经过上面分析, 我们要进行相应的方法hook, 并打印验证
image.png
- 这里注意:
- 要进行相应属性的声明 (要去头文件里面查找验证是否有相应的方法)
-
注意声明的顺序, 顺序错误也会报错
image.png
- 然后运行代码, 注意USB要先映射
-
点击打开, 查看控制台打印如下
image.png
-
IDA里面还有个非常好用的功能 -> F5查看当前汇编的伪代码.
image.png
- 通过伪代码的分析, 更加应征了我们上面静态分析的结果
- 接下来我们要通过IDA的伪代码来继续分析.
- com + A
- 右键 -> HTML
- 打开刚才生成的HTML文件
网友评论