1

我想在 Delphi 的可移植可执行文件中获取包含 code(.text, CODE) 的部分的 sha-256 哈希。

到目前为止,我已经尝试获取 AddressOfEntryPoint 指向的部分的开始和结束地址,但是如果我多次加载同一个文件,我会得到不同的开始和结束地址。

谁能帮帮我吗?

这是代码:

procedure TForm1.Button1Click(Sender: TObject);
var x:TJCLPEImage;
aoep,cs,ce: cardinal;
pise: Pimagesectionheader;
nos : integer;
i : integer;
begin

x := TJCLPEImage.Create();
x.FileName:=edit1.Text;
aoep := x.OptionalHeader32.AddressOfEntryPoint;
pise := Pointer(PByte(@(x.LoadedImage.FileHeader.OptionalHeader)) + x.LoadedImage.FileHeader.FileHeader.SizeOfOptionalHeader);

for i:=0 to x.ImageSectionCount-1 do
begin
if (pise.VirtualAddress <= aoep) and (aoep < (pise.VirtualAddress + pise.Misc.VirtualSize)) then
    break;

end;

inc(pise);

cs := DWORD(x.LoadedImage.MappedAddress) + DWORD(pise.PointerToRawData);
ce := cs + pise.Misc.VirtualSize;

Label1.caption:='Code start: '+Inttostr(cs);
Label2.caption:='Code end: '+inttostr(ce);

end;

谢谢你。

4

1 回答 1

0

我还不能对你的问题发表评论,所以我想在这里回复,但不确定我是否正确地考虑了你的问题。

似乎您想要一种方法来确保在将文件加载到内存后没有人更改您的文件。这就是为什么您需要该部分的 sha-256 哈希,并且可能您需要获取该部分然后对其进行哈希处理。

我从来没有使用过 JCL 类来做到这一点。但是找到了这个可能对你有帮助的单元。它允许您编辑 PE 文件。写于 2007 年,所以也许你需要升级一些代码。但我很确定你会找到你想要的基础。 http://www.coderprofile.com/networks/source-codes/71/portable-executable-file-unit

我根本无法测试它。但是在我测试之前,这里的起始地址没有改变..

要获得 Sha-256,会找到许多 VCL 组件(或至少 ActiveX)来做到这一点。我可以建议您使用 LIBEAY32.DLL,但这可能会在您的应用程序中再添加一个 dll。除非你已经在使用它。

无论如何希望有所帮助。

于 2011-02-07T17:11:44.290 回答