-
目前主流的
HOOK
框架:OC的Method swizzling
、fishHook
、InlineHook
和Cydia Substrate
-
关于
MethodSwizzling
和fishHook
,兄弟们估计用的不少了。我就不在这里班门弄斧了~ -
几天了解一波新秀 —
InlineHook
1. Dobby框架
由于
InlineHook
出来不是针对于iOS
和MacOS
工程的(是全平台
的~),所以我们要用cmake
编译它
1.1. Dobby框架的安装
- 首先我们先
clone
下来(放到你想要放到的目录?)
git clone https://github.com/jmpews/Dobby.git --depth=1
- 然后我们进入
Dobby目录
,创建build_for_ios_arm64
文件夹(官方推荐目录名),然后进入创建的文件夹~
命令行~
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
复制代码
- 编译完成~如图所示
1.2. 生成framework
有了
xcode工程
了。兄得们,编译成framework
还远吗?
- 首先选择框架进行
编译
编译成功
~
当使用时,可能会报
bitcode
错误。关上就行了
2. 使用及原理
我们最重要的总是实用性,有机会的话可以理解下的思想~
2.1. InlineHook 的使用
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
函数,注:在运行时调用的。不是编译阶段
2.2. 原理分析
兄弟们也可以自己看源码(我看了下源码。感觉有点不合适在博客里面写(
C++,汇编啥太多了
)),这里我们直接断点看汇编
。看看他做了什么操作
- 我先把
DobbyHook函数
注释掉,看看原始的汇编
汇编
不太熟悉的兄得们,可以看看我之前的博客(注释超级详细了,哈哈)
- 观察下
DobbyHook函数
调用之后的~
所以说:
InlineHook
实在运行时
的hook
。然后通过寻找符号地址
,改变执行的汇编代码
,起到hook
的目的
- 兄弟们都会想到,这样直接改不就影响
函数栈平衡
了吗?
解释:
如果没有调用原始函数: 接下
br x17
下面的代码是不会执行了
如果调用了原始函数:首先会
记住函数地址
。在新函数中实现栈平衡
然后在调回原始函数
3. HOOK纯地址
兄得们都清楚,
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
住~
4. 总结
又到了总结的时候了
-
- 兄弟们,咱们离
逆向开发
又近了一步
- 兄弟们,咱们离
-
- 辛亏有兄弟们的支持,我才能坚持学习写博客,必须感谢一波~
-
- 小谷希望和兄弟们在学习的道路上越走越远。只希望在学习的海洋不被落下~
-
- 我觉得
HOOK
这个东西只有实操才能感受它的优美~ ?
- 我觉得
-
- 兄弟们。以后产出博客请多多指点~