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

 eXeL@B —› Вопросы новичков —› Ме нужен более строгий верификатор PE-файлов
Посл.ответ Сообщение

Ранг: 2.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2011 16:00
· Личное сообщение · #1

Пешу прогу добавляющую секцию в PE-файл.
Вот так я его читаю:

Code:
  1. :dword LoadFile(dword fname1)
  2. {
  3.     PCHAR p;
  4.     HANDLE hfile;
  5.     dword nr, x;
  6.     hfile = CreateFile(fname1, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  7.     ReadFile(hfile, #MyFile.MZHeader, sizeof(MyFile.MZHeader), #nr, 0);
  8.     if(MyFile.MZHeader.e_magic != IMAGE_DOS_SIGNATURE )
  9.         {
  10.             wxMessageBox(#frame, "Wrong MZ file", "Error", wxOK | wxICON_INFORMATION);
  11.             return(0);
  12.         }
  13.     SetFilePointer(hfile, 0, 0, 0);
  14.     ReadFile(hfile, #MyFile.MZData, MyFile.MZHeader.e_lfanew, #nr, 0);
  15.     ReadFile(hfile, #MyFile.PEHeader, sizeof(IMAGE_NT_HEADERS), #nr, 0);
  16.     if(MyFile.PEHeader.Signature != IMAGE_NT_SIGNATURE)
  17.         {
  18.             wxMessageBox(#frame, "Wrong PE file", "Error", wxOK | wxICON_INFORMATION);
  19.             return(0);
  20.         }
  21.     for(x=1; x<=MyFile.PEHeader.FileHeader.NumberOfSections; x++)
  22.         ReadFile(hfile, #MyFile.Sections[x-1], sizeof(IMAGE_SECTION_HEADER), #nr, 0);
  23.         
  24.     sz=0;
  25.     for(x=IMAGE_DIRECTORY_ENTRY_EXPORT; x<=IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR; x++)
  26.         {
  27.              if(MyFile.PEHeader.OptionalHeader.DataDirectory[x].VirtualAddress<>0)
  28.                  sz += MyFile.PEHeader.OptionalHeader.DataDirectory[x].Size;
  29.         }
  30.     ReadFile(hfile, #buf, sz, #nr, 0);
  31.  
  32.     for(x=1; x<=MyFile.PEHeader.FileHeader.NumberOfSections; x++)
  33.         {
  34.             SetFilePointer(hfile, MyFile.Sections[x-1].PointerToRawData, 0, 0);
  35.             MyFile.Objects[x-1] = GlobalAlloc(GMEM_ZEROINIT, Max(MyFile.Sections[x-1].Misc.VirtualSize, MyFile.Sections[x-1].SizeOfRawData));
  36.             ReadFile(hfile, MyFile.Objects[x-1], MyFile.Sections[x-1].SizeOfRawData, #nr, 0);
  37.         }
  38.     CloseHandle(hfile);
  39. }

Вот так добавляю секцию:

Code:
  1. :void AddSection(void)
  2. {
  3.     dword x, nr;
  4.     x = MyFile.PEHeader.FileHeader.NumberOfSections;
  5.     MyFile.PEHeader.FileHeader.NumberOfSections++;
  6.  
  7.     MyFile.Sections[x].Misc.VirtualSize = MyFile.Sections[x].SizeOfRawData = 4096;
  8.     MyFile.Sections[x].PointerToRawData = MyFile.Sections[x-1].PointerToRawData + MyFile.Sections[x-1].SizeOfRawData;
  9.     
  10.     MyFile.Sections[x].PointerToRawData = MyFile.Sections[x].PointerToRawData / MyFile.PEHeader.OptionalHeader.FileAlignment;
  11.     MyFile.Sections[x].PointerToRawData++;
  12.     MyFile.Sections[x].PointerToRawData = MyFile.Sections[x].PointerToRawData * MyFile.PEHeader.OptionalHeader.FileAlignment;
  13.      
  14.     MyFile.Sections[x].VirtualAddress = MyFile.Sections[x-1].VirtualAddress + MyFile.Sections[x-1].Misc.VirtualSize;
  15.     
  16.     MyFile.Sections[x].VirtualAddress = 1+MyFile.Sections[x].VirtualAddress / MyFile.PEHeader.OptionalHeader.SectionAlignment;
  17.     MyFile.Sections[x].VirtualAddress++;
  18.     MyFile.Sections[x].VirtualAddress = MyFile.Sections[x].VirtualAddress * MyFile.PEHeader.OptionalHeader.SectionAlignment;
  19.         
  20.     
  21.     MyFile.Sections[x].Characteristics = 0xE0000040;
  22.     MyFile.Sections[x].Name[0] = '1';
  23.     MyFile.Sections[x].Name[1] = '2';
  24.     MyFile.Sections[x].Name[2] = '3';
  25.     MyFile.Objects[x] = GlobalAlloc(GMEM_ZEROINIT, 4096);
  26.     MyFile.PEHeader.OptionalHeader.SizeOfImage += MyFile.Sections[x].Misc.VirtualSize;
  27.  
  28.     //MyFile.PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress<>0)
  29.     
  30. }



И наконец вот так сохраняю:


Code:
  1. :dword SaveFile(dword fname2)
  2. {
  3.          HANDLE hfile;
  4.          dword nr, x;
  5.          hfile = CreateFile(fname2,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  6.          WriteFile(hfile, #MyFile.MZData, MyFile.MZHeader.e_lfanew, #nr, 0);
  7.          WriteFile(hfile, #MyFile.PEHeader, sizeof(IMAGE_NT_HEADERS), #nr, 0);
  8.          for(x=1; x<=MyFile.PEHeader.FileHeader.NumberOfSections; x++)
  9.                  WriteFile(hfile, #MyFile.Sections[x-1], sizeof(IMAGE_SECTION_HEADER), #nr, 0);
  10.  
  11.          if(sz!=0)
  12.                  WriteFile(hfile, #buf, sz, #nr, 0);
  13.  
  14.          for(x=1; x<=MyFile.PEHeader.FileHeader.NumberOfSections; x++)
  15.                  {
  16.                         SetFilePointer(hfile, MyFile.Sections[x-1].PointerToRawData, 0, 0);
  17.                         WriteFile(hfile, MyFile.Objects[x-1], MyFile.Sections[x-1].SizeOfRawData, #nr, 0);
  18.                  }
  19.          CloseHandle(hfile);
  20. }



Для проверки использую 2 верификатора, тестирую на файле NOTEPAD.EXE

1-й до добавления секции:

Code:
  1. J:\>peverify.exe NOTEPAD.EXE
  2. PE Verifier. Copyright (C) Void Dweller 2001 - 2003. Ver 0.01, 02.10.03
  3. Warning: no relocations found!
  4. Detected new type of import at 008b7604h
  5. Detected new type of import at 008b7618h
  6. Detected new type of import at 008b762ch
  7. Detected new type of import at 008b7640h
  8. Detected new type of import at 008b7654h
  9. Detected new type of import at 008b7668h
  10. Detected new type of import at 008b767ch
  11. Detected new type of import at 008b7690h
  12. Detected new type of import at 008b76a4h
  13. Everything is OK. File is correct and can be loaded by system loader.


После обработки его моей прогой:


Code:
  1. J:\>peverify.exe 1.exe
  2. PE Verifier. Copyright (C) Void Dweller 2001 - 2003. Ver 0.01, 02.10.03
  3. Warning: no relocations found!
  4. Detected new type of import at 008b7604h
  5. Detected new type of import at 008b7618h
  6. Detected new type of import at 008b762ch
  7. Detected new type of import at 008b7640h
  8. Detected new type of import at 008b7654h
  9. Detected new type of import at 008b7668h
  10. Detected new type of import at 008b767ch
  11. Detected new type of import at 008b7690h
  12. Detected new type of import at 008b76a4h
  13. Everything is OK. File is correct and can be loaded by system loader.


Второй верификатор про оригинальную прогу:

Code:
  1. DIR: #12, VirtualAddress (00000250) into header
  2. BND: 'SHELL32.dll' timestamp (4A6E28E9) is mismatch (480381D7)
  3. BND: 'COMCTL32.dll' timestamp (480381B4) is mismatch (48038185)
  4. BND: 'msvcrt.dll' timestamp (4803825B) is mismatch (48038185)
  5. BND: 'ADVAPI32.dll' timestamp (49900C03) is mismatch (480381A2)
  6. BND: 'KERNEL32.dll' timestamp (49C4F2FE) is mismatch (480381EA)
  7. BND: 'NTDLL.DLL' timestamp (49900C02) is mismatch (480381EA)
  8. BND: 'GDI32.dll' timestamp (490071D3) is mismatch (4803819D)


А про обработанную:

Code:
  1. HDR: Checksum (0001E609) is incorrect (0001B1C2)
  2. SEC: Remained 3 pages
  3. DIR: #12, VirtualAddress (00000250) into header


Но винда всеравно ругается что:
J:\1.exe не является приложением Win32.


Оба файла прилогаю, помогите понять что и где не так.



404a_11.09.2011_EXELAB.rU.tgz - 1.rar




Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 11 сентября 2011 16:21
· Личное сообщение · #2

Bound Import обнулите.

-----
Nulla aetas ad discendum sera




Ранг: 2.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2011 16:48
· Личное сообщение · #3

Flint пишет:
Bound Import обнулите.


Да, спасибо, обнулил для теста через прогу LordPE и все заработало. А можно ссылочку про то что такое
Bound Import и почему его можно смело обнулять ?




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

Создано: 11 сентября 2011 17:17
· Личное сообщение · #4

Доку по формату ПЕ с сайта мелкомягких в помощь.



Ранг: 60.6 (постоянный), 87thx
Активность: 0.060
Статус: Участник

Создано: 11 сентября 2011 17:22 · Поправил: Kaimi
· Личное сообщение · #5

Shooshpanchik пишет:
А можно ссылочку про то что такое
Bound Import и почему его можно смело обнулять ?

Тут написано в общих чертах: http://www.insidepro.com/kk/019/019r.shtml



Ранг: 2.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 сентября 2011 17:42 · Поправил: Shooshpanchik
· Личное сообщение · #6

Archer пишет:
Доку по формату ПЕ с сайта мелкомягких в помощь.


У меня есть файл "Формат исполняемых PE-файлов[v 1.3.0]"
в нем указано:

C0h DWord TLS RVA указатель на локальную область данных цепочек
C4h DWord TLS Data Size размер области данных цепочек
C8h DWord Load Config RVA ?
CCh DWord Load Config Data Size ?
D0h 08h Reserved ?

судя по заголовкам моего компилятора:

#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers

В моей доке об IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, сказанно: D0h 08h Reserved ?
И далее по тексту ни слова об этом.




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

Создано: 11 сентября 2011 20:10
· Личное сообщение · #7

Брать официальную документацию надо, а не непойми что.
Microsoft Portable Executable and Common Object File Format Specification, версия 8.2.
Если в 2 словах, тот же импорт, только с указанным TimeStamp, где для либ с этим таймстамп уже стоят адреса, что позволяет сократить время загрузки. Если либы в системе отличаются от ожидаемых, заполнение происходит по дефолту.


 eXeL@B —› Вопросы новичков —› Ме нужен более строгий верификатор PE-файлов
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати