利用修改版本的loaddll.exe限制DLL装入到指定地址[分享]
发表于:
2005-9-15 15:20
8855
利用修改版本的loaddll.exe限制DLL装入到指定地址[分享]
利用修改版本的loaddll.exe限制DLL装入到指定地址
原始版本的loaddll.exe只是简单的LoadLibrary, 地址由系统指定, 对于同一个DLL,
你会发现每次装入的地址是一致的, 而使用DLL重定位向修复工具ReloX需要两个不同的
ImageBase的Dump, 因此将DLL限制装入到指定地址是有必要的.
这个修改版本的loaddll.exe可以帮你玩成这个工作.
//======================================================================
//=>如何使用?
//
1. 第一次装入
第一次装入DLL, 这个时候我们可以在OEP出做第一Dump, Dump_1.dll;
我们此时看一下DLL的ImageBase(Alt+E), 记为ImageBaseA;
2. 修改loaddll.exe.
修改RVA=00010084(VA=00410084,Offset=00000684)处的值, 将ImageBaseA按低位在前的顺序填入.
(例如,ImageBaseA=01770000,则一次填入 00 00 77 01), 保存修改.
3. 第二次装入
第二次装入DLL, 我们做第二次Dump, Dump_2.dll;
很显然, Dump_1.dll, Dump_2.dll不一样; 这是可以利用ReloX进行重定位修复.
4. 平时工作
平时可以将那个值使用一个特别的值, 比如kernel.dll的ImageBase或者其他也许会好一点,
你也可以不管它.
//======================================================================
//=>限制原理?
//
利用VirtualAlloc将指定的虚拟内存区域分配出来, 让系统重新找一块地址给要装入的DLL,
并在DLL装入完成后释放分配的虚拟内存.
Patch函数我们暂且称为LoadDllEx, 函数原型为
_stdcall HMODULE LoadDllEx(lpMem: LPVOID);//C++描述
function LoadDllEx(lpMem: Pointer): HINSTANCE; stdcall;//Delphi描述
完成内存分配和释放并在中间装入DLL.
为了便于函数描述, 还将原LoadDll.exe中的Load部分定义为LoadDll; 函数原型描述为
_stdcall HINSTANCE LoadDll();//C++描述
function LoadDll(): HINSTANCE;stdcall;//Delphi描述
完成命令行解析和DLL装入.
函数描述:
//C++描述
_stdcall HMODULE LoadDllEx(lpMem: LPVOID);
{
LPVOID pMem;
HMODULE hDll;
pMem = VirtualAlloc(lpMem,0x1000,MEM_RESERVE,PAGE_READONLY);
hDll = LoadDll();
VirtaulFree(pMem,0,MEM_RELEASE);
return hDll;
}
//Delphi描述
function LoadDllEx(lpMem: Pointer): HINSTANCE; stdcall;
var
pMem: Pointer;
begin
pMem := VirtualAlloc(lpMem,$1000,MEM_RESERVE,PAGE_READONLY);
Result := LoadDll();
VirtaulFree(pMem,0,MEM_RELEASE);
end;
//======================================================================
//=>如果OD自身本来就提供这个参数就更方便了
//附件:loaddll.rar
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课