Как мне получить хэш sha-256 раздела, содержащего код в переносимом исполняемом файле, в Delphi?

Я хотел бы получить хеш sha-256 для раздела, содержащего код (.text, CODE) в переносимом исполняемом файле в Delphi.

До сих пор я пытался получить начальный и конечный адрес раздела, на который указывает 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;

Спасибо.


person dreamlost88    schedule 05.02.2011    source источник
comment
Это dll? И отображается ли он по разным адресам?   -  person CodesInChaos    schedule 05.02.2011
comment
Простое хеширование всего раздела кода перемещенных исполняемых файлов не работает. Перемещение исправляет каждый фрагмент кода, содержащий абсолютный адрес.   -  person CodesInChaos    schedule 05.02.2011
comment
Можете ли вы получить таблицу исправлений (или любой другой жаргон Windows)? Если это так, вы можете просто подставлять нули, где бы ни произошло исправление, эффективно пропуская эти места в хэше.   -  person President James K. Polk    schedule 05.02.2011
comment
А как насчет самомодифицирующегося кода, например madExcept?   -  person David Heffernan    schedule 05.02.2011
comment
Это .exe, и, насколько я знаю, он отображается на 0x400000, из которого вы вычисляете RVA, верно?   -  person dreamlost88    schedule 05.02.2011
comment
Я тоже нашел это, но не знаю, как это написать в Delphi:   -  person dreamlost88    schedule 05.02.2011
comment
ссылка   -  person dreamlost88    schedule 05.02.2011


Ответы (1)


Я пока не могу прокомментировать ваш вопрос, поэтому я пытаюсь ответить здесь, но не уверен, правильно ли я думаю о том, что вы спрашиваете.

Кажется, вам нужен способ гарантировать, что никто не изменил ваш файл после его загрузки в память. Вот почему вам нужен хеш sha-256 этого раздела, и, вероятно, вам нужно получить этот раздел, а затем хешировать его.

Я никогда не использовал для этого классы JCL. Но нашел этот блок, который может вам помочь. Это позволяет редактировать PE-файлы. Был написан в 2007 году, поэтому, возможно, вам понадобится обновить код. Но я уверен, что вы найдете то, что хотите. http://www.coderprofile.com/networks/source-codes/71/portable-executable-file-unit

Я вообще не смог это проверить. Но до того, что я проверил, начальный адрес здесь не изменился.

Чтобы получить Sha-256, нужно найти много компонентов VCL (или, по крайней мере, ActiveX) для этого. Я мог бы посоветовать вам использовать LIBEAY32.DLL, но это, вероятно, добавило бы в ваше приложение еще одну dll. Если вы уже не используете его.

Надеюсь, что это все равно поможет.

person EMBarbosa    schedule 07.02.2011
comment
Пожалуйста. :) Если это вам поможет или нет, прокомментируйте, пожалуйста. Как это помогло или какие проблемы вы обнаружили? Какие части ваших намерений я совсем не понял? Это поможет мне стать лучшим помощником, поскольку я не очень хорошо говорю по-английски. - person EMBarbosa; 08.02.2011
comment
Что касается хэша SHA-256 для Delphi, вы можете рассмотреть упомянутый здесь пакет stackoverflow.com/a/1403265/759049. - person Pateman; 15.04.2012