直接使用系统函数,最终都逃不掉被fishhook勾住的结局。
那我们就用更低层的汇编代码吧。
syscall(26, 31, 0, 0); 可以写成下面的汇编代码:
//下面的汇编代码相当于 syscall(26, 31, 0, 0);
//volatile: 告诉编译器不要优化此段汇编代码
asm volatile (
"mov x0, #26\n" //x0,x1,x2,x3寄存器放参数,26是ptrace函数
"mov x1, #31\n"
"mov x2, #0\n"
"mov x3, #0\n"
"mov x16, #0\n" //x16寄存器放编号为0的函数,syscall
"svc #0x80\n" //这条指令会触发中断(系统级别的跳转),中断根据x16寄存器里面的值,跳转相应的函数
);
这样的话,我们使用汇编代码通过syscall函数进而调用ptrace函数,从而达到阻止调试器附加的目的。而且,添加符号断点syscall和ptrace也是不会产生中断的。
ptrace(PT_DENY_ATTACH, 0, 0, 0); 可以写成下面的汇编代码:
//下面的汇编代码相当于 ptrace(PT_DENY_ATTACH, 0, 0, 0);
//volatile: 告诉编译器不要优化此段汇编代码
asm volatile (
"mov x0, #31\n" //x0,x1,x2,x3寄存器放ptrace函数的参数
"mov x1, #0\n"
"mov x2, #0\n"
"mov x3, #0\n"
"mov x16, #26\n" //x16寄存器放编号为26的函数,ptrace
"svc #0x80\n" //这条指令会触发中断(系统级别的跳转),中断根据x16寄存器里面的值,跳转相应的函数
);
exit(0); 可以写成下面的汇编代码:
//下面的汇编代码相当于 ptrace(PT_DENY_ATTACH, 0, 0, 0);
//volatile: 告诉编译器不要优化此段汇编代码
asm volatile (
"mov x0, #0\n" //x0放exit函数的参数
"mov w16, #1\n" //w16寄存器放编号为1的函数,exit
"svc #0x80\n" //这条指令会触发中断(系统级别的跳转),中断根据x16寄存器里面的值,跳转相应的函数
);