나는 단지 ptrace()
호출을 통해 읽기 및 쓰기 메모리를 테스트하고 있지만 아래 코드를 실행할 때 이와 같은 오류가 발생합니다. 당신이 볼 수 있듯이왜이 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()
의 코드 인라인을 썼다는),이 모든 코드는 잘 작동!
왜 이런 일이 발생했는지 아는 사람이 있습니까?
'readmem()'의 추적 코드는 읽는 주소를 인쇄해야합니다. –