2014-12-17

DLL呼び出しの調査

Windows のアプリケーションについて, どのような振舞をするのか解析したいということがある. そのとき, DLL呼び出しをログにとることができると便利である.

中間者攻撃DLLの作成

攻撃対象のDLL名 x.dll とし, エクスポートしているAPIが既知であるとする. まず, 以下のようなソース mitm.c を書く.
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"

#define ACTUAL "x-actual.dll"

static int state = 0;
static FILE *fp = NULL;

static int (*f1)(int) = NULL;

static void fin()
{
    if(fp) {
        fclose(fp);
    }
    fp = 0;
}

static void init()
{
    HANDLE h = LoadLibrary(ACTUAL);
    if(h) {
        f1 = (int(*)(int))GetProcAddress(h, "func1");
        // do not call FreeLibrary(h);
    }

    fp = fopen("evadll-mitm.log", "w");
    state = 1;
    atexit(fin);
}

#define log(fmt, ...) if(fp) { fprintf(fp, fmt, __VA_ARGS__); fflush(fp); }

int WINAPI func1(int value)
{
    if(!state) init();
    int ret = f1 ? f1(value) : 0;
    log("func1(%d)=%d\n", value, ret);
    return ret;
}
攻撃対象のDLLをx-actual.dllにリネームする. 以下のコマンドで, コンパイルする.
i686-w64-mingw32-gcc  -shared -o x.dll mitm.c -Wl,-k

TODO

LDPRELOADのような機能を使えば, もっと色々できるかもしれない.

Tips

GCCでは, エクスポートする関数名に@がついてしまうのだが, この記事によると, -Wl,-kをつけると@以降が消えると教えてくれた.

LoadLibrary などの使用方法はこのページを参考にした.

0 件のコメント:

コメントを投稿