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

 eXeL@B —› Вопросы новичков —› Добавление новой секции в PE
Посл.ответ Сообщение

Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2013 00:41
· Личное сообщение · #1

Всем ку ^_^ В общем, знаю, что данная тема уже разжевана и в гугле дофига примеров, но вот что то не получается. Цель: добавить в pe-файл секцию с данными. В общем, вроде как получилось, но не совсем. Вот код: https://gist.github.com/winkle/7377166

Вся проблема заключается в sectsize. Если сделать её меньше 0x1000, то exe не запускается. Но если сделать тоже самое в CFF/другом редакторе, то всё работает. В чем может быть проблема?



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 09 ноября 2013 01:11 · Поправил: dosprog
· Личное сообщение · #2

PESection[i].Misc.VirtualSize должна быть кратна PE.SectionAlignment. {За выполнение этого условия должна бы отвечать AlignSize() ?}
PESection[i].SizeOfRawData может иметь любой желаемый размер <= PESection[i].Misc.VirtualSize.
А где-то должна быть ещё коррекция PE.SizeOfInitData.

--ADD--
--> Link <--

--ADD2--
Так можно ж добавить к существующему значению (PE.SizeOfInitData) размер своих добавляемых данных - и всё тут...
И непонятно, зачем у секции атрибут IMAGE_SCN_CNT_UNINITIALIZED_DATA ?



Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2013 01:22 · Поправил: Phantom007
· Личное сообщение · #3

dosprog
Code:
  1. DWORD AlignSize(DWORD dwSize, DWORD dwAlign) 
  2. {
  3. return (dwSize + (dwAlign - ((dwSize % dwAlign) ? (dwSize % dwAlign) : dwAlign)));
  4. }
  5. ...
  6. DWORD NewSize = AlignSize(Size, NtHeader32->OptionalHeader.SectionAlignment);
  7. ...
  8. PESection[i].Misc.VirtualSize = NewSize;
  9. PESection[i].SizeOfRawData = NewSize;


По сути PESection[i].Misc.VirtualSize кратна SectionAlignment, а SizeOfRawData = Misc.VirtualSize.

add:
Из статьи Z0mbie:
SizeOfInitData & SizeOfUninitData -- полная херь, выставлено как попало и кое-где. Каким бы ни был метод заражения, менять их нет смысла.

add #2:
было бы круто еще понять, как работать с этим SizeOfInitData А то в интернете почти ничего не нашел, а что нашел - не понял

Add:
Не совсем понял вас. Добавлять значение к чему?

Адд:
Спасибо, завтра еще поексперементирую
А аттрибуты с нагло украл с сорцов неокса ^_^




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 09 ноября 2013 04:23 · Поправил: hors
· Личное сообщение · #4

Phantom007 пишет:
Вся проблема заключается в sectsize. Если сделать её меньше 0x1000, то exe не запускается. Но если сделать тоже самое в CFF/другом редакторе, то всё работает. В чем может быть проблема?


Возьмите свой файл и файл после редактора. Потом сравните их с помощью PE-tools или LordPE. ( кнопка "compare" в PE-tools)

-----
http://ntinfo.biz





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

Создано: 09 ноября 2013 09:49
· Личное сообщение · #5

Init/Uninit Data загрузчику не нужен. Если интересно, как работать, по сути там сумма размеров всех секций с этими атрибутами.
И лучше бы выложил файл получившийся, в кодесе половины функций нет. Как вариант-в HIEW есть плаг PEVerifier, он расскажет, что в файле не нравится.

| Сообщение посчитали полезным: AlisaDarkCoder

Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 09 ноября 2013 13:17 · Поправил: dosprog
· Личное сообщение · #6

Init/Uninit Data загрузчику не нужен.
--согдасен, будет работать и вообще с обнулёнными значениями. Но к.з. что там в дальнейшем будут в MS проверять... (imho).
там сумма размеров всех секций с этими атрибутами
--уточню, сумма RAW sizes.

