在Delphi中,如何获取包含可移植可执行文件中代码的节的sha-256哈希?

在Delphi中,如何获取包含可移植可执行文件中代码的节的sha-256哈希?,delphi,portable-executable,sha256,Delphi,Portable Executable,Sha256,我想在Delphi中获取包含可移植可执行文件中的代码(.text,code)的部分的sha-256哈希 到目前为止,我已经尝试获取AddressOfEntryPoint指向的节的开始和结束地址,但是如果我多次加载同一个文件,我会得到不同的开始和结束地址 有人能帮我吗 代码如下: procedure TForm1.Button1Click(Sender: TObject); var x:TJCLPEImage; aoep,cs,ce: cardinal; pise: Pimagesectionhe

我想在Delphi中获取包含可移植可执行文件中的代码(.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;
procedure TForm1.按钮1点击(发送方:TObject);
变量x:TJCLPEImage;
行政长官、政务司司长、行政长官:枢机主教;
pise:Pimagesectionheader;
nos:整数;
i:整数;
开始
x:=TJCLPEImage.Create();
x、 文件名:=edit1.Text;
aoep:=x.可选标题32.入口点地址;
pise:=指针(PByte(@(x.LoadedImage.FileHeader.OptionalHeader))+x.LoadedImage.FileHeader.FileHeader.SizeOfOptionalHeader);
对于i:=0到x.ImageSectionCount-1 do
开始

如果(pise.VirtualAddress我还不能对你的问题发表评论,所以我试图在这里回答,但不确定我是否正确考虑了你的问题

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

我从来没有使用过JCL类来做这件事。但是我发现这个单元可能对你有帮助。它允许你编辑PE文件。它是在2007年编写的,所以你可能需要升级一些代码。但是我相信你会找到你想要的基础。

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

若要获得Sha-256,将找到许多VCL组件(或至少ActiveX)来执行此操作。我可以建议您使用LIBEAY32.DLL,但这可能会在应用程序中添加一个DLL。除非您已经使用它


希望对您有所帮助。

它是dll吗?它是否映射到不同的地址?简单地对重新定位的可执行文件的整个代码部分进行哈希运算是行不通的。重新定位会修补包含绝对地址的每一段代码。您能检索修复表(或任何windows术语)吗?如果是这样的话,你可以简单地用零替换任何可能发生修复的地方,有效地“跳过”散列中的那些位置。那么自我修改代码呢,例如madExcept?它是一个.exe,据我所知,它会映射到0x400000,从中计算RVA,对吗?欢迎你。:)如果它对你有帮助,请,对此发表一些评论。它是如何帮助你的,或者你发现了什么问题?你的意图有哪些部分我根本不明白?这将指导我成为一个更好的帮手,因为我对英语不是很好。至于Sha256的Delphi哈希,你可以考虑这里提到的包。