Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Добавление секции в РЕ файл

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> Добавление секции в РЕ файл
Имя
Сообщение << Старые топики   Новые топики >>
Добавление секции в РЕ файл - 2008-02-08 00:42:51.406666   
Dgedit

Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
Написал программу которая открывает другой файл делает и добавляет секцию в его конец. Проблема в том что после всех моих манипуляций с ним при его открытии (другого файла) выскакивает MessageBox файл не Win32 формата. Хотя я вроде бы все правильно делал : добавляю секцию кода ставлю соответствующие атрибуты доступа и параметры секции типа смещений и все такое, меняю на нее точку входа, увеличиваю размер образа файла в опциональном заголовке, размер кода там же тоде увелиыиваю.
Если кому вникать неохота будет может кто просто кинет ссылку на алгоритм работы загрузчика РЕ файлов я сам разберусь (а то найти не могу) заранее спасибо.
Post #: 1
RE: Добавление секции в РЕ файл - 2008-02-09 16:31:15.183333   
Dgedit

Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
Хотелось бы немного уточнить вопрос. Насколько я сам эвспериментировал у меня сложилось мнение что все дело в размере файла. Я добавлял секцию путем проецирования файла на адресное пространство CreateFile Mapping этой функцией и как мне кажется в РЕ заголовке размер образа файла меняется ( я его меняю сам), а его размер на диске остается прежним. и получается что при загрузке файла загрузчик видит что эти две величины различаются и он выдает ошибку. Я прав?
Post #: 2
RE: Добавление секции в РЕ файл - 2008-02-10 10:27:34.590000   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Вот по теме:

Ручное добавление секций в EXE

Автор……: SunShine
Перевод….: NightCat \\ TEAM-53
Инструменты: Hex-Редактор, PEditor(или PE Tools, ProcDump, LordPE)

1. Вступление

Иногда добавление новой секции - выход из ситуации, когда больше некуда вставить свой код в PE. Я знаю много редкаторов, которые сделают всё автоьматически, но у вас есть стимул, чтобы хоть раз сделать это руками: вы кое-чем научиться относительно формата PE, особенно что касается секций. Давайте начнём!

2. Добавляем байты

Сперва давайте глянем на наш AddSection.exe. Откройте его в PEditor или другой программе и вы увидите, что там 3 секции:

Section Virtual Size  Virtual Offset  Raw Size Raw Offset Characteristics
.text 000002C2 00001000 00000400 00000400 60000020
.rdata 000001C2 00002000 00000200 00000800 40000040
.data 000002F8 00003000 00000200 00000A00 C0000040

Откройте этот файл в Hex Workshop. Допустим мы хотим. чтобы наша новая секци была длиной 110h байт. Как вы видите в конце файла есть много нулей. Так что выделите их все начиная с  AE0 до BEF (как раз 110h байт), затем выберите Edit->Copy.

После этого поместите курсор в самый конец файла и выберите Edit->Paste.

Ну вот, у нас есть новая секция. Она начинается с оффсета C00 и заканчивается на D0F. Её длина 110h байт.

3. Модифицируем PE Header

Чотбы пофиксить PE Header, нам нужно сделать три шага:

- Увиличить число секций (число находится ан оффсете 06 в заголовке PE!)
- Увеличить Image Size
- Добавить нашу новуюсекцию в section table

Как вы видитет, PE signature находится по оффсету B0. На на оффсете B6 вы видите 03 00 (переведём в DWORD - 0003), т.к. у нас в оригинале 3 секции. Надеюсь понятно, что мы должны поменять 0300 на 0400.

Теперь нам нужно увеличить Image Size. Вещь о которой обычно забывают =) Давайте снова взглянем на файл через PEditor. Мы видим, что Section Alignment = 1000h, а Image Size = 4000h. Т.к. выравнивание у нас равно 1000h, наша секция должна быть длиной как минимум 1000h. Так что мы должны добавить 1000h к Image Size. Получается, что 4000h + 1000h = 5000h. Image size находится по оффсету 50h в заголовке PE. Идём к B0h + 50h = 100h. Тут меняем 0040 на 0050.

Сейчас нам нужно добавить секцию в section table. Эта таблица начинается с оффсета F8h в заголовке PE. На секцию отводится 28h байт в таком порядке:

+0  Array[8] of byte Name                -> назовём нашу секцию .Sun
+08 DWORD PhysicalAddress / Virtual Size -> Virtual size = 110h -> 10010000
+0C DWORD VirtualAddress                 -> 4000, т.к. для предыдущей 3000 -> 00400000
+10  (16)  DWORD SizeOfRawData           -> 110h -> 10010000
+14  (20)  DWORD PointerToRawData        -> мы добавили начиная с C00 -> 000C0000
+18  (24)  dword PointerToRelocations    -> 00000000
+1C  (28)  DWORD PointerToLineNumbers    -> 00000000
+20  (32)  WORD NumberOfRelocations      -> 00
+22  (34)  WORD NumberOfLineNumbers      -> 00
+24  (36)  DWORD Characteristics         -> C0000040 (как у секции .data) -> 400000C0

