· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Создание новой секции

Посл.отвђт Сообщенiе


Дата: Апр 4, 2004 16:49:37

Здравствуйте, уважаемые.
Хочу сделать простой шифровальщик для PE-файлов(что бы разобраться до конца в формате). С Вашего сайта скачал исходник программы sectionadd. Там идет добавление секции и изменение EntryPoint на новую секцию. В ней по идее должен быть переход на Original EP. В своей программе я сохраняю OEP в переменной(все делаю так же, как в sectionadd). Пробовал писать в новой секции так:
------------------------
push OEP
ret
------------------------
Но вместо значения переменной, в программу пишется ее адрес :( Потом порылся еще в исходнике и понял, что нужно делать все через регистр EBP. Попробовал - не получилось. Вот что сейчас в моей секции:
------------------------
NewSection:

ASSUME FS:NOTHING
pushad
call delta
delta:
pop ebp
sub ebp, OFFSET delta ; ebp now holds where we are (basically)

mov eax, [ebp+OEP] ; здесь у меня падает сайс :(
;В программе sectionadd в EAX помещается OEP.
;Я вообще не понимаю, каким макаром она высчитывается...

;mov [esp+1ch], eax - это вообще не понятно зачем...
popad
jmp eax ; тут вроде должны возвращаться в основную программу

NewSectionEnd:
------------------------

Я и под отладчиком пытался смотреть... Вываливается :( Не знаю, что и делать. Помогите пожалуйста. Почему у меня не высчитывается оригинальная точка входа? Спасибо!

зы: а что с reversing.net? Его поднимут?


Дата: Апр 4, 2004 17:19:58

Ну для начала тебе бы посоветывал хорошенько так изучит ASM. Для начала, проверь, существует ли у тебя вообще переменная OEP, находится ли она после кода твоего. mov [esp+1ch], eax - это ты зря закоментировал. Объясняю, после команды popad у тебя восстановятся значения в регистрах, которые были до изменений. Поэтому необходимо "сохранить" OEP в eax...


Дата: Апр 4, 2004 22:42:56

Переменная OEP конечно же существует. Туда я сохраняю оригинальную точку входа.
Могу дать кое-какие числа:
pop ebp ; EBP==405006
sub ebp, OFFSET delta ; OFFSET delta==4011B6h. После этого EBP==3E50h
mov eax, [ebp+OEP] ; OEP==4012F8h и в EAX мы получаем 401000h... Каким образом?!

Я не понимаю, почему после сложения 3E50h и 4012F8h в EAX получается 401000h
Объясните, пожалуйста...
Если нужно, я могу написать какие значения получаются у меня. Просто я совершенно не понимаю почему так :(


Дата: Апр 4, 2004 23:58:53

А почему переменная OEP должна находиться после кода? Нельзя ее в секции данных располагать? Я пробовал делать обоими способоми, все-равно не получается(и от этого ничего не менятеся).


Дата: Апр 5, 2004 09:56:30

grundic
Попытаюсь ответить на один из Ваших вопросов.



pushad ; (1)
call delta

delta:
pop ebp
sub ebp, offset delta
.

.

OEPJump:
MOV EAX, [EBP+dwOEPVA] ;(3)
.IF EAX
MOV [ESP+01Ch], EAX ; (4)
POPAD ;(2)
JMP EAX
.ELSE
POPAD
RET
.ENDIF


(1)Тут мы перед выполнением поиска дельта - смещения, сохранили все регистры с помощью команды pushad.
(2)Далее, при передаче управления программе-носителю, мы восстанавливаем состояние всех регистров. Но, чтобы не терять адрес возврата в EAX ( который ма определили тут (3)), мы перед выполнением popad (2), подкорректируем в стеке старое содержимое EAX.
(я пользуюсь при решении подобных задач программой OllyDbg, в ней состояние стека видно, по умолчанию, а нижнем правом углу, да еще и подается в отношении к ESP ? мне кажется это особенно удобно.) Регистр EAX в стеке хранится по смещению ESP+01Ch, туда-то и запишем новое значение EAX ( тут Вам нужно внимательно просмотреть порядок сохранения регистров в стеке при выполнении команды pushad). Восстановим регистры ( уже с подправленным EAX), и передадим управление программе-носителю по адресу в EAX.

Очень подробно операцию получения дельта - смещения описал The Svin в [url=]http://www.wasm.ru/forum/index.php?action=vthread&forum=6&topic= 5277[/url]


Дата: Апр 6, 2004 11:04:45

Спасибо большое! С этим я разобрался. Но программа все-равно не хочет запускаться. Если, например, я пишу

NewSection:
push 401000h
ret
NewSectionEnd:

то программа нормально запускается. Если же я пишу

NewSection:
push OEP
ret
NewSectionEnd:

то вместо значения OEP пишется адрес переменной. В OPE точно содержится 401000h - в edit box появляется именно оно.
В файл новую секцию я записываю таким образом:

-----------------------
mov edi, pMemory
add edi, fSize
lea eax, NewSection ; адрес новой секции
xchg esi, eax
mov ecx, SECTIONLENGTH ; ее длина
rep movsb

...потом запись в файл....
-----------------------

Не подскажите ли, как сказать компилятору, что бы он писал значение, а не адрес переменной? Заранее благодарен.


Дата: Апр 6, 2004 12:18:32

push OEP ... ну напиши попробуй push dword ptr [OEP] хотя тебе надо через дельта-смещение...


Дата: Апр 6, 2004 16:07:23

... может быть
http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=5320
только если в теле другой программы то + delta-смещение к любому адресу ...


Дата: Апр 6, 2004 20:05:29 · Поправил: grundic

Всем бооольшое спасибо!!!
Конечно же, во всем оказался виноват Я сам. Если интересно, опишу, как все получилось.
Я взял одну и ту же программу и пропатчил сначала программой sectionadd, а потом своей.. Стал сравнивать... Потом посмотрел, что находиться по адресу [ebp+OEP]... Естесственно там находилась OEP! потом стал искать 00104000 в свое программе. Не нашел :)
В своей программе я писал так:

------------------------------------------
NewSectionEnd:


OEP dd 4010cch
------------------------------------------

Естесственно, в прогамму ничего не записывалось. Я разобрался. Надо было OEP внести в секцию. Всем спасибо за помощь... Я даже сказал бы за поддержку :) Спасибо!


Дата: Апр 6, 2004 20:08:08 · Поправил: grundic

Еще один вопрос: как в masm32 сделать секцию Writeble? Что бы при компиляции свойства секции .text были E0000020. Спасибо.


Дата: Апр 6, 2004 21:28:22

\masm32\bin\link /nologo /SECTION:.text,EWR /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib %PROJECTNAME%.obj %PROJECTNAME%.res


Дата: Апр 7, 2004 00:16:44

Спасибо огромное!


Дата: Апр 7, 2004 00:30:36

Я RadAsm использую и сначала не получалось приписать к линковщику /SECTION:.text,EWR - писал какую-то ошибку.
Вот что написано на офф. сайте:


Q: I want to add masm link parameter /SECTION:.text,RWE in RadASM,how?
A: RadASM uses commas to seperate fields.
Replace the comma with a pipe symbol: /SECTION:.text|RWE.
RadASM will replace the pipe with a comma in its final parsing.

Т.е. надо в Project->Options в строчке Link дописать /SECTION:.text|RWE. Надеюсь, это кому-нибудь поможет.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.103