dll injection対策(anti dll injection)
setWindowsHookEx や CreateRemoteThread などで邪悪なdllを差し込まれることがあります。
こいつに対抗する anti dll injectionについて考えたいと思います。
海外のフォーラムでは LdrLoadDll を書き変えて CHAR pRet[]={0xC3}; つまり ret 命令にしたりしています。
これでもいいんですが、 これでは、winsock や gdiplus といった遅延読み込みする dll も、読み込みを拒絶してしまい、プログラムがまともに動かないことがあります。
特定の dll だけ狙い打ちに外させる方法はないでしょうか?
sexyhookならばできます。
具体的にはこんな感じです。
#include <windows.h> #include <Ntsecapi.h> // for PUNICODE_STRING #include "sexyhook.h" //dll injection無効化 void antiDllInjection() { static SEXYHOOK_BEGIN(int,SEXYHOOK_STDCALL,SEXYHOOK_DYNAMICLOAD ("NTDLL.dll","LdrLoadDll"),(PWCHAR PathToFile,ULONG Flags,PUNICODE_STRING ModuleFileName,PHANDLE ModuleHandle)) { //気に食わないdllはロードさせない. if (wcsstr(ModuleFileName->Buffer ,L"ロードさせたくない邪悪な.dll" ) != NULL) { return 0; //ロード禁止 } //それ以外はふつーにロードするよ //一時的にフックを解除 SEXYHOOK_UNHOOK(); //元の関数を呼び出す return CallOrignalFunction(PathToFile,Flags,ModuleFileName,ModuleHandle); } SEXYHOOK_END(); } void main() { //dll injection無効化 antiDllInjection(); //以後自分の好きなプログラム }
LdrLoadDll をフックするところまではおんなじです。
sexyhookはフックした中身に好きな事がかけるので、自分がいらないと思うdllだけを狙い撃ちで外すことができます。
まぁ、通常のAPIフックでも同じことができるんでしょうけどね・・・・
sexyhookはヘッダファイルを一つ読みこむだけで、簡単に実現で来てしまうって所がsexyで良い感じです。(自画自賛w)
気に食わないdllを外すだけではなく、ホワイトリストみたいに、自分が信頼するdllしか読み込ませないみたいなこともできると思います。
一旦 dll injectionされてしまうと、自分のプログラムを好き勝手荒らされたり、盗聴されたり、なんでもできるので、こうやって防壁を作ってみるのも面白いのではないでしょうか?
あと、 return 0 のところに、邪悪なdllを破壊するようなコードを書くと、攻性防壁ができるかもしれませんが、システムが不安定になるかもしれない、諸刃の剣。VMで試しましょう。