Итак, добавьте эти данные в таблицу сразу же за последней секцией по оффсету B0h + F8h + 3*28h = 220h. Если вы всё сделали правильно, то в итоге всё должно выглядеть как на скриншоте finish.gif.

Вот и всё. Сохраняйте файл, загружайте в PEditor, чтобы проверить всё ли в порядке. Ага, это совсем не сложно, не так ли?

Keep cool!

Sunshine
Post #: 3
RE: Добавление секции в РЕ файл - 2008-02-10 13:43:55.906666   
Dgedit

Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
Я выражаю огромную признательность тем кто хотя бы пытается мне помочь. Спасибо за ответ Flint_ta. Но я уже и сам нашел по типу таких же мсатериалов штуки 4 как минимум, и все утверждают одно и ТОЖЕ:
Открываем файл функцией CreateFile
Делаем проекцию CreateFileMapping
и работаем как с обычным массивом, и они правы вот если вы таким способом будете вписывать код вашей проги в промежуток между таблицей секцией и началом первой секции проблем нет таккак размер файла в таком случае не изменится,но если вы добавите секцию то файл не запустится, в результате моих экспериментов уц меня сложилось мнение что не запускается он по причине того что размер файла не соответствует образу фалйа которое описаное в опциональном заголовке. По поводу того материала что написал Flin_ta мне кажется что авторы занимаются плагиатом списыая друг у друга так как реально их примеры не работают( и сами они мне кажется тоже этого не пробовали).

Получилосб добавить секцию и оставить файл работоспособным у меня только таким способом:
invoke GetOpenFileNameA, offset ofn
;открываем файл
invoke CreateFile, offset buffer, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, \
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL

;дескриптор в hFile
mov hFile, eax

invoke GetFileSize, hFile, 0
mov fsize, eax
add eax, SECTION_VSZ + SECTION_PADD
invoke GlobalAlloc, GMEM_FIXED OR GMEM_ZEROINIT, eax
mov pMem, eax
invoke ReadFile, hFile, pMem, fsize, offset buffer, 0
mov edi, pMem ; esi указвыает на начало файла

и соответсвенно в конце я сохраняю файл

mov eax, fsize
add eax, 1000h ; 1000 это размер секции
invoke WriteFile, hFile, pMem, eax, offset buffer, 0


и только в этом случае у меня получается работтоспособный вариант.

Пишите кто что думает по поводу моих слов.
Post #: 4
RE: Добавление секции в РЕ файл - 2008-02-10 18:28:58.063333   
Flint_ta

Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
Сильно не пинать, писалось на коленке, для себя.
Вот такой код я как-то наваял для добавления новой секции:

