![]() |
eXeL@B —› Вопросы новичков —› Добавление новой секции в PE |
Посл.ответ | Сообщение |
|
Создано: 09 ноября 2013 00:41 · Личное сообщение · #1 Всем ку ^_^ В общем, знаю, что данная тема уже разжевана и в гугле дофига примеров, но вот что то не получается. Цель: добавить в pe-файл секцию с данными. В общем, вроде как получилось, но не совсем. Вот код: https://gist.github.com/winkle/7377166 Вся проблема заключается в sectsize. Если сделать её меньше 0x1000, то exe не запускается. Но если сделать тоже самое в CFF/другом редакторе, то всё работает. В чем может быть проблема? ![]() |
|
Создано: 09 ноября 2013 01:11 · Поправил: dosprog · Личное сообщение · #2 PESection[i].Misc.VirtualSize должна быть кратна PE.SectionAlignment. {За выполнение этого условия должна бы отвечать AlignSize() ?} PESection[i].SizeOfRawData может иметь любой желаемый размер <= PESection[i].Misc.VirtualSize. А где-то должна быть ещё коррекция PE.SizeOfInitData. --ADD-- --ADD2-- Так можно ж добавить к существующему значению (PE.SizeOfInitData) размер своих добавляемых данных - и всё тут... И непонятно, зачем у секции атрибут IMAGE_SCN_CNT_UNINITIALIZED_DATA ? ![]() |
|
Создано: 09 ноября 2013 01:22 · Поправил: Phantom007 · Личное сообщение · #3 dosprog Code:
По сути PESection[i].Misc.VirtualSize кратна SectionAlignment, а SizeOfRawData = Misc.VirtualSize. ![]() add: Из статьи Z0mbie: SizeOfInitData & SizeOfUninitData -- полная херь, выставлено как попало и кое-где. Каким бы ни был метод заражения, менять их нет смысла. add #2: было бы круто еще понять, как работать с этим SizeOfInitData ![]() ![]() Add: Не совсем понял вас. Добавлять значение к чему? Адд: Спасибо, завтра еще поексперементирую ![]() А аттрибуты с нагло украл с сорцов неокса ^_^ ![]() |
|
Создано: 09 ноября 2013 04:23 · Поправил: hors · Личное сообщение · #4 Phantom007 пишет: Вся проблема заключается в sectsize. Если сделать её меньше 0x1000, то exe не запускается. Но если сделать тоже самое в CFF/другом редакторе, то всё работает. В чем может быть проблема? Возьмите свой файл и файл после редактора. Потом сравните их с помощью PE-tools или LordPE. ( кнопка "compare" в PE-tools) ----- http://ntinfo.biz ![]() |
|
Создано: 09 ноября 2013 09:49 · Личное сообщение · #5 Init/Uninit Data загрузчику не нужен. Если интересно, как работать, по сути там сумма размеров всех секций с этими атрибутами. И лучше бы выложил файл получившийся, в кодесе половины функций нет. Как вариант-в HIEW есть плаг PEVerifier, он расскажет, что в файле не нравится. ![]() |
|
Создано: 09 ноября 2013 13:17 · Поправил: dosprog · Личное сообщение · #6 Init/Uninit Data загрузчику не нужен. --согдасен, будет работать и вообще с обнулёнными значениями. Но к.з. что там в дальнейшем будут в MS проверять... (imho). там сумма размеров всех секций с этими атрибутами --уточню, сумма RAW sizes. В простейшем случае да - хватает коррекции этих двух чисел <PE.NumOfSections> и <PE.SizeOfImage> помимо вставленного описания секции (new section header). Но на вставку этого описания как раз-то места может и не хватать. В общем, лучше не гадать. Самое нормальное - сделать, как предложил hors. Можно и обычной C>FC. ![]() |
|
Создано: 09 ноября 2013 14:56 · Личное сообщение · #7 hors Сравнил.. Файлы отличаются только размером. У меня есть подозрение, что массив не записывается куда надо. Прикладываю архив zcrackme.exe - оригинал newpe.exe - созданный моей прогой (размер секции в коде выставлен 0x4), не работает mype.exe - тоже созданный моей прогой (размер - 0x1000) cff.exe - созданный через CFF Explorer (0x1000, не отличается от mype.exe) cff_.exe - CFF Explorer, размер секции - 0x4 (по идее должен быть такой же как newpe.exe, но не тут то было) теперь мои предположения. Code:
всё равно создает секцию равной 0x1000, не запускается. Если же выставить тут 0x1000, то всё работает отлично. И еще, немного поменял запись данных: Code:
Не знаю, правильно ли это. ![]() ![]() |
|
Создано: 09 ноября 2013 15:50 · Поправил: ClockMan · Личное сообщение · #8 Code:
Вы указали SizeOfRawData = 1000 а надо 4. ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. ![]() |
|
Создано: 09 ноября 2013 15:54 · Поправил: Phantom007 · Личное сообщение · #9 ClockMan Действительно, всё заработало ![]() ![]() Еще маленький вопрос ![]() ![]() |
|
Создано: 09 ноября 2013 15:57 · Личное сообщение · #10 правильнее так как и сделал CFF Explorer: - VirtualSize = 4 (которые хочет ТС) - SizeOfRawData = 0х200 (== File Aligment) - и сама секция размером 0х200 в первых 4х байтах которой 'TEST' ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 09 ноября 2013 15:59 · Личное сообщение · #11 |
|
Создано: 09 ноября 2013 16:11 · Личное сообщение · #12 |
|
Создано: 09 ноября 2013 19:18 · Поправил: __X3__ · Личное сообщение · #13 |
|
Создано: 10 ноября 2013 02:24 · Поправил: Dr0p · Личное сообщение · #14 Code:
![]() |
|
Создано: 10 ноября 2013 02:58 · Поправил: dosprog · Личное сообщение · #15 Dr0p, Archer пишет: ...в кодесе половины функций нет. Таки да - не нужно рассматривать частные случаи. В общем случае всё выглядит так (например): N Name_____VirtSize___RVA_____PhysSize__Offset____Flag 1 CODE_____0009B000 00001000 0003D200 00000400 C0000040 2 DATA______00002000 0009C000 00000A00 0003D600 C0000040 3 BSS_______00001000 0009E000 00000000 0003E000 C0000040 4 .idata_____00003000 0009F000 00001000 0003E000 C0000040 5 .tls_______00001000 000A2000 00000000 0003F000 C0000040 6 .rdata____00001000 000A3000 00000200 0003F000 C0000040 7 .reloc____0000A000 000A4000 00000000 0003F200 C0000040 8 .rsrc_____00012000 000AE000 00004600 0003F200 C0000040 9 .aspack__00005000 000C0000 00004200 00043800 C0000040 0 .data____00001000 000C5000 00000000 00047A00 C0000040 Где же тут SizeOfRawData is larger than VirtualSize ? ---ADD--- ))) Борланд Delphi, файл когда он был запакован aspack'ом - редактор asmedit от AVTLab. ![]() |
|
Создано: 10 ноября 2013 03:03 · Поправил: Dr0p · Личное сообщение · #16 |
|
Создано: 10 ноября 2013 12:20 · Личное сообщение · #17 |
![]() |
eXeL@B —› Вопросы новичков —› Добавление новой секции в PE |
Эта тема закрыта. Ответы больше не принимаются. |