akumasign-blog
akumasign-blog
AkumaSign
2 posts
逆向Delphi
Don't wanna be here? Send us removal request.
akumasign-blog · 9 years ago
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
akumasign-blog · 11 years ago
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