幾年前寫過一份內存加載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。
項目源代碼(讀取原始視圖)
順便說一下,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,主要是因為他們通常沒有那麼多的時間去做,要去工作,總是要迭代來支持壓縮加密等等,已經擱置了,嘿嘿
閱讀更多 生活幫幫樂 的文章