2012-10-25 50 views
0

我想從使用ptrace()調用的用戶定義函數捕獲信息。linux ptrace()獲取函數信息

但函數地址不穩定(因爲ASLR)。

我怎樣才能以編程方式獲得另一個程序的功能信息,比如gdb?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/user.h> 
#include <sys/wait.h> 
#include <sys/ptrace.h> 
#include <dlfcn.h> 
#include <errno.h> 

void error(char *msg) 
{ 
    perror(msg); 
    exit(-1); 
} 

int main(int argc, char **argv) 
{ 
    long ret = 0; 
    void *handle; 
    pid_t pid = 0; 
    struct user_regs_struct regs; 
    int *hackme_addr = 0; 

    pid = atoi(argv[1]); 

    ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL); 
    if(ret<0) 
    { 
     error("ptrace() error"); 
    } 

    ret = waitpid(pid, NULL, WUNTRACED); 
    if(ret<0) 
    { 
     error("waitpid()"); 
    } 

    ret = ptrace(PTRACE_GETREGS, pid, NULL, &regs); 
    if(ret<0) 
    { 
     error("GETREGS error"); 
    } 

    printf("EIP : 0x%x\n", (int)regs.eip); 

    ptrace(PTRACE_DETACH, pid, NULL, NULL); 

    return 0; 
} 

回答

0

ptrace有點難看,但它可能有用。

這是一個ptrace示例程序;它用於使I/O相關的系統調用暫停。 http://stromberg.dnsalias.org/~strombrg/slowdown/

你當然也可以學習gdb,但是ISTR很大。

您也可以查看strace和ltrace,因爲它列出了符號,所以可能特別是ltrace。

HTH