欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][反应用层反外挂]禁用你的DLL_THREAD_ATTACH

[原创][反应用层反外挂]禁用你的DLL_THREAD_ATTACH

《win核心编程》里介绍DLL_THREAD_ATTACH的时候说过一个函数
BOOL DisableThreadLibraryCalls(
  HMODULE hModule  // handle to DLL module
);
他可以禁用某个模块的DLL_THREAD_ATTACH,但是它只能在本进程操作。
稍微跟了下,其实就是修改PEB->DllList->Flags,或了两个值0x40000、0x80000。
下面是一个测试工程。
我觉得应用层,不管你怎么反,只要能OpenProcess、Read、Write,总是可以揪到你的小丁丁的


BOOL MyDisableThreadLibraryCalls(HMODULE hMod)

{

	PEB* pPEB=NULL;

	PEB_LDR_DATA* pDllList=NULL;

	LIST_ENTRY* pFlink=NULL;

	LIST_ENTRY* pIndex=NULL;

	LDR_DATA_TABLE_ENTRY* pEntry=NULL;

	__asm

	{

		mov eax,fs:[0x30]

		mov pPEB,eax

	}

	pDllList=pPEB->DllList;

	//InLoadOrderLinks

	pFlink=&pDllList->InLoadOrderLinks;

	pIndex=pFlink->Flink;

	pEntry=NULL;

	while(pIndex!=pFlink)

	{

		pEntry=CONTAINING_RECORD(pIndex,LDR_DATA_TABLE_ENTRY,InLoadOrderLinks);

		if(hMod==pEntry->DllBase)

		{

			pEntry->Flags|=0x40000;

			pEntry->Flags|=0x80000;

		}

		pIndex=pEntry->InLoadOrderLinks.Flink;

	}

	//InMemoryOrderModuleList

	pFlink=&pDllList->InMemoryOrderModuleList;

	pIndex=pFlink->Flink;

	pEntry=NULL;

	while(pIndex!=pFlink)

	{

		pEntry=CONTAINING_RECORD(pIndex,LDR_DATA_TABLE_ENTRY,InMemoryOrderModuleList);

		if(hMod==pEntry->DllBase)

		{

			pEntry->Flags|=0x40000;

			pEntry->Flags|=0x80000;

		}

		pIndex=pEntry->InMemoryOrderModuleList.Flink;

	}

	//InInitializationOrderModuleList

	pFlink=&pDllList->InInitializationOrderModuleList;

	pIndex=pFlink->Flink;

	pEntry=NULL;

	while(pIndex!=pFlink)

	{

		pEntry=CONTAINING_RECORD(pIndex,LDR_DATA_TABLE_ENTRY,InInitializationOrderModuleList);

		if(hMod==pEntry->DllBase)

		{

			pEntry->Flags|=0x40000;

			pEntry->Flags|=0x80000;

		}

		pIndex=pEntry->InInitializationOrderModuleList.Flink;

	}

	return TRUE;

}


DllTest.rar

上传的附件 DllTest.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功