《iOS防护08》防护fishhook
2020-11-03 本文已影响0人
不仅仅是个程序猿
fishhook的原理是修改符号绑定
#import "ViewController.h"
#import "PtraceHeader.h"
#import <dlfcn.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//拼接一个ptrace字符串
unsigned char funcStr[] = {
('a' ^ 'p'),
('a' ^ 't'),
('a' ^ 'r'),
('a' ^ 'a'),
('a' ^ 'c'),
('a' ^ 'e'),
('a' ^ '\0'),
};
unsigned char *p = funcStr;
while (((*p) ^= 'a') != '\0') { //二次异或复原字符
p++;
}
//通过dlopen拿到句柄
void *handle = dlopen("/usr/lib/system/libsystem_kernel.dylib",RTLD_LAZY);
//定义函数指针
int (*sys_ptrace) (int _request, pid_t _pid, caddr_t _addr, int _data);
if (handle) {
sys_ptrace = dlsym(handle, (const char *)funcStr);
if (sys_ptrace) {
sys_ptrace(PT_DENY_ATTACH, 0, 0, 0);
}
}
}
@end
如何拿到ptrace函数的句柄:
- 添加ptrace符号断点
可以得到ptrace函数所在的系统库 libsystem_kernel.dylib - 断点处,在控制台输入命令image list
查看加载的镜像,搜索 libsystem_kernel.dylib,找出libsystem_kernel.dylib 的路径为 /usr/lib/system/libsystem_kernel.dylib