PUSH 0 PUSH 080h PUSH 3 PUSH 0 PUSH 3 PUSH 0C0000000h push offset buffer call CreateFileA ; Îòêðûâàåì ôàéë mov hendlfile, eax;&nbsp; Ñîõðàíÿåì õýíäë ôàéëà push 0 push eax call GetFileSize ; Óçíàåì ðàçìåð ôàéëà mov razmer, eax;&nbsp; Ñîõðàíÿåì ðàçìåð ôàéëà push eax push 40h call GlobalAlloc ; Âûäåëÿåì ïàìÿòü mov pamat, eax; Ñîõðàíÿåì àäðåññ âûäåëåííîé ïàìÿòè push 0 push offset read push razmer push pamat push hendlfile call ReadFile; Ñ÷èòûâàåì ôàéë â ïàìÿòü mov edi, [pamat]; íà÷àëî ôàéëà â edi mov esi, edi ; êîïèðóåì íà÷àëî â esi add esi, 3ch mov eax, dword ptr ds:[esi]; Óçíàåì ñìåùåíèå PE mov esi, edi ; êîïèðóåì íà÷àëî â esi add esi, eax mov PE, esi mov eax, dword ptr ds:[PE] add eax, 6 xor ecx, ecx mov cx, word ptr ds:[eax]; Óçíàåì êîëè÷åñâî ñåêöèé mov sec, ecx;&nbsp; Ñîõðàíÿåì êîëè÷åñâî ñåêöèé mov eax, dword ptr ds:[PE] add eax, 38h xor ecx, ecx mov ecx, dword ptr ds:[eax]; Óçíàåì âûðàâíèâàíèå ñåêöèé mov alignment, ecx ; Ñîõðàíÿåì âûðàâíèâàíèå mov eax, dword ptr ds:[PE] add eax, 50h xor ecx, ecx mov ecx, dword ptr ds:[eax]; Óçíàåì Image Size mov sizeofimage, ecx ; Ñîõðàíÿåì Image Size mov edi, sec mov eax, esi add eax, 0f8h; äâèãàåìñÿ âíà÷àëî ïåðâîé ñåêöèè metka1: add eax, 28h ; ýòèì öèêëîì ñäâèãàåìñÿ âêîíåö ïîñëåäíåé ñåêöèè dec edi cmp edi, 0 jnz metka1 mov edx , dword ptr ds:[eax - 1ch]; Óçíàåì âèðòóàëüíûé àäðåññ ïîñëåäíåé ñåêöèè mov perd_sec_size, edx; è ñîõðàíÿåì åãî ;$+10&nbsp;&nbsp;&nbsp; SizeOfRawData mov edx , dword ptr ds:[eax - 18h]; Óçíàåì&nbsp; SizeOfRawData ïîñëåäíåé ñåêöèè mov SizeOfRawData, edx; è ñîõðàíÿåì åãî ; Ïîäãîòàâëèâàåì äåëåíèå push eax;&nbsp; ñîõðàíÿåì àäðåññ ïîä çàïèñü íàøåé ñåêöèè mov eax, edx; äåëèìîå:SizeOfRawData ïîñëåäíåé ñåêöèè xor edx, edx xor ecx, ecx mov ebx, dword ptr ds:[alignment] ; äåëèòåëü: Âûðàâíèâàíèå div ebx; äåëèì cmp eax, 1; åñëè îñòàòîê îò äåëåíèÿ ðàâåð 1 jz suda; çíà÷èò âûðàâíèâàíèå ðàâíî SizeOfRawData&nbsp; è íè÷åãî âûðàâíèâàòü íå íóæíî inc eax ; èíà÷å óâåëè÷èâàåì îñòàòîê íà åäèíèöó suda: mul ebx; è óìíîæàåì íà âûðàâíèâàíèå; òåïåðü â eax âûðàâíåííîå ïî alignment SizeOfRawData íàøåé ñåêöèè mov ecx, eax pop eax; âîçâðàùàåì àäðåñ ïîä çàïèñü íàøåé ñåêöèè mov dword ptr ds:[eax], 06e696c46h ; Ïèøåì&nbsp; íàçâàíèå äîáàâëÿåìîé ñåêöèè = Flint mov word ptr ds:[eax + 4], 0074h ; Ïèøåì&nbsp; íàçâàíèå äîáàâëÿåìîé ñåêöèè = Flint add eax, 8h mov dword ptr ds:[eax], 1000h; Ïèøåì ñêîëüêî áàéò äîáàâëÿåì add eax, 4h mov edx, dword ptr ds: perd_sec_size ; âèðòóàëüíûé àäðåñ ïðåäûäóùåé ñåêöèè add edx, ecx; äîâàâëÿåì SizeOfRawData ïðåäûäóùåé&nbsp; ñåêöèè, ñ êîððåêòèðîâêîé íà âûðàâíèâàíèå mov dword ptr ds:[eax], edx; Âèðòóàëüíûé àäðåññ íàøåé ñåêöèè mov [offset_new_sec], edx; Ñîõðàíÿåì âèðòóàëüíûé àäðåñ íàøåé ñåêöèè add eax, 4h mov dword ptr ds:[eax], 1000h;; Ïèøåì ñêîëüêî áàéò äîáàâëÿåì add eax, 4h mov ebx,&nbsp; dword ptr ds:[razmer] mov dword ptr ds:[eax], ebx; Çàïèñûâàåì ñìåùåíèå íàøåé ñåêöèè â ôàéëå add eax, 4h mov dword ptr ds:[eax], 0 add eax, 4h mov dword ptr ds:[eax], 0 add eax, 2h mov word ptr ds:[eax], 0 add eax, 2h mov word ptr ds:[eax], 0 add eax, 4h mov dword ptr ds:[eax], 0e0000020h mov eax, dword ptr ds:[sec];&nbsp; Çàïèñûâàåì â eax êîëâî ñåêöèé inc eax; óâåëè÷èâàåì íà åäåíèöó mov word ptr ds:[esi + 6], ax; çàïèñûâàåì çíà÷åíèå â çàãîëîâîê mov eax, dword ptr ds:[sizeofimage]; ÷èòàåì Image Size mov edx, dword ptr ds:[alignment]; ÷èòàåì âûðàâíèâàíèå add eax, edx; ñêëàäûâàåì ïîëó÷åííûå çíà÷åíèÿ mov edx, dword ptr ds:[PE]; Çàãðóæàåì ñìåùåíèå PE çàãîëîâêà add edx, 50h; Ïåðåõîäèì ê Image Size xor ecx, ecx mov dword ptr ds:[edx], eax; Êîððåêòèðóåì Image Size â çàãîëîâêå mov eax, dword ptr ds:[PE]; Çàãðóæàåì ñìåùåíèå PE çàãîëîâêà
Ну и так далее
Post #: 5
Страниц:  [1]
Все форумы >> [Прочее] >> Добавление секции в РЕ файл







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.