ptrace停止跟踪目标进程:ptrace系统调用以PTRACE_DETACH参数停止跟踪目标进程,将目标进程的状态切换回正常状态。ptrace主要用于以下几个方面:调试器:ptrace是调试器的基础,通过ptrace可以在调试器和被调试程序之间建立通信通道,实现断点、单步执行、查看和修改内存和寄存器等调试功能。进程监视工具:ptrace可以用于实现进程...
4) 重复步骤2)和步骤3); 5) tracer调用PTRACE_DETACH功能让tracee恢复运行,并解除关联。 步骤3)中tracer可以检查和修改tracee的内存和寄存器内容,给渗透攻击注入shellcode提供了可能,接下来描述利用ptrace隐藏注入shellcode的技术细节。 三、技术 达成隐藏注入shellcode的目标需要解决三个问题: 1) shellcode存放在哪里?
PTRACE_DETACH :要脱离的进程 ; 进程A 如果调用 ptrace 函数 , 传入 PTRACE_DETACH , 就会释放权限 , 发出信号 , 进程 B 恢复运行 ; 3、进程数据读写权限 读取进程数据权限 :PTRACE_PEEKTEXT、PTRACE_PEEKDATA、PTRACE_PEEKUSER 写入进程数据权限 :PTRACE_POKETEXT、PTRACE_POKEDATA、PTRACE_POKEUSER ...
读取和写入寄存器值 在通过 ptrace 改变远程进程执行流程前,需要先读取远程进程的所有寄存器值进行保存,在 detach 前向远程进程写入保存的原寄存器值用于恢复远程进程原有的执行流程 如下所示,为读取和写入寄存器值的 ptrace 调用,request 参数分别为PTRACE_GETREGS和PTRACE_SETREGS,pid为对应进程的 ID ptrace(PTRACE_GET...
return PTERR_DETACH_FAILED; } // 收尾操作 m_nPid = 0; return PTERR_SUCCESS; } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 需要状态返回变化时 , 才需要调用 waitpid() 方法 , 等待进程状态改变 ; 本操作不需要等待 被调试进程 状态返回变化 ; ...
ret = arch_ptrace(child, request, addr, data);if(ret || request != PTRACE_DETACH) ptrace_unfreeze_traced(child); out_put_task_struct: put_task_struct(child); out:returnret; } 从中可以看到整个代码逻辑比较简单,其中对PTRACE_TRACEME和PTRACE_ATTACH 是做特殊处理的,其他的就是对cpu架构的相关...
形式:ptrace(PTRACE_DETACH,pid) 描述:结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。 12) PTRACE_GETREGS 形式:ptrace(PTRACE_GETREGS, pid, 0, data) 描述:读取寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有17个基本寄存器的值。
形式:ptrace(PTRACE_DETACH,pid) 描述:结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。 12) PTRACE_GETREGS 形式:ptrace(PTRACE_GETREGS, pid, 0, data) 描述:读取寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有17个基本寄存器的值。
detach 调试进程 完整代码 : int CPtrace::detachProc(){// 如果当前没有被调试的进程 , 直接返回if (m_nPid == 0)return PTERR_SUCCESS;// detach 调试进程 , 如果脱离成功 , 直接返回if (ptrace(PTRACE_DETACH, m_nPid, NULL, 0) < 0) {return PTERR_DETACH_FAILED;}// 收尾操作m_nPid = ...
在通过ptrace改变远程进程执行流程前,需要先读取远程进程的所有寄存器值进行保存,在detach时向远程进程写入保存的原寄存器值用于恢复远程进程原有的执行流程。 如下所示,为读取和写入寄存器值的ptrace调用,request参数分别为PTRACE_GETREGS和PTRACE_SETREGS,pid为对应进程的ID。