Сейчас на форуме: morgot, Rio, CDK123, zds, tyns777, tihiy_grom, rmn (+4 невидимых)

 eXeL@B —› Программирование —› Как расширить Size Of Headers?
Посл.ответ Сообщение


Ранг: 67.4 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 12 октября 2008 19:03
· Личное сообщение · #1

Как расширить Size Of Headers?
Поэтапно напишите.



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 12 октября 2008 19:21 · Поправил: arnix
· Личное сообщение · #2

Ты имеешь ввиду с помощью какой-то программы добавить новую секцию или тебе нужен код чтобы приделать эту функу к своей программе?




Ранг: 67.4 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 12 октября 2008 19:27
· Личное сообщение · #3

Нужен код, или хотя бы описание куда сместиться что дабавить что удалить добавить и т.д.



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 12 октября 2008 20:09 · Поправил: arnix
· Личное сообщение · #4

Ну
Во 1-ых кури доки по PE так или иначе пригодится
А так, примерно так:

нужно смотреть на значение "File Alignment", потому что сместить другие секции можно значением кратным "File Alignment". Будем считать что у нас "Size Of Headers" = 0х400, "File Alignment" = 0х200 и хотим сделать "Size Of Headers" = 0х600. Все что нужно - это изменить значение "Size Of Headers" на 0х600, сместить все что после 0х400 на 0х200, тойсть то что раньше было на 0х400 сейчас окажется на 0х600. И последнее - нужно менять значения Raw Offset всех секций (тойсть увеличить эти значения на 0х200). Вот и все.

Добавлено:
Кстати, если есть таблица релоков, их тоже нужно соответственно исправлять.




Ранг: 67.4 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 12 октября 2008 20:23
· Личное сообщение · #5

arnix пишет:
Ну
Во 1-ых кури доки по PE так или иначе пригодится
А так, примерно так:

нужно смотреть на значение "File Alignment", потому что сместить другие секции можно значением кратным "File Alignment". Будем считать что у нас "Size Of Headers" = 0х400, "File Alignment" = 0х200 и хотим сделать "Size Of Headers" = 0х600. Все что нужно - это изменить значение "Size Of Headers" на 0х600, сместить все что после 0х400 на 0х200, тойсть то что раньше было на 0х400 сейчас окажется на 0х600. И последнее - нужно менять значения Raw Offset всех секций (тойсть увеличить эти значения на 0х200). Вот и все.


Тоесть нужно тольоко изменить значение Size Of Headers на нужное и изменить Raw Offset всех секций?



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 12 октября 2008 20:25
· Личное сообщение · #6

Sunzer пишет:
Тоесть нужно тольоко изменить значение Size Of Headers на нужное и изменить Raw Offset всех секций?



arnix пишет:
Добавлено:
Кстати, если есть таблица релоков, их тоже нужно соответственно исправлять.


Может еще что-нибудь вспомню ) Я щас попробовал на простом ехе, работает.




Ранг: 67.4 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 12 октября 2008 20:30
· Личное сообщение · #7

В файле то какие то манипуляции осуществлять нужно или только изменить значение Size Of Headers на нужное и изменить Raw Offset всех секций?



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 12 октября 2008 20:33
· Личное сообщение · #8

Sunzer пишет:
В файле то какие то манипуляции осуществлять нужно или только изменить значение Size Of Headers на нужное и изменить Raw Offset всех секций?


Ну да, зачем 2 раза переспрашивть???




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

Создано: 13 октября 2008 03:37 · Поправил: coderess
· Личное сообщение · #9

[-- Delete --]

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




Ранг: 24.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 13 октября 2008 06:27
· Личное сообщение · #10

Size Of Headers это PE+0x14?
тогда у всех нормальных файлов оно равно 0xE0, при этом таблица секций расположена сразу за PE заголовком (за таблицей дирекрорий), по смещению PE+0xF8

соответственно смещение таблицы секций:
__section_table= __PE+0x18+__headers_size
а __headers_size (SizeOfHeaders) для заданного смещения таблицы секций равно
__headers_size = __section_table - __PE-0x18




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 13 октября 2008 07:28 · Поправил: PE_Kill
· Личное сообщение · #11

arnix пишет:
Кстати, если есть таблица релоков, их тоже нужно соответственно исправлять.

А при чем здесь релоки? Все DataDirs указывают на виртуальные офсеты, в таблице релоков блоки описывают тоже виртуальные офсеты, ну а сами фиксапы являются офсетами от начала описываемого виртуального офсета. Там нигде нет привязки к рав офсету. Единственное наверное это баунд импорт, тем более он обычно находится как раз в PE хэдере, его тоже надо будет смещать. Ну может что еще именно такое извращенское и редко встречающееся, хотя вряд ли.

-----
Yann Tiersen best and do not fuck




Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 13 октября 2008 13:08 · Поправил: arnix
· Личное сообщение · #12

PE_Kill
Если честно в последний раз с релоками имел дело давно и точно не помню члены структыры, я просто открыл длл в LordPE а там было Offset:

http://img524.imageshack.us/my.php?image=30308843hr5.png

так что если это не file offset а "сами фиксапы являются офсетами от начала описываемого виртуального офсета" то тада я был не прав в этом )




Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 13 октября 2008 21:11
· Личное сообщение · #13

PE_Kill
Пардон. А если, например, мы хотим "прилично" увеличить размер заголовков, так, что новый размер будет больше Section Alignment и "выползет" на первую секцию. Вот тогда и надо будет пересчитывать помимо всего RVA всех секций ну и релоки тоже придется. Хотя я уже наверно всё забыл, может что-то и путаю)



Ранг: 13.9 (новичок), 9thx
Активность: 0.010
Статус: Участник

Создано: 13 октября 2008 21:47 · Поправил: ADACH
· Личное сообщение · #14

я делал так
Code:
  1. //если в заголовке ф-а места нет
  2. if(dosHeaderSize + (sections.size() +1) * sizeof(OBJECT_HEADER) + sizeof(NT_HEADER) >= ntHeader.headerSize)
  3. {
  4.          if(ntHeader.headerSize == 0x1000)
  5.          {
  6.                  Print(ADD_SECTION_FAIL);
  7.                  return -1;
  8.          }
  9.          addSectSize = true;
  10.          for(int i = 0;i < ntHeader.numOfObjects ;i++)
  11.                  sections[i].sectionHeader.physicalOffset += 0x200;//0x200 == MINIMAL_FILE_ALIGN
  12. }
  13. ntHeader.headerSize+= 0x200;//0x200 == MINIMAL_FILE_ALIGN
  14. ntHeader.imageSize += 0x200;//0x200 == MINIMAL_FILE_ALIGN
  15. ntHeader.imageSize = AlignUp(ntHeader.imageSize,ntHeader.fileAlign); //Выравнивание
  16. ntHeader.numOfObjects++;



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


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