0

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;
}
4

2 に答える 2

0

ptraceは少し醜いですが、便利な場合があります。

これがptraceのサンプルプログラムです。これは、I/O関連のシステムコールを一時停止するために使用されます。 http://stromberg.dnsalias.org/~strombrg/slowdown/

もちろんgdbを研究することもできますが、ISTRはかなり巨大です。

また、straceとltrace、特にシンボルがリストされているltraceをチェックすることもできます。

HTH

于 2012-10-25T19:35:42.227 に答える
0

おそらく、特定の実行可能ファイル(おそらく共有オブジェクト)に存在する関数を呼び出したいと思うでしょう。したがって、最初に、この実行可能ファイルが使用してマップされているベースアドレスを見つける必要があります

/proc/pid/maps

その後、関心のある関数のローカルオフセットを見つける必要があります。これは、次の2つの方法で実行できます。

  1. ELFファイル形式(Linuxネイティブ実行可能形式)を理解し、マップされたファイルを使用して目的の関数を検索します(これにはある程度の専門知識が必要です)
  2. すぐに使用できるelfparser(おそらくreadelfツール)を使用して、実行可能ファイルの下で関数オフセットを取得します。このツールは通常、実行可能ファイルが特定のアドレスにマップされているかのようにアドレスを提供するため、実際のローカルオフセットを把握する必要があることに注意してください。
于 2019-11-28T20:26:18.813 に答える