Добавление секции в РЕ файл
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Добавление секции в РЕ файл - 2008-02-08 00:42:51.406666
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
Написал программу которая открывает другой файл делает и добавляет секцию в его конец. Проблема в том что после всех моих манипуляций с ним при его открытии (другого файла) выскакивает MessageBox файл не Win32 формата. Хотя я вроде бы все правильно делал : добавляю секцию кода ставлю соответствующие атрибуты доступа и параметры секции типа смещений и все такое, меняю на нее точку входа, увеличиваю размер образа файла в опциональном заголовке, размер кода там же тоде увелиыиваю. Если кому вникать неохота будет может кто просто кинет ссылку на алгоритм работы загрузчика РЕ файлов я сам разберусь (а то найти не могу) заранее спасибо.
|
|
|
RE: Добавление секции в РЕ файл - 2008-02-09 16:31:15.183333
|
|
|
Dgedit
Сообщений: 131
Оценки: 0
Присоединился: 2007-02-04 15:07:37.163333
|
Хотелось бы немного уточнить вопрос. Насколько я сам эвспериментировал у меня сложилось мнение что все дело в размере файла. Я добавлял секцию путем проецирования файла на адресное пространство CreateFile Mapping этой функцией и как мне кажется в РЕ заголовке размер образа файла меняется ( я его меняю сам), а его размер на диске остается прежним. и получается что при загрузке файла загрузчик видит что эти две величины различаются и он выдает ошибку. Я прав?
|
|
|
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
|
|
|
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 и только в этом случае у меня получается работтоспособный вариант. Пишите кто что думает по поводу моих слов.
|
|
|
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; Ñîõðàíÿåì õýíäë ôàéëà
push 0
push eax
call GetFileSize ; Óçíàåì ðàçìåð ôàéëà
mov razmer, eax; Ñîõðàíÿåì ðàçìåð ôàéëà
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; Ñîõðàíÿåì êîëè÷åñâî ñåêöèé
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 SizeOfRawData
mov edx , dword ptr ds:[eax - 18h]; Óçíàåì SizeOfRawData ïîñëåäíåé ñåêöèè
mov SizeOfRawData, edx; è ñîõðàíÿåì åãî
; Ïîäãîòàâëèâàåì äåëåíèå
push eax; ñîõðàíÿåì àäðåññ ïîä çàïèñü íàøåé ñåêöèè
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 è íè÷åãî âûðàâíèâàòü íå íóæíî
inc eax ; èíà÷å óâåëè÷èâàåì îñòàòîê íà åäèíèöó
suda:
mul ebx; è óìíîæàåì íà âûðàâíèâàíèå; òåïåðü â eax âûðàâíåííîå ïî alignment SizeOfRawData íàøåé ñåêöèè
mov ecx, eax
pop eax; âîçâðàùàåì àäðåñ ïîä çàïèñü íàøåé ñåêöèè
mov dword ptr ds:[eax], 06e696c46h ; Ïèøåì íàçâàíèå äîáàâëÿåìîé ñåêöèè = Flint
mov word ptr ds:[eax + 4], 0074h ; Ïèøåì íàçâàíèå äîáàâëÿåìîé ñåêöèè = 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 ïðåäûäóùåé ñåêöèè, ñ êîððåêòèðîâêîé íà âûðàâíèâàíèå
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, 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]; Çàïèñûâàåì â 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 çàãîëîâêà
Ну и так далее
|
|
|
|
|