《iOS防护02》破解ptrace防护
2020-10-30 本文已影响0人
不仅仅是个程序猿
本文接上一篇《iOS防护01》ptrace防护 ,实现破解ptrace防护。
创建动态库
因动态库的加载在main函数之前,所以通过动态库中编写代码实现hook。
-
按照下图步骤创建动态库
截屏2020-10-30上午10.48.33.png
按照上图创建完后,targets会多出来一个动态库(我创建的动态库名称为Inject)。
截屏2020-10-30上午10.59.11.png
动态库中实现hook
在Inject目录下导入fishhook文件(fishhook.h和fishhook.c),ptrace头文件(PtraceHeader.h),并创建OC类(InjectPtrace)进行hook。
截屏2020-10-30上午11.04.22.png
InjectPtrace.m中编写hook代码:
#import "InjectPtrace.h"
#import "PtraceHeader.h"
#import "fishhook.h"
@implementation InjectPtrace
//创建一个指针,保存系统ptrace函数的地址
int (*sys_ptrace) (int _request, pid_t _pid, caddr_t _addr, int _data);
//自定义的函数
int my_ptrace(int _request, pid_t _pid, caddr_t _addr, int _data) {
if (_request != PT_DENY_ATTACH) {
return sys_ptrace(_request, _pid, _addr, _data);
}
return 0;
}
+ (void)load {
//定义一个rebinding结构体
struct rebinding rebind;
//给结构体属性赋值
rebind.name = "ptrace"; //要hook的系统函数名称,C字符串
rebind.replacement = my_ptrace; //自定义的函数地址
rebind.replaced = (void *)&sys_ptrace; //系统函数的指针
//定义一个rebindings结构体数组
struct rebinding binds[] = {rebind};
//符号进行重新绑定,参数为一个rebindings结构体数组和数组长度
rebind_symbols(binds, 1);
}
@end