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で試しましょう。

余談

そういえば、windows7 って、「管理者で実行」すると一般ユーザ権限でフックを掛けてくるアプリからフックされずに済むよね。
例えば、かざぐるマウスみたいなフックアプリを入れてIEを管理者で立ち上げてみると、マウスジェスチャ無効になっているので確認できると思う。