|
|
| Посл.отвђт | Сообщен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 |