一、采用dloen+dlsym调用ptrace
//拼接一个 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 (*ptrace_p)(int _request, pid_t _pid, caddr_t _addr, int _data);
if (handle) {
ptrace_p = dlsym(handle, (const char *)funcStr);
if (ptrace_p) {
ptrace_p(PT_DENY_ATTACH, 0, 0, 0 );
}
}
使用该方法调用ptrace可以使fishhook hook ptrace失效。
二、syscall调用方式
/**
1.参数是函数编号
2.其他的就是参数顺序
*/
syscall(26,31,0,0);
如何知道编号26是ptrace,可以查看 <sys/syscall.h>
8D734A58FF3C224680D5F68F078F5E91.png
以上两种方式虽然可以防止fishhook直接重绑定对应的系统函数,但是还是可以通过符号断点找到调用的系统函数(ptrance,syscall,sysctrl等等)
三、使用汇编进行系统调用
asm volatile(
"mov x0,#31\n"
"mov x1,#0\n"
"mov x2,#0\n"
"mov x3,#0\n"
"mov x16,#26\n"//中断根据x16 里面的值,跳转ptrace
"svc #0x80\n"//这条指令就是触发中断(系统级别的跳转!)
);
#ifdef __arm64__
asm(
"mov x0,#0\n"
"mov w16,#1\n"
"svc #0x80\n"
);
#endif
#ifdef __arm__ //32位下
asm(
"mov r0,#0\n"
"mov r12,#1\n"
"svc #80\n"
);
#endif
使用这种方式调用系统函数(ptrace,syscall,sysctrl)进行防护,就只能通过去找代码块中的指令svc #0x80来定位防护代码了.
网友评论