一.目標(biāo)
- 1.找到內(nèi)存中調(diào)用
setupNotification
方法的位置 - 2.找到調(diào)用
setupNotification
的方法funcationA
的位置
- (void)viewDidLoad{
[self funcationA];
}
- (void)funcationA{
self.name = @"lijiachao";
[self setupNotification];
//自定的某個(gè)類的某個(gè)方法
[LRDocumentPath fetchPath];
}
- (void)setupNotification{
NSLog(@"woshiXXX");
}
在正向開發(fā)中,比較簡單,都不用找洼滚,或者看代碼就好了。但是在逆向開中疮方,沒有看到代碼站辉,那么如何找到那?方法有兩種:
- 1.通過Xcode逆向開發(fā)
- 2.使用
debugserver+lldb
組合開發(fā)
二.基礎(chǔ)概念
眾所周知溪厘,在逆向開發(fā)中.
我們?nèi)绻胫?strong>我調(diào)用了誰,去Hopper
或者IDA
中看就好了,
但是怎么看到誰調(diào)用了我是個(gè)難題。但也有方法:
- 1.如果使用
debugserver+lldb
組合牌柄,可以使用po $lr
畸悬,打印地址;可以獲取到”調(diào)用我的位置珊佣,然后通過減去偏移量獲取基址地址蹋宦,然后在hopper
中找到,然后就可以看到funcationA
的位置咒锻。兩個(gè)地址都獲得了. - 2.使用
Xcode
調(diào)試冷冗。看右側(cè)的即可惑艇。今天主要講解Xcode調(diào)試方法
先去了解Xcode
幾個(gè)按鈕的名稱和功能
//
// LRTest1Controller.m
// LLDBTest
//
// Created by 王鑫 on 2017/7/14.
// Copyright ? 2017年 王鑫. All rights reserved.
//
#import "LRTest1Controller.h"
@interface LRTest1Controller ()
/** view */
@property(strong,nonatomic) UIView *bgView;
/** money */
@property(assign,nonatomic)CGFloat money;
@end
@implementation LRTest1Controller
- (void)viewDidLoad {
[super viewDidLoad];
[self button:nil];
}
- (IBAction)button:(id)sender {
if (self.person) {
// NSLog(@"有人\n name = %@,age = %ld",self.person.name,self.person.age);
[self setupName];
self.money = 100.;
}else{
LRPerson *per = [[LRPerson alloc] init];
per.name = @"王鑫";
NSLog(@"%@",per.name);
}
}
- (void)setupName{
self.person.name = @"bbb";
[self logSome];
[self createSubViews];
[self removeSomeViews];
}
- (void)logSome{
NSLog(@"有人\n name = %@,age = %ld",self.person.name,self.person.age);
}
- (void)createSubViews{
self.bgView = [[UIView alloc] init];
[self.view addSubview:self.bgView];
self.bgView.frame = CGRectMake(100, 400, 100, 100);
}
- (void)removeSomeViews{
NSLog(@"-------");
}
@end
簡介:
- 第四個(gè)按鈕:單步執(zhí)行
- 第五個(gè)按鈕:跟入執(zhí)行
- 第六個(gè)按鈕:返回到調(diào)用我的位置
三.實(shí)際操作
第四個(gè)按鈕:單步執(zhí)行
一步一步執(zhí)行蒿辙,如果某一步是個(gè)方法拇泛,我們不進(jìn)入方法內(nèi)部,繼續(xù)往下執(zhí)行.
第五個(gè)按鈕:跟入執(zhí)行,進(jìn)入到函數(shù)的內(nèi)部.
第六個(gè)按鈕:返回到調(diào)用我的位置
左側(cè)就會(huì)一直返回到調(diào)用我的位置思灌。
如果這個(gè)是Xcode
正向開發(fā)俺叭,那么很好,可以看到調(diào)用我的那個(gè)方法名稱泰偿,但是如果是逆向開發(fā)的時(shí)候熄守,那么有些方法看不到,我們使用了Hook
勾住甜奄,所以切記左側(cè)的都是一些亂東西柠横,我們要將頁面拉倒頂部,然后就可以看到調(diào)用我的函數(shù)课兄,獲取到偏移函數(shù)的位置
四.查找“調(diào)用我的位置”和“誰調(diào)用了我那個(gè)函數(shù)的名稱”
查找調(diào)用我的位置有三個(gè):
- 1.點(diǎn)擊調(diào)用棧牍氛,然后就可以看到了
- 2.1 逆向環(huán)境下:一下一下點(diǎn)擊第五個(gè)按鈕,直到跳轉(zhuǎn)到匯編頁面
- 2.2 正向環(huán)境下:一下一下點(diǎn)擊第五個(gè)按鈕烟阐,就可以跳轉(zhuǎn)到了調(diào)用我的地方
- 3.點(diǎn)擊第六個(gè)按鈕即可
查找調(diào)用我的那個(gè)函數(shù):
當(dāng)我們?cè)跀帱c(diǎn)出搬俊,一下一下點(diǎn)擊第五個(gè)按鈕,直到跳轉(zhuǎn)到匯編頁面為止蜒茄,然后將頁面向上拉到頂部唉擂,看到的地址就是實(shí)際在內(nèi)存的地址.
獲取到“調(diào)用我的那個(gè)函數(shù)”的實(shí)際內(nèi)存地址是0x101208c2c
屿聋。
為什么要一下一下的點(diǎn)擊空扎,直到匯編頁面?
因?yàn)槲覀冞@個(gè)是反匯編润讥,所以看不到他們的源碼转锈,所以只能點(diǎn)一下,再點(diǎn)一下楚殿,直到獲得匯編頁面撮慨。
正向開發(fā)中,我們點(diǎn)擊第五個(gè)按鈕的時(shí)候脆粥,是一句一句看的見的代碼在執(zhí)行砌溺,但是沒有源碼的情況下,我們只能點(diǎn)一下变隔,點(diǎn)一下的嘗試抚吠,直到匯編頁面.
獲取偏移地址
既然我們?cè)?code>Xcode中調(diào)試應(yīng)用程序,那么我們就在這里不適用debuge+lldb
那個(gè)經(jīng)典的方式去獲得應(yīng)用的偏移量了.
直接在Xcode
中打印獲得偏移量0x00000000000ac000
弟胀。
(lldb) image list -o -f
[ 0] 0x00000000000ac000 /Users/wangxin/Library/Developer/Xcode/DerivedData/IPAPatch-hcpqapxbshyvjsajulgtoonbuagq/Build/Products/Debug-iphoneos/WeChat.app/WeChat
[ 1] 0x00000000000dc000 /Users/wangxin/Library/Developer/Xcode/iOS DeviceSupport/9.2 (13C75)/Symbols/usr/lib/dyld
...
[327] __lldb_objc_find_implementation_for_selector
[328] __lldb_caller_function
[329] __lldb_apple_objc_v2_get_dynamic_class_info
[336] 0x0000000003b7c000 /Users/wangxin/Library/Developer/Xcode/iOS DeviceSupport/9.2 (13C75)/Symbols/System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Libraries/libCGInterfaces.dylib
(lldb)
遵循公式 Hopper的地址 = 實(shí)際內(nèi)存地址 - 偏移量
hopper地址 = 0x101208c2c - 0x00000000000ac000 = 000000010115cc2c
在hopper
中找到調(diào)用者的地址和名稱
將hopper
的地址找到,然后在Hopper
中查找
在這里輸入000000010115cc2c
地址
可以獲取到方法是
[WebViewA8KeyLogicImpl handleOnGetA8KeyOK:reason:req:]:
ps:
1.之前我在斷點(diǎn)處,直接打印lr
的內(nèi)存地址孵户,試圖找到調(diào)用者的內(nèi)存地址萧朝,然后減去了偏移地址但是結(jié)果不對(duì),現(xiàn)在看來夏哭,是我的位置不對(duì)
2.hopper
和IDA
他們的地址是相對(duì)于偏移地址 = 0而言的