內存加載Dll

幾年前寫過一份內存加載PE文件的項目,支持exe和dll,但不支持mfc dll 去年整理了一下重新寫了代碼,省略了一些功能,只用來加載dll

編譯環境:

  • VS2005
  • VC6.0

支持:

  • 標準Win32動態鏈接庫
  • MFC動態鏈接庫
  • 易語言動態鏈接庫
  • 其他Dll(未經測試)。

我不會支持它:

  • 加密動態鏈接庫
  • 壓縮DLL(具體參見壓縮過程)

文件:包含/LDR.H

/* __ldr_header__ */

#ifndef __LDR_H__

#define __LDR_H__

#ifdef _DEBUG

#pragma comment(lib, "image.d.lib")

#else

#pragma comment(lib, "image.lib")

#endif

#ifdef _WIN32

#include

#include

#include

#include

#include

#else

#error Current platform is not supported

#endif

typedefPVOID(__stdcall *malloc_t) (ULONG);

typedefVOID (__stdcall *free_t) (PVOID);

PVOID LdrLoadImage (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);

PVOID LdrGetProcAddress (PVOID Addr, LPCSTR Name);

VOID LdrFreeImage (PVOID Addr);

#endif

動態鏈接庫處理接口

PVOID LdrLoadImage (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);

PVOID LdrGetProcAddress (PVOID Addr, LPCSTR Name);

VOID LdrFreeImage (PVOID Addr);

在發送一個POST之前,使用易語言封裝編譯的LIB測試的內存加載DLL。

內存加載Dll

項目源代碼(讀取原始視圖)

順便說一下,MFC DLL的支持主要是處理GETMODEM句柄相關API,中間層。

文件:圖像/陷阱/GETMODEM HANDLW.ASM

.386

.Model flat, StdCall

Option CaseMap: none

Include trap.inc

.Const

.Data?

.Data

.Code

GetModuleHandleWTrap Proc Uses Ebx Ecx Edx Esi Edi, lpModuleName: Ptr WCHAR

; Mov Esi, 0x********

Mov_Esi_Information

; Pointer to ImageInformation

Assume Esi: Ptr ImageInformation

.If lpModuleName == 0

Push 0

Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure

.Else

Lea Ebx, [Esi].ModuleNameW

Push Ebx

Push lpModuleName

Call [Esi].apis.lstrcmpiW

Cmp Eax, 0

Je __COPY

Lea Ebx, [Esi].ModuleBaseNameW

Push Ebx

Call [Esi].apis.lstrcmpiW

Cmp Eax, 0

Jne __CALL

__COPY:

Mov Eax, [Esi].imagebase

Jmp @F

__CALL:

@@:

.EndIf

Return Eax

GetModuleHandleWTrap EndP

End

有些人一定認為為什麼不支持X64,主要是因為他們通常沒有那麼多的時間去做,要去工作,總是要迭代來支持壓縮加密等等,已經擱置了,嘿嘿


分享到:


相關文章: