利用LdrLoadLibrary加载与隐藏DLL (绕过API HOOK LoadLibrary)

//#include "stdafx.h"

#include <Windows.h> 
  
typedef struct _UNICODE_STRING { // UNICODE_STRING structure   
    USHORT Length;  
    USHORT MaximumLength;  
    PWSTR  Buffer;  
} UNICODE_STRING;  
typedef UNICODE_STRING *PUNICODE_STRING;  

typedef LONG NTSTATUS;

//
// Loader Data Table Entry
//
typedef struct _LDR_DATA_TABLE_ENTRY
{
	LIST_ENTRY InLoadOrderLinks;
	LIST_ENTRY InMemoryOrderModuleList;
	LIST_ENTRY InInitializationOrderModuleList;
	PVOID DllBase;
	PVOID EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING FullDllName;
	UNICODE_STRING BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT TlsIndex;
	union
	{
		LIST_ENTRY HashLinks;
		PVOID SectionPointer;
	};
	ULONG CheckSum;
	union
	{
		ULONG TimeDateStamp;
		PVOID LoadedImports;
	};
	PVOID EntryPointActivationContext;
	PVOID PatchInformation;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

typedef struct _PEB_LDR_DATA {
	ULONG                   Length;
	BOOLEAN                 Initialized;
	PVOID                   SsHandle;
	LIST_ENTRY              InLoadOrderModuleList;          //按加载顺序
	LIST_ENTRY              InMemoryOrderModuleList;        //按内存顺序
	LIST_ENTRY              InInitializationOrderModuleList;//按初始化顺序
	PVOID          EntryInProgress;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

//每个模块信息的LDR_MODULE部分
typedef struct _LDR_MODULE {
	LIST_ENTRY              InLoadOrderModuleList;          
	LIST_ENTRY              InMemoryOrderModuleList;        
	LIST_ENTRY              InInitializationOrderModuleList;
	PVOID                   BaseAddress;
	PVOID                   EntryPoint;
	ULONG                   SizeOfImage;
	UNICODE_STRING          FullDllName;
	UNICODE_STRING          BaseDllName;
	ULONG                   Flags;
	SHORT                   LoadCount;
	SHORT                   TlsIndex;
	LIST_ENTRY              HashTableEntry;
	ULONG                   TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;

VOID HideModule(HMODULE hLibrary)
{
	PPEB_LDR_DATA	pLdr = NULL;
	PLDR_MODULE		FirstModule = NULL;
	PLDR_MODULE		GurrentModule = NULL;
	__try
	{
		__asm
		{
			mov esi, fs:[0x30]
			mov esi, [esi + 0x0C]
			mov pLdr,esi
		}

		FirstModule = (PLDR_MODULE)(pLdr->InLoadOrderModuleList.Flink);
		GurrentModule = FirstModule;
		while(!(GurrentModule ->BaseAddress == hLibrary))
		{
			GurrentModule = (PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Blink);
			if(GurrentModule == FirstModule)
				break;
		}
		if(GurrentModule->BaseAddress != hLibrary) 
			return;

		//Dll解除链接
		((PLDR_MODULE)(GurrentModule -> InLoadOrderModuleList.Flink))->InLoadOrderModuleList.Blink = GurrentModule -> InLoadOrderModuleList.Blink;
		((PLDR_MODULE)(GurrentModule->InLoadOrderModuleList.Blink))->InLoadOrderModuleList.Flink = GurrentModule->InLoadOrderModuleList.Flink;
		
		memset(GurrentModule->FullDllName.Buffer, 0, GurrentModule->FullDllName.Length);
		memset(GurrentModule, 0, sizeof(PLDR_MODULE));
	}

	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		return;
	}
}

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

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


HMODULE					hntdll;  
fLdrLoadDll				_LdrLoadDll;  
fRtlInitUnicodeString	_RtlInitUnicodeString;  

HMODULE LoadDll(LPCSTR lpFileName)
{  
    if (hntdll == NULL) 
	{
		hntdll = GetModuleHandleA("ntdll.dll");
	}  

    if (_LdrLoadDll == NULL) 
	{
		_LdrLoadDll = (fLdrLoadDll)GetProcAddress (hntdll,"LdrLoadDll");
	}  

    if (_RtlInitUnicodeString == NULL)  
    {
		_RtlInitUnicodeString = (fRtlInitUnicodeString)GetProcAddress (hntdll,"RtlInitUnicodeString");
	}  
	
    int StrLen = lstrlenA(lpFileName);  
    BSTR WideStr = SysAllocStringLen(NULL, StrLen);  
    MultiByteToWideChar(CP_ACP, 0, lpFileName, StrLen, WideStr, StrLen);  
	
    UNICODE_STRING usDllName;  
    _RtlInitUnicodeString(&usDllName, WideStr);  
    SysFreeString(WideStr);  
	
    HANDLE DllHandle;  
    _LdrLoadDll(0, 0, &usDllName, &DllHandle);  
	
    return (HMODULE)DllHandle;  
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	HMODULE hMydll = LoadDll("Test.dll");
	HideModule(hMydll);
	MessageBox(NULL,"Hello",NULL,NULL);
	return 0;
}

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
利用hook api屏幕取词是指通过使用hook技术来实时监控屏幕上的文字内容,从而实现快速、准确地获取屏幕上的文字。一般情况下,这种技术常用于自动化办公、屏幕录制、辅助识别等需求。 具体实现利用hook api屏幕取词时,首先需要通过编程语言提供的相关接口,如Windows API等,来监控屏幕画面的变化。接下来,需要注册一个在屏幕发生变化时被调用的回调函数。这个回调函数能够获取到发生变化的画面区域的截图,并通过OCR(Optical Character Recognition,光学字符识别)技术将截图中的文字转化为可供程序理解的文本。 在获取到OCR结果后,可以进一步处理这些文字,如进行关键字提取、语义分析等。通过利用hook api屏幕取词,可以帮助用户快速实现对屏幕上文字内容的提取和处理,提高工作效率和准确性。 然而,需要注意的是,利用hook api屏幕取词也有一些限制。首先,由于需要实时监控屏幕画面,这种方法可能对计算资源有较高的需求。其次,OCR技术受到字体、分辨率、语言等因素的影响,可能会产生一定的识别误差。再次,使用hook技术在某些场景下可能会涉及到安全和隐私问题,需谨慎使用并遵守相关法律法规。 综上所述,利用hook api屏幕取词是一种实现屏幕文字提取的方法,通过hook技术实时监控屏幕变化,并结合OCR技术将截图中的文字转化为可供程序理解的文本。尽管存在一些限制和风险,但在合理的应用场景下,它能有效提高工作效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪宁宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值