功能:基于ptrace的热补丁技术主要通过跟踪和修改目标进程的执行,实现对进程的调试和修改。通过ptrace,可以读取和修改进程的寄存器、内存和执行状态等信息,从而实现代码注入、函数替换等操作。而基于mmap的热补丁技术主要通过将新的代码段映射到目标进程的内存空间中,实现对进程的扩展和修改。 实现机制:基于ptrace的热补丁技...
void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);void*dlopen(constchar*pathname,intmode);void*dlsym(void*handle,constchar*symbol);intdlclose(void*handle); 在调用函数前,首先需要获得这些函数在远程进程中的地址 mmap函数在/system/lib/libc.so模块中 dlopen, dlsym, dlclose函数在...
0, 0)// 修改系统调用为SYS_mmap并单步执行,执行完成以后恢复执行原有代码mem_addr = remote_mmap(tracee_pid, NULL, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0)// 写入shellcode到申请的内存段poke_text(tracee_pid, (size_t) mem_addr, shellcode, SHELL_LEN)...
{9, "mmap"}, {10, "mprotect"}, {11, "munmap"}, {12, "brk"}, {13, "rt_sigaction"}, {14, "rt_sigprocmask"}, {15, "rt_sigreturn"}, {16, "ioctl"}, {17, "pread64"}, {18, "pwrite64"}, {19, "readv"}, {20, "writev"}, {21, "access"}, {22, "pipe"}, {23,...
其中,11号系统调用就是execve,45号是brk,192是mmap2,33是access,5是open...经过比对可以发现,和strace的输出结果一样。当然strace进行了更详尽和完善的处理,我们这里只是揭示其原理,感兴趣的同学可以去研究一下strace的实现。 PS: 1). 在系统调用执行的时候,会执行pushl %eax # 保存系统调用号ORIG_EAX在程序用...
1) 获取目标进程中mmap地址 2) 把mmap参数据放入r0-r3,另外两个写入目标进程sp 3) pc设置为mmap地址,lr设置为0 4) 把准备好的寄存器写入目标进程(PTRACE_SETREGS),并启动目标进程运行(PTRACE_CONT) 5) 分配的内存首地址位于r0 (PTRACE_GETREGS)
系统调用号 函数名 入口点 源码...12 brk sys_brk mm/mmap.c... 上面的程序只跟踪了一个系统调用,那么怎么跟踪所有的系统调用呢?很简单,只需要把跟踪的代码放到一个无限循环中即可。代码如下: #include <sys/ptrace.h>#include <sys/user.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>...
mmap_addr = GetRemoteFuncAddr(pid, libc_path, (void *)mmap); //LOGD("mmap RemoteFuncAddr:0x%lx", (long)mmap_addr); 1. 2. 3. 获取远程进程与本进程都加载的模块中函数的地址,计算方法是远程模块函数地址=本进程函数的绝对地址-本进程模块加载地址+远程进程模块的加载地址 ...
{9, "mmap"}, {10, "mprotect"}, {11, "munmap"}, {12, "brk"}, {13, "rt_sigaction"}, {14, "rt_sigprocmask"}, {15, "rt_sigreturn"}, {16, "ioctl"}, {17, "pread64"}, {18, "pwrite64"}, {19, "readv"}, {20, "writev"}, {21, "access"}, {22, "pipe"}, {23,...
如果前面调用mmap分配内存空间不成功的处理。 如果调用mmap分配内存空间成功,则调用munmap释放内存空间,方法和前面调用mmap相同。 处理完后,调用PTRACE_SETREGS(常量值为13)恢复目标进程的原始寄存器值,然后通过sub_B89C函数停止对目标进程的调试,也解除了目标进程的调试状态。至此,ptrace的模块注入功能已经完整结束。 四...