小谷秃头合集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
这个东西只有实操才能感觉它的优美~ 😆