2012-10-29 4 views
0

나는 단지 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()의 코드 인라인을 썼다는),이 모든 코드는 잘 작동!

왜 이런 일이 발생했는지 아는 사람이 있습니까?

+1

'readmem()'의 추적 코드는 읽는 주소를 인쇄해야합니다. –

답변

2

약간 이상하게 보이지만 코드에 실제 오류가 하나 이상 있습니다. 매뉴얼 페이지에서 :

오류시 모든 요청은 -1을 반환하고 errno는 적절하게 설정됩니다. 성공적인 PTRACE_PEEK * 요청에 의해 반환 된 값은 -1 일 수 있기 때문에 호출자는 오류가 발생했는지 여부를 결정하기 위해 이러한 요청 후에 errno를 확인해야합니다.

코드가 errno을 확인하지 않은 것 같습니다. 반환 값이 -1 인 경우 오류가 발생했다고 가정합니다.

관련 문제