当我正在研究这个问题时,我遇到了一个可能的想法ptrace,但是我无法正确理解ptrace与线程的交互方式.
假设我有一个给定的多线程主进程,我想附加到其中的特定线程(可能来自一个分叉的子进程).
我可以附加到特定的帖子吗?(手册在这个问题上有所不同.)
如果是这样,这是否意味着单步执行只会逐步完成一个线程的指令?它是否会停止所有进程的线程?
如果是这样,而我呼吁所有其他线程保持停止PTRACE_SYSCALL或PTRACE_SINGLESTEP,或者说所有的线程继续?有没有办法只在一个线程中前进,但保证其他线程保持停止状态?
基本上,我想通过强制所有线程停止来同步原始程序,然后通过单步执行一个跟踪线程来执行一小组单线程指令.
到目前为止,我的个人尝试看起来有点像这样:
pid_t target = syscall(SYS_gettid); // get the calling thread's ID
pid_t pid = fork();
if (pid > 0)
{
waitpid(pid, NULL, 0); // synchronise main process
important_instruction();
}
else if (pid == 0)
{
ptrace(target, PTRACE_ATTACH, NULL, NULL); // does this work?
// cancel parent's "waitpid" call, e.g. with a signal
// single-step to execute "important_instruction()" above
ptrace(target, PTRACE_DETACH, NULL, NULL); …Run Code Online (Sandbox Code Playgroud) 我刚刚开始在Linux中学习注入技术,并且想要编写一个简单的程序来将共享库注入到正在运行的进程中.(图书馆只会打印一个字符串.)然而,经过几个小时的研究,我找不到任何完整的例子.好吧,我确实弄清楚我可能需要使用ptrace()暂停进程并注入内容,但不知道如何将库加载到目标进程的内存空间和C代码中的重定位内容.有谁知道共享库注入的任何好资源或工作示例?(当然,我知道可能有一些像hotpatch这样的现有库可以用来使注入更容易,但这不是我想要的)
如果有人可以写一些伪代码或给我一个例子,我会很感激.谢谢.
PS:我不是在问LD_PRELOAD技巧.