Text
Delphi GetProcAddress x86/x64
原版在这:http://bbs.pediy.com/showthread.php?t=121226
我只是翻译了一个Delphi版,支持x86/x64,代码如下:
function MyGetProcAddress(hModule: UInt64; lpProcName: LPCSTR): UInt64; type TDwordArray = array[0..8191] of dword; PDwordArray = ^TDwordArray; label __xuhao, __exit11; var pIDH: PImageDosHeader; pINH: PImageNtHeaders; pIED: PImageExportDirectory; dwExportRVA, dwExportSize: UInt64; pAddressOfFunction, pAddressOfNames: PDwordArray; dwNumberOfNames, dwBase: UInt64; pAddressOfNameOrdinals: PWordArray; dwName: UInt64; ProcName: AnsiString; i: Integer; strFunction: PAnsiChar; pRet: UInt64; TempDll, TempFunction: AnsiString; h: Cardinal; begin Result := 0; pIDH := PImageDosHeader(hModule); pINH := PImageNtHeaders(hModule + pIDH._lfanew); pIED := PImageExportDirectory(hModule + pINH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); dwExportRVA := pINH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; dwExportSize := pINH.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size; pAddressOfFunction := PDwordArray(pIED.AddressOfFunctions + hModule); pAddressOfNames := PDwordArray(pIED.AddressOfNames + hModule); dwNumberOfNames := pIED.NumberOfNames; dwBase := pIED.Base; pAddressOfNameOrdinals := PWordArray(pIED.AddressOfNameOrdinals + hModule); //这个是查一下是按照什么方式(函数名称or函数序号)来查函数地址的 dwName := DWORD(lpProcName); if dwName and $FFFFFFFFFFFF0000 = 0 then goto __xuhao; ProcName := lpProcName; for i := 0 to integer(dwNumberOfNames) - 1 do begin strFunction := PAnsiChar(pAddressOfNames[i] + hModule); if strFunction = ProcName then begin pRet := pAddressOfFunction[pAddressOfNameOrdinals[i]] + hModule; goto __exit11; end; end;__xuhao: //这个是通过以序号的方式来查函数地址的 if (dwName < dwBase) or (dwName > dwBase + pIED.NumberOfFunctions - 1) then exit; pRet := pAddressOfFunction[dwName - dwBase] + hModule;__exit11: //判断得到的地址有没有越界 if (pRet < dwExportRVA + hModule) or (pRet > dwExportRVA + hModule + dwExportSize) then begin //越界了就返回之前找到的地址 Result := pRet; exit; end; //没有越界就取字符串中找'.',找到后用其中的dllname.funcname再做一次GetProcAddress TempDll := PAnsiChar(pRet); i := Pos('.', TempDll); if i < 1 then begin Result := pRet; exit; end; TempFunction := Copy(TempDll, i + 1, Length(TempDll) - i); TempDll := Copy(TempDll, 1, i - 1); h := LoadLibraryA(PAnsiChar(TempDll)); if h = 0 then begin Result := pRet; exit; end; Result := MyGetProcAddress(h, PAnsiChar(TempFunction)); end;
0 notes
Text
VMware虚拟机中反HackShield检测的设置
环境:
Host: Windows 7 x64 + VMware 10.0.0 build-1295980
Guest: WIndows XP SP3
测试目标: 冒险岛online(HackShield)
处理:
1.在VMware中创建虚拟机时,硬盘必须选择使用SCSI,启动虚拟机之前,在虚拟软驱中加载VMware安装目录下的Resources\vmscsi.flp,在进入xp安装程序时按F6加载软驱中的SCSI驱动,跟随引导安装到Windows Driver.否则无法正常安装windows xp.
2.安装完成进入系统并安装VM Tools,重启虚拟机.再次进入系统后,将注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000
中的DriverDesc的内容清空.并将同目录下的ProviderName内容修改为随意任意值.
3.搜索注册表HKEY_LOCAL_MACHINE及其所有子目录下所有内容���"VMware SVGA II"的键,修改为任意值,并将每个搜索结果所在目录下值为"VMware, Inc."的键(如果有的话)的值修改为任意.
4.将虚拟机关机,用记事本打开虚拟机的vmx文件,在其中加入如下内容
monitor_control.restrict_backdoor = "true"
至此重新启动虚拟机后,应该就可以正常运行冒险岛了.
其中步骤1非常重要,我曾经因为忽略掉了这个问题一直使用IDE测试耗费了90%的时间.
步骤2是网上大部分帖子都提到的方法.
步骤4是网上大部分帖子中提到的方法精简之后的结果.
0 notes