В простейшем случае да - хватает коррекции этих двух чисел <PE.NumOfSections> и <PE.SizeOfImage> помимо вставленного описания секции (new section header). Но на вставку этого описания как раз-то места может и не хватать.
В общем, лучше не гадать. Самое нормальное - сделать, как предложил hors. Можно и обычной C>FC.



Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 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:
  1. BYTE NewSection[0x4] = {'T', 'E', 'S', 'T'};
  2. PEFile->AddNewSection((LPBYTE)NewSection, 0x4, ".test");


всё равно создает секцию равной 0x1000, не запускается. Если же выставить тут 0x1000, то всё работает отлично. И еще, немного поменял запись данных:

Code:
  1. SetFilePointer(hFile, PESection[i].PointerToRawData, NULL, FILE_BEGIN);


Не знаю, правильно ли это.

d847_09.11.2013_EXELAB.rU.tgz - Release.7z




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 09 ноября 2013 15:50 · Поправил: ClockMan
· Личное сообщение · #8

Code:
  1. 00000260    2E 74 65 73>ASCII ".test"        ; SECTION
  2. 00000268    00100000    DD 00001000          ; VirtualSize = 1000 (4096.)
  3. 0000026C    00500000    DD 00005000          ; VirtualAddress = 5000
  4. 00000270    00100000    DD 00001000          ; SizeOfRawData = 1000 (4096.) =========>0004
  5. 00000274    00100000    DD 00001000          ; PointerToRawData = 1000
  6. 00000278    00000000    DD 00000000          ; PointerToRelocations = 0
  7. 0000027C    00000000    DD 00000000          ; PointerToLineNumbers = 0
  8. 00000280    0000        DW 0000              ; NumberOfRelocations = 0
  9. 00000282    0000        DW 0000              ; NumberOfLineNumbers = 0
  10. 00000284    000000C0    DD C0000000          ; Characteristics = READ|WRITE

Вы указали SizeOfRawData = 1000 а надо 4.

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


| Сообщение посчитали полезным: Phantom007

Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2013 15:54 · Поправил: Phantom007
· Личное сообщение · #9

ClockMan
Действительно, всё заработало Большое спасибо

Еще маленький вопрос Можно ли как то вставить данные секции в массив? Т.е. у нас есть массив PEData, который записывается в файл по окончанию работы. После него записывается данные нашей секции. Я бы хотел избавиться от WriteFile и добавить данные секции прямо в PEData. Можно ли это провернуть? (CopyMemory не работает почему то)




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 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


| Сообщение посчитали полезным: Phantom007


Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 09 ноября 2013 15:59
· Личное сообщение · #11

Phantom007
Ты понял хоть что в SizeOfRawData надо вписывать ? а то начнёшь новые топы создавать

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2013 16:11
· Личное сообщение · #12

ClockMan
Ну теперь SizeOfRawData = FileAlignment т.е. 0x200

OKOB
Спасибо



Ранг: 6.2 (гость), 10thx
Активность: 0.020
Статус: Участник

Создано: 09 ноября 2013 19:18 · Поправил: __X3__
· Личное сообщение · #13

Phantom007 пишет:
Ну теперь SizeOfRawData = FileAlignment т.е. 0x200

Не равно, а кратно. Т. е. может быть и больше, но обязательно кратно(200, 400, 600 ... 1000 ... ) FileAlignment.




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

Создано: 10 ноября 2013 02:24 · Поправил: Dr0p
· Личное сообщение · #14

Code:
  1.            // Generally, SizeOfRawData is larger than VirtualSize for each
  2.             // section because it includes the padding to get to the subsection
  3.             // alignment boundary.  However if the image is linked with
  4.             // subsection alignment == native page alignment, the linker will
  5.             // have VirtualSize be much larger than SizeOfRawData because it
  6.             // will account for all the bss.




Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 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.




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

Создано: 10 ноября 2013 03:03 · Поправил: Dr0p
· Личное сообщение · #16

dosprog

Не борландский ли линкер.. И вообще сказано про bss секции, они места дискового не занимают.



Ранг: 19.7 (новичок), 14thx
Активность: 0.030
Статус: Участник

Создано: 10 ноября 2013 12:20
· Личное сообщение · #17

Всем спасибо, во всем разобрался


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