注入.so对特定function函数进行hook要保持原始业务的兼容性典型的hook的做法应该是 hook_function() { save ori_function_address; /* do something in here span some time delay */ call ori_function; } hook函数在执行完自己的逻辑后,应该要及时调用被hook前的"原始函数",保持对原有业务逻辑的透明 4. 尽量...
4.将要HOOK的原函数地址,替换为hook.so中重写后的新函数地址。因为hook.so在上一步被dlopen加载到目标内存空间中,所以重写后的新函数地址可以通过步骤2得到; 5.恢复目标程序原寄存器的内容,传入PTRACE_DETACH参数结束对目标程序的附加。 接下来详细介绍具体的实现: 利用ptrace附加目标程序,传入user_regs_struct结构体...
本文的主题是"系统调用的Hook学习","系统调用的Hook"是我们的目的,而要实现这个目的可以有很多方法,本文试图尽量覆盖从ring3到ring0中所涉及到的Hook技术,来实现系统调用的监控功能。 二、Hook 技术详解 2.1Ring3中Hook技术 ⑴LD_PRELOAD动态连接.so函数劫持 LD_PRELOAD hook技术属于so依赖劫持技术的一种实现,所以...
child = fork();if(child ==0) {ptrace(PTRACE_TRACEME,0,NULL,NULL);execl("/bin/ls","ls","-l","-h",NULL); }else{while(1) {wait(&status);if(WIFEXITED(status))break; orig_rax =ptrace(PTRACE_PEEKUSER, child,8* ORIG_RAX,NULL);if(orig_rax == SYS_write) {ptrace(PTRACE_GETREGS...
由于我们open是在注入进程得到的fd,而mmap是在被hook进程执行的,所以这个fd是不可以被当作参数的。我们必须使用flagMAP_PRIVATE | MAP_ANONYMOUS 往mmap返回的地址里写入shellcode,并执行。 ptrace(PTRACE_GETREGS,traced,0,®s);tmp_addr=regs.rax;/printf("We get address from mmap: 0x%lx\n",tmp_addr)...
由于我们open是在注入进程得到的fd,而mmap是在被hook进程执行的,所以这个fd是不可以被当作参数的。我们必须使用flagMAP_PRIVATE | MAP_ANONYMOUS 往mmap返回的地址里写入shellcode,并执行。 ptrace(PTRACE_GETREGS,traced,0,®s);tmp_addr=regs.rax;/printf("We get address from mmap: 0x%lx\n",tmp_addr)...
3、ptrace和Linux下调试器工作原理 4、实现过程 5、程序代码 6、参考资料 1、背景 API Hook,传说中的API钩子,是指神不知鬼不觉地替换掉标准系统API的方法和研究这种方法的艺术学科……好吧,学科的确谈不上,不过这些技术貌似在Windows下面已经发展得登峰造极了,大家回头看看坐在后排为数众多的病毒+木马就不难明白...
ptrace(在执行系统调用之前) linux下系统调用hook机制主要靠下面两个机制 LD_PRELOAD机制:允许用户手动指定使用的动态链接库,将系统库函数hook->lib.so.6 dlyopen,dlsym: 通过句柄和连接符名称获取真实库函数名或者变量名 ptrace由linux操作系统内核提供,可观察和控制其他进程的执行, 并且可以检查和修改其内核镜像和寄...
在Linux中,可以通过多种方式实现进程启动的hook,例如使用LD_PRELOAD环境变量、内核模块或者第三方工具如ptrace。 使用LD_PRELOAD LD_PRELOAD是一个环境变量,可以指定一个或多个库,在程序运行前加载这些库,从而可以hook程序中的函数调用。 代码语言:txt 复制 ...
通过ptrace,可以在进程执行的任何时刻插入自定义逻辑。 内核模块: 对于更底层的操作,可以编写内核模块来实现命令hook。这种方式可以拦截系统调用,但需要内核编程的知识。 相关优势 监控和审计: 可以记录命令的执行情况,用于安全审计或性能监控。 功能增强: 可以在不修改原程序的情况下增加新功能。 错误处理: 可以捕获并...