2

使用Russell Libby 的DisAsm32,反汇编过程/函数/方法只需将(一致的)指针传递给procedure TDisAsm.Disassemble(Address: Pointer; Size: Cardinal = 0);.

到目前为止,我已经设法反汇编任何任意过程/方法,即使是从加载的外部模块(BPL/DLL),只要它们被适当地导出。

从当前进程(由 windows loader 加载的 EXE 图像),我想获得一个指向 entrypoint 的有效指针

我想提出类似于IDR(交互式 Delphi 编译器)通过它的代码查看器选项卡提供的东西,但来自运行的 Exe 实例本身。

在此处输入图像描述

怎么做到呢?暂时我对 PE 结构不太满意(但我正在努力,相信我)并且想知道它们是否与目的相关。

4

2 回答 2

1

我自己的回答:

我想出了如下的工作解决方案

function TForm1.GetEntryPoint: Pointer;
var
  DosHeader: PImageDosHeader;
  NtHeaders : PImageNtHeaders;
  OptionalHeader: PImageOptionalHeader;
begin
  DosHeader := PImageDosHeader(HInstance + 0);
  NtHeaders := PImageNtHeaders(HInstance + Cardinal(DosHeader^._lfanew));
  OptionalHeader := PImageOptionalHeader(Cardinal(NtHeaders) + SizeOf(DWORD) + IMAGE_SIZEOF_FILE_HEADER);
  //
  Result := Pointer(HInstance + OptionalHeader^.AddressOfEntryPoint);
end;

边注:

SysInit.HInstance与以下相同System.MainInstance:我更喜欢它,因为它听起来更像 C/C++ 并且发现它对这种情况更有意义。

DisAsm32从EntryPoint反汇编时超越call @Halt0指令:它旨在反汇编函数/过程/方法,并将ret指令视为结束。

它的寓意:

我将寻找其他更具吸引力的反汇编程序,例如BeaEngine,并继续保持下去。

于 2012-05-09T16:27:17.667 回答
1

PE结构读/写可以看一下开源JEDI库JCL,例如: http ://www.koders.com/delphi/fid38455E3CFDAF1F38C48DA3A295034E7015A4D01E.aspx?s=zip#L1810

运行实例的入口点是“System.MainInstance”?

于 2012-05-08T11:58:54.363 回答