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 などの使用方法は
このページを参考にした.