|
#12
|
||||
|
||||
в общем кактотак
Код:
program TestProj; ... var data_m, data_f: pointer; ofs1, ofs2, pos: Cardinal; dh:TImageDosHeader; _text:TImageSectionHeader; ... begin data_m:=Addr(StartPointProc); //адрес какой-то функции в памяти процесса CopyMemory(@dh, pointer(HInstance), SizeOf(TImageDosHeader)) ; //читаем заголовок dos CopyMemory(@_text, pointer(HInstance+dh._lfanew+ sizeof(TImageNtHeaders)), SizeOf(TImageSectionHeader)) ; //читаем заголовок первой секции (секции кода) ofs1:=Cardinal(data_m)-HInstance; //смещение адреса функции от начала имиджа ofs2:=ofs1-_text.VirtualAddress; //смещение адреса функции от начала секции pos:=_text.PointerToRawData + ofs2; //смещение адреса функции от начала файла ms:=TMemoryStream.Create; ms.LoadFromFile(ParamStr(0)); //загрузим стрим из этого же EXE data_f:= ms.Memory; inc(Cardinal(data_f), pos); //получим адрес того же куска в памяти стрима //теперь если вычитать небольшой кусок данных из // data_m - памяти процесса // data_f - памяти стрима загруженного из файла //они будут эквивалентны http://saveimg.ru/show-image.php?id=...f93eafbd5d213a |