这种用法没接触过,能否详细的解释一下,尤其事ImteFromHModule = (XPROC)GetProcAddress(hModule, "_ImteFromHModule@4")这一句的用途,谢谢typedef DWORD (__stdcall *XPROC)(DWORD);// Converts an HMODULE under Win32s to a base address in memory
DWORD GetModuleBaseFromWin32sHMod(HMODULE hMod)
{
XPROC ImteFromHModule, BaseAddrFromImte;
HMODULE hModule;
DWORD imte;
hModule = GetModuleHandle("W32SKRNL.DLL");
if( !hModule )
return 0;
ImteFromHModule = (XPROC)GetProcAddress(hModule, "_ImteFromHModule@4");
if ( !ImteFromHModule )
return 0;
BaseAddrFromImte = (XPROC)GetProcAddress(hModule, "_BaseAddrFromImte@4");
if ( !BaseAddrFromImte )
return 0; imte = ImteFromHModule( (DWORD)hMod);
if ( !imte )
return 0;
return BaseAddrFromImte(imte);
}
DWORD GetModuleBaseFromWin32sHMod(HMODULE hMod)
{
XPROC ImteFromHModule, BaseAddrFromImte;
HMODULE hModule;
DWORD imte;
hModule = GetModuleHandle("W32SKRNL.DLL");
if( !hModule )
return 0;
ImteFromHModule = (XPROC)GetProcAddress(hModule, "_ImteFromHModule@4");
if ( !ImteFromHModule )
return 0;
BaseAddrFromImte = (XPROC)GetProcAddress(hModule, "_BaseAddrFromImte@4");
if ( !BaseAddrFromImte )
return 0; imte = ImteFromHModule( (DWORD)hMod);
if ( !imte )
return 0;
return BaseAddrFromImte(imte);
}
取得.dll中函数的指针,第一个参数是.dll的模块句柄,第二个参数为函数名称。
当使用__stdcall将C函数输出时,Microsoft编译器就会改变函数的名字.
设置一个前导"_" 再加一个后缀"@",后面的数子,表示作为参数传递给函数的
字节数.
呵呵,看来写这个代码的家伙是高手.