Сейчас на форуме: asfa, _MBK_, Rio (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Вопрос по работе с РЕ файлами в делфи
Посл.ответ Сообщение

Ранг: 39.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 31 декабря 2008 17:35
· Личное сообщение · #1

Здравствуйте. С наступающим вас всех!))
У меня вопрос.
Читать параметры РЕ файла в делфи можно через структуру IMAGE_NT_HEADERS. Это мне понятно, и с этим у меня нет прблем. Меня интересует как ИЗМЕНЯТЬ параметры РЕ в делфи. Подскажите, люди добрые.
Заранее благодарю.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 31 декабря 2008 21:09
· Личное сообщение · #2

Структура-это просто порядок обращение с данными. Фактически есть данные, и структура просто упорядочивает их. И от неё не зависит обращение к данным. В данные можно так же и писать, как и читать их. Или вопроса не понял просто...




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 01 января 2009 02:50
· Личное сообщение · #3

Использую "файловый мэппинг", CreateFileMapping,MapViewOfFile, можешь
спроецировать файл, с флагами для записи и писать в файл

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 39.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 01 января 2009 02:54
· Личное сообщение · #4

coderess, а в конце в этом случаи надо writefile? Или автоматически пишется?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 01 января 2009 03:14 · Поправил: coderess
· Личное сообщение · #5

Ошибка была: не тот пример привел, вот он верный:
Code:
  1. hFile := CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
  2.                                 0,
  3.                                 NULL,
  4.                                 OPEN_EXISTING,
  5.                                 FILE_ATTRIBUTE_NORMAL,
  6.                                 0);
  7.   if hFile = INVALID_HANDLE_VALUE then Exit;
  8.   hMap := CreateFileMapping(hFile,
  9.                             NULL,
  10.                             PAGE_READWRITE,
  11.                             0,
  12.                             0,
  13.                             NULL);
  14.   if hMap = 0 then Exit;
  15.   mPtr := MapViewOfFile(hMap,
  16.                         FILE_MAP_READ or FILE_MAP_WRITE,
  17.                         0,
  18.                         0,
  19.                         0);
  20.   if mPtr = NULL then Exit;
  21.   //inc(mPtr^);


После вызова MapViewOfFile в EAX возвращается (в mPtr присваевается) значение спроецированного файла в памяти, ниже дамп в памяти:


Code:
  1. 00A20000  4D 5A 50 00 02 00 00 00 04 00 0F 00 FF FF 00 00  MZP......яя..
  2. 00A20010  B8 00 00 00 00 00 00 00 40 00 1A 00 00 00 00 00  ё.......@......
  3. 00A20020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  4. 00A20030  00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00  ...............
  5. 00A20040  BA 10 00 0E 1F B4 09 CD 21 B8 01 4C CD 21 90 90  є.ґ.Н!ёLН!ђђ
  6. 00A20050  54 68 69 73 20 70 72 6F 67 72 61 6D 20 6D 75 73  This program mus
  7. 00A20060  74 20 62 65 20 72 75 6E 20 75 6E 64 65 72 20 57  t be run under W
  8. 00A20070  69 6E 33 32 0D 0A 24 37 00 00 00 00 00 00 00 00  in32..$7........
  9. 00A20080  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  10. 00A20090  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  11. 00A200A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  12. 00A200B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  13. 00A200C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  14. 00A200D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  15. 00A200E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  16. 00A200F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  17. 00A20100  50 45 00 00 4C 01 08 00 19 5E 42 2A 00 00 00 00  PE..L.^B*....


Как видно из дампа, в начале идет MZ-сигнатура и по адресу 00A20100(в памяти) находится
PE-сигнатура (50 45 00 00), если мы вызовем:

Code:
  1. inc(mPtr^);


т.е. увеличим на 1, значение в памяти, после выполнения этой команды мы получим в памяти NZP, вместо
MZP, если необходимо изменить поля PE-файла, то стоит воспользоваться, PE-структурой в которой описаны все необходимые смещения к необходимым нам опциям в PE-файле, допустим проверяем сигнатуры в спроецированном PE-файле, следующим образом:

Code:
  1.   if not (dos_hdr.e_magic = IMAGE_DOS_SIGNATURE) then Exit;
  2.   nt_hdr := PIMAGE_NT_HEADER(DWORD(dos_hdr) + (dos_hdr._lfanew));
  3.   if (nt_hdr.Signature = IMAGE_NT_SIGNATURE) then
  4.   begin
  5.     // некоторый код
  6.   end;


И конечно же в конце работы с проецированным файлом не забываем освободить рессурсы

Code:
  1.     UnMapviewOfFile(mPtr);
  2.     CloseHandle(hFile);
  3.     CloseHandle(hMap);


Как то так оно все работает =)


Добавлено: Не сказал о самом главном - после изменений они сбрасываются на диск, т.е. при изменени файла в памяти, изменения произойдут и на диске(в спроецированном файле)

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 39.0 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 01 января 2009 22:26 · Поправил: SVIN95
· Личное сообщение · #6

coderess, спасибо огромное! Все разобрался)).


 eXeL@B —› Вопросы новичков —› Вопрос по работе с РЕ файлами в делфи
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати