首页
社区
课程
招聘
[求助]关于ring3 HOOK LdrLoadDll 死锁的BUG
发表于: 2014-9-1 09:34 10844

[求助]关于ring3 HOOK LdrLoadDll 死锁的BUG

2014-9-1 09:34
10844
我加了一段ebp call stack检测的代码,根据ebp想得到对应的文件名

如果用for 4gb暴力扫描内存,客户端会比较卡所以不推荐.

所以最后想到Hook LdrLoadDll再记录基址 + 模块大小 + 文件名;

比如有些三方非法注入模块等,都不经过LoadLibrary/Ex,而在HOOK这个函数后极不稳定

typedef BOOL (WINAPI *fnGetModuleInformation)(HANDLE hProcess,HMODULE hModule,LPMODULEINFO lpmodinfo,DWORD cb);

//LdrLoadDll function prototype
typedef NTSTATUS (WINAPI *fnLdrLoadDll)(IN PWCHAR PathToFile OPTIONAL,IN ULONG Flags OPTIONAL,IN PUNICODE_STRING ModuleFileName,OUT PHANDLE ModuleHandle);  

//RtlInitUnicodeString function prototype
typedef VOID (WINAPI *fnRtlInitUnicodeString)(PUNICODE_STRING DestinationString,PCWSTR SourceString);  

HMODULE					hKernel32;
HMODULE					hPsapi;
HMODULE					hNTDLL;
fnLdrLoadDll			pLdrLoadDll;  
fnRtlInitUnicodeString	pRtlInitUnicodeString;
fnGetModuleInformation	pGetModuleInformation;

MODULEINFO	user32ModInfo = {0};  
char		szMsg[MAX_PATH] = {0x00};
char		szFileName[MAX_PATH] = {0x00};
DWORD		g_nCount = 0;

API_HOOK	LdrHook;

#define NT_SUCCESS(status)					((NTSTATUS)(status)>=0)

// 记录DLL文件名与模块信息
NTSTATUS newLdrLoadDll(IN PWCHAR PathToFile OPTIONAL,
	IN ULONG Flags OPTIONAL,
	IN PUNICODE_STRING ModuleFileName,
	OUT PHANDLE ModuleHandle)
{
	OutputDebugStringW(ModuleFileName->Buffer);
	OutputDebugStringW(L"\r\n");
	
	// 防止金山DLL注入
	//if(wcscmp(L"d:\\program files (x86)\\kingsoft\\kingsoft antivirus\\kwsui.dll",ModuleFileName->Buffer) == 0)
	//{
	//	ModuleHandle = NULL;
	//	return (NTSTATUS)0;
	//}

	NTSTATUS	 euRet;
	fnLdrLoadDll pLdrLoad = (fnLdrLoadDll)LdrHook.OrigFunction;
	euRet = pLdrLoad(PathToFile,Flags,ModuleFileName,ModuleHandle);

	if(NT_SUCCESS(euRet))
	{
		OutputDebugStringW(L"Success load");
		OutputDebugStringW(L"\r\n");

		/*g_nCount++;
		memset(szFileName,0x00,MAX_PATH);
		if(!pGetModuleInformation(GetCurrentProcess(), (HMODULE)&ModuleHandle,&user32ModInfo, sizeof(user32ModInfo)))
			return euRet;

		wcharTochar(ModuleFileName->Buffer,szFileName,ModuleFileName->Length);
		AddModule(szFileName,(DWORD)&user32ModInfo.EntryPoint,user32ModInfo.SizeOfImage);*/
	}

	return euRet;
}

void	InitLdrLoadDll()
{
	if(hKernel32 == NULL)
		hKernel32 = GetModuleHandleA("kernel32.dll");

	if(hPsapi == NULL)
		hPsapi = LoadLibraryA("Psapi.dll");

	if(pGetModuleInformation == NULL)
	{
		pGetModuleInformation = (fnGetModuleInformation)GetProcAddress (hKernel32,"GetModuleInformation");
		if(pGetModuleInformation == NULL)
			pGetModuleInformation = (fnGetModuleInformation)GetProcAddress (hPsapi,"GetModuleInformation");
	}

	if(pGetModuleInformation == NULL)
	{
		MessageBoxA(NULL,"pGetModuleInformation == NULL",NULL,NULL);
		return;
	}

	if (hNTDLL == NULL) 
		hNTDLL = GetModuleHandleA("ntdll.dll");

	if (pLdrLoadDll == NULL)
	{
		pLdrLoadDll = (fnLdrLoadDll)GetProcAddress (hNTDLL,"LdrLoadDll");
	}

	if (pRtlInitUnicodeString == NULL)
		pRtlInitUnicodeString = (fnRtlInitUnicodeString)GetProcAddress (hNTDLL,"RtlInitUnicodeString"); 

	InitAPIHook(&LdrHook,"ntdll.dll","LdrLoadDll",newLdrLoadDll);
	StartAPIHook(&LdrHook);
}

void UnHook()
{

}


下面是我整理的测试工程源码:

哪位达人帮忙调一下,不盛感激!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 256
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
使用Mhook 或者EasyHook 还支持x64,多方便省事!
2014-9-1 10:19
0
雪    币: 5
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2014-9-1 12:13
0
雪    币: 1205
活跃值: (983)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
感谢,不过EH带了DLL和SYS有些不方面,尽量还是在R3的代码处理和静态lib库
2014-9-2 10:36
0
雪    币: 121
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
OutputDebugStringW 这种东西会重入的.hook底层函数都有这个问题!
2014-9-4 21:03
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
各种重入。。。。
防止第三方还是挂映像回调靠谱,做r3随便就被日了。。。。
2014-9-4 21:30
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
各种重入。。。。
防止第三方还是挂映像回调靠谱,做r3随便就被日了。。。。
2014-9-4 21:34
0
雪    币: 40
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
→_→硬断+veh试试
2014-9-15 18:28
0
游客
登录 | 注册 方可回帖
返回
//