zoom
(zoom)
1
最近刚看完《iOS应用逆向工程》这本书,想尝试逆向别人的一个功能,通过打印堆栈信息,
看到如下调用堆栈
1.方法f
2.方法a_block
3.方法b_block
4.方法c_block
5.方法d
6.方法c
7.方法b
8.方法a
然后自己就分不清楚,方法a到方法f是如何调用的
自己写了一个demo,打印了类似的堆栈信息
0x00000001000016dd __57-[AppDelegate application:didFinishLaunchingWithOptions:]_block_invoke_2 + 77
0x0000000100001b70 -[AppDelegate testMethods4:] + 112
0x0000000100001673 __57-[AppDelegate application:didFinishLaunchingWithOptions:]_block_invoke + 131
0x000000010000194e __28-[AppDelegate testMethods1:]_block_invoke + 206
0x0000000100001ad0 -[AppDelegate testMethods3:] + 112
0x0000000100001a3f -[AppDelegate testMethods2:] + 95
0x0000000100001848 -[AppDelegate testMethods1:] + 168
0x000000010000158e -[AppDelegate application:didFinishLaunchingWithOptions:] + 190
![](https://cdn.iosre.com/uploads/default/364/e1346fa054b20759.png)
IDA下methods4的截图
![](https://cdn.iosre.com/uploads/default/365/e9e12d838dca90f4.png)
在这种情况下,如何区分这几个方法的调用关系?
请大牛们指导
感谢
我记得自己在调试的时候,从堆栈里看不出太多有用信息,类似于“方法a到方法f是如何调用的”这种问题,我觉得最好的方式就是IDA和lldb配合调试。你可以把你写的这段源代码贴上来,我对照着IDA这张截图看看,然后分析一下block是怎么得到调用的
zoom
(zoom)
3
嗯嗯,好的
下面是整个测试代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[self testMethods1:^(bool bResult, NSNumber *num) {
[self testMethods4:^(bool bResult, NSNumber *num) {
NSLog(@"4 - back track is:%@", [NSThread callStackSymbols]);
}];
}];
NSLog(@"end");
return YES;
}
- (void)testMethods1:(void(^)(bool bResult , NSNumber * num))block
{
[self testMethods2:^(bool bResult , NSNumber * num){
block(bResult, num);
}];
}
- (void)testMethods2:(void(^)(bool bResult , NSNumber * num))block
{
[self testMethods3:block];
}
- (void)testMethods3:(void(^)(bool bResult , NSNumber * num))block
{
block(YES, @(2));
}
- (void)testMethods4:(void(^)(bool bResult , NSNumber * num))block
{
block(YES, @(555));
}
下面是二进制文件
blockTest.zip (9.34 KB)
你的testMethod4内就调用了一个block(),也谈不上什么调用关系,我估计就是这俩BLX R3中的其中一个,这种情况你需要动态调试了,再这2个BLX上下断点,然后si,看看到底跳到哪里去执行了。
要看调用关系的话,根据你的源代码,testMethod2倒是比较适合作为查看调用关系的例子
zoom
(zoom)
5
明白了,今天下午已经在挂GDB进行跟进了,非常感谢非常感谢~