小谷禿頭合集ios
目前主流的HOOK
框架:OC的Method swizzling
、fishHook
、InlineHook
和Cydia Substrate
git
關於MethodSwizzling
和fishHook
,兄弟們估計用的很多了。我就不在這裏班門弄斧了~github
幾天瞭解一波新秀 -- InlineHook
xcode
因爲
InlineHook
出來不是針對於iOS
和MacOS
工程的(是全平臺
的~),因此咱們要用cmake
編譯它markdown
clone
下來(放到你想要放到的目錄😆)git clone https://github.com/jmpews/Dobby.git --depth=1
框架
Dobby目錄
,建立build_for_ios_arm64
文件夾(官方推薦目錄名),而後進入建立的文件夾~命令行~ide
cd Dobby && mkdir build_for_ios_arm64 && cd build_for_ios_arm64
函數
cmake
編譯成xcode工程
~ (這個時候在build_for_ios_arm64
了)cmake .. -G Xcode \
-DCMAKE_TOOLCHAIN_FILE=cmake/ios.toolchain.cmake \
-DPLATFORM=OS64 -DARCHS="arm64" -DCMAKE_SYSTEM_PROCESSOR=arm64 \
-DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=1 -DDEPLOYMENT_TARGET=9.3 \
-DDynamicBinaryInstrument=ON -DNearBranch=ON -DPlugin.SymbolResolver=ON -DPlugin.Darwin.HideLibrary=ON -DPlugin.Darwin.ObjectiveC=ON
複製代碼
有了
xcode工程
了。兄得們,編譯成framework
還遠嗎?post
編譯
編譯成功
~當使用時,可能會報
bitcode
錯誤。關上就好了學習
咱們最重要的老是實用性,有機會的話能夠理解下的思想~
InlineHook
和fishhook
的使用差很少,都比較方便(我首先在項目中舉例使用,而後在實戰純地址)
InlineHook
的hook
函數// replace function
/** argv1:hook的函數地址 argv2:新函數的地址 argv3:原始函數指針 */
int DobbyHook(void *address, void *replace_call, void **origin_call);
複製代碼
很形象生動:替換函數
// 1 導入framework
// 2 引入頭文件
// 3使用
int sum(int a, int b){
return a + b;
}
int (*sum_p)(int a, int b);
int sumReplace(int a, int b){
NSLog(@"HOOK住了~");
return a + b;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
DobbyHook(sum, sumReplace, (void *)&sum_p);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"click ~");
sum(10, 20);
}
複製代碼
就使用這個
DobbyHook
函數,注:在運行時調用的。不是編譯階段
兄弟們也能夠本身看源碼(我看了下源碼。感受有點不合適在博客裏面寫(
C++,彙編啥太多了
)),這裏咱們直接斷點看彙編
。看看他作了什麼操做
DobbyHook函數
註釋掉,看看原始的彙編
彙編
不太熟悉的兄得們,能夠看看我以前的博客(註釋超級詳細了,哈哈)
DobbyHook函數
調用以後的~因此說:
InlineHook
實在運行時
的hook
。而後經過尋找符號地址
,改變執行的彙編代碼
,起到hook
的目的
函數棧平衡
了嗎?解釋:
若是沒有調用原始函數: 接下
br x17
下面的代碼是不會執行了
若是調用了原始函數:首先會
記住函數地址
。在新函數中實現棧平衡
而後在調回原始函數
兄得們都清楚,
InlineHook
主要是用於咱們逆向開發
中。因此咱們獲取不到要hook
的函數sum
,這個時候兄弟們有什麼辦法嗎?(說實話,我剛開始有點上頭的~,我很是自信的想用下某信
舉例,結果我好像搞不定它。😆)
脫符號
hook
應用的MachO
文件咱們隨機找個函數
,而後模擬這個函數(我是不知道這個函數是什麼的,因此我要經過彙編
判斷)
咱們知道參數爲4個字節
,初步判斷爲int型
int xxx(int a, int b){
return a + b;
}
複製代碼
咱們判斷函數爲此(因爲用的
w0,w1
因此判斷不是OC方法
),並且能夠用過MachO
獲取偏移值爲5DD0
demo
。hook
這個地址(我用的之前博客上的 iOS動態庫注入)#import "InjectTest.h"
#import <mach-o/dyld.h>
#import "DobbyX.framework/Headers/dobby.h"
@implementation InjectTest
//int xxx(int a, int b){
//return a + b;
//}
//原始地址的指針
int (*xxx_p)(int a, int b);
//新函數替代
void xxxReplace(int a, int b){
NSLog(@"HOOK 到了~");
xxx_p(a,b);
}
+ (void)load{
//設置偏移地址
uintptr_t offset = 0x100005DD0;
//獲取ASLR隨機值
uintptr_t alsr = _dyld_get_image_vmaddr_slide(0);
//肯定函數hook的地址
offset += alsr;
//HOOK 函數
DobbyHook((void *)offset, xxxReplace, (void *)&xxx_p);
}
@end
複製代碼
有一點須要記住。
ASLR
是不帶PAGEZORE
的
觸發函數
時,就會被hook
住~又到了總結的時候了
逆向開發
又近了一步HOOK
這個東西只有實操才能感覺它的優美~ 😆