我只是通过ptrace()
调用来测试读写内存,但是当我运行下面显示的代码时,我得到了这样的错误。
Processkey() : 0x80481240
readmem pid 3950
Original opcode : 0x4641682b
writemem pid 3950
readmem pid 3950
PEEKDATA error: No such file or directory
如您所见,readmem()
工作正常,但之后,readmem()
会输出错误。
long readmem(int pid, unsigned long addr)
{
long ret=0;
printf("readmem pid %d\n", pid);
ret = ptrace(PTRACE_PEEKDATA, pid, (void *)(addr), 0);
if(ret<0)
{
error("PEEKDATA error");
}
return ret;
}
void writemem(int pid, unsigned long addr, long data)
{
long ret=0;
printf("writemem pid %d\n", pid);
ret = ptrace(PTRACE_POKEDATA, pid, (void *)addr, (void *)data);
if(ret<0)
{
error("POKEDATA error");
}
}
void detach(int pid)
{
long ret=0;
ret = ptrace(PTRACE_DETACH, pid, NULL, NULL);
if(ret<0)
{
error("detach() error");
}
}
void attach(int pid)
{
long ret=0;
ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
if(ret<0)
{
error("ptrace() error");
}
ret = waitpid(pid, NULL, WUNTRACED);
if(ret<0)
{
error("waitpid ()");
}
}
int main(int argc, char **argv)
{
long ret = 0;
pid_t pid = 0;
REGS *regs;
unsigned long processkey_addr = 0;
int stat_value = 0;
long op = 0;
pid = atoi(argv[1]);
processkey_addr = 0x80481240;
printf("Processkey() : 0x%lx\n", processkey_addr);
attach(pid);
op = readmem(pid, processkey_addr);
printf("Original opcode : 0x%lx\n", op);
writemem(pid, processkey_addr, 0x41424344);
printf("Changed opcode : 0x%lx\n", readmem(pid, processkey_addr));
detach(pid);
}
但是 - 这让我很疯狂 - 当我在没有函数的情况下测试代码时(只是在main()
中编写内联代码),整个代码运行良好!
有谁知道为什么会发生这种情况......?
答案 0 :(得分:3)
看起来有点奇怪,但代码中至少有一个实际错误。从手册页:
出错时,所有请求都返回-1,并且正确设置了errno。由于成功的PTRACE_PEEK *请求返回的值可能为-1,因此调用者必须在此类请求之后检查errno以确定是否发生错误。
您的代码似乎没有检查errno
,它只是假设如果返回值为-1则发生错误。