![]() |
eXeL@B —› Протекторы —› In-line для армадиллы |
Посл.ответ | Сообщение |
|
Создано: 08 октября 2005 09:51 · Личное сообщение · #1 |
|
Создано: 08 октября 2005 13:40 · Личное сообщение · #2 У Нарваи же вроде все подробно описано. Есть и переведенные. Тутот для Лидии тебе поможет. А вкратце вот: 1 Ставишь на Олю IsDebugerPresent и патч от OutputDebugStringA 2. Ставишь бряк на WaitForDebugEvent и смотришь адрес куда он возвращает доклад (например ХХХХХХХХ) Бряк ставить надо не на первых командах API, иначе Arma тебя пропалит. 3. Ставишь бряк на WriteProcessMemory. Прервался. Смотришь Какой был доклад. Там 4 значения будут одинаковые. Это - OEP. Выполняешь WriteProcessMemory и с помощью Pupe на OEP дочернего процесса вписываешь EBFE. 4. Ставишь опять бряк на WaitForDebugEvent. Прервался в API. НЕ ВЫПОЛНЯЙ ЕЁ. Посмотри в стеке куда надо вернуться и перейди туда (New Origin Here). Занопь вызов WaitForDebugEvent (не забудь про параметры). 5. Сейчас ты находишься в функции, которая расшифровывает код. У неё есть еще одно назначение - затирать распакованный в памяти код. Чтобы не все куски находились там одновременно. Вобщем, тебе надо найти вызов этого "разрушителя" и занопить его. 6. А теперь пришла пора инлайнить ![]() add dword ptr [XXXXXXXX + 18], 1000 add dword ptr [XXXXXXXX + 24], 1000 add dword ptr [XXXXXXXX + 28], 1000 add dword ptr [XXXXXXXX + 54], 1000 ;вроде по этим смещениям там одинаковые dword'ы cmp dword ptr [XXXXXXXX + 54], YYYYYYYY ;где YYYYYYYY - адрес секции, следующей за .text jnz < куда-то там откуда был переход на инлайн ![]() nop ;а сюда ставишь бряк Теперь все четыре значения в докладе поменяй на адрес секции .text (400000 в основном если exe) Запускай прогу и когда брякнешся на nop'е все должно быть распаковано. Разделяй процессы. Запускай вторую Олю и делай атач к висящему на OEP дочернему процессу. Восстанавливай байты на OEP и делай dump. Осталось восстановить импорт. Там геморно больно у Нарваи описано. Брякайся на WaitForDebugEvent смотри, появилось ли в памяти значение из IAT. Если нет, то запускай прогу. Снова брякаешься на WaitForDebugEvent, снова смотришь... и т.д. Все хорошо и просто, если бы иногда не приходилось делать так вот раз 500 ![]() Вощем писать надоело. Есле надо дальше, то говори. Сырцы плугина могу подкинуть. Может до ума его доведешь. ![]() |
|
Создано: 08 октября 2005 13:46 · Личное сообщение · #3 |
|
Создано: 08 октября 2005 14:03 · Личное сообщение · #4 Залил его на шару Download-Link: http://rapidshare.de/files/6037261/mYoLLYpLUG.rar.html (182kb) Там внутри еще хелп по написанию плугинов к Оле В кратце как им пользоваться и как он должен (но не обязан ![]() 1. Запускаете родителя. Делаете игноры всех исключений. Незабудте про фигню с OutputDebugStringA 2. Ставите вряк внутри функции WaitForDebugEvent (тока не в самом начале). Shift+F9 3. Прервались первый раз. Идете в Plugins->mYoLLYpLUG. Там вводите PID дочернего процесса (к этому времени дочерний уже будет создан). И адрес, который надо мониторить. 4. Нажимаете Ok. Если все правильно ввели то Оля потормозит и, через несколько секунд выплюнет окно, что мол все тип-топ. 5. Теперь уже ваша работа. Патчите апи GetProcAddress ДОЧЕРНЕГО процесса с помощью Pupe. Разделяете процессы, атачитесь к повисшему на GetProcAddress ребенку, восстанавливаете байты и теперь делайте что хотие. Вы в цикле создания импорта. ![]() |
|
Создано: 08 октября 2005 14:08 · Личное сообщение · #5 |
|
Создано: 08 октября 2005 14:20 · Личное сообщение · #6 теперь про сырцы. они as is по названию проекта можно понять, откуда я тягал шаблон плугина ![]() ~ text2dword - преобразует строку с HEX числом в само число. ~ ODBG_Plugindata - callback. устанавливает название плугина в меню ~ ODBG_Pluginaction - callback. собстно что плугин должен делать, когда вы в меню его запускаете ~ ODBG_Pausedex - callback. Когда программа останавливается (по бряку, по ошибке, просто завершается) Оля вызывает эту функцию. В этой функции открывается дочерний процесс, читается указаная память. Если там то же, что и было прежде, то продолжается выполнение проги. Если нет - УРА. Найдено. ![]() ~ main_work() - выводит диалог если вы там все ввели, запускает прогу. Т.к. бряк на WaitForDebugEvent у вас стоит, то прога там прервется, проверит память и, есле не найдет изменений, снова запустится. Потом снова прервется... и.т.д. Пока не произойдет изменение в памятили или ошибка ![]() Это не релиз. И даже не бета с альфой. Это для тех, кто желает сделать так, чтобы оно когда-нибудь стало альфой или бетой или релизом ![]() ![]() ![]() |
|
Создано: 08 октября 2005 14:31 · Личное сообщение · #7 Ara пишет: Где вот наши переводчики, перевели бы хелп на русский... Да там не фонтан документация... Не msdn. Без поллитры и какой-то матери там неуютно себя чувствуешь ![]() Например первый вариант у меня был такой: цикл { проверить изменение в памяти есть изиенения? -да выдти из цикла -нет запустить прогу. } Оля вешалась. ![]() Полазив по ихнему форуму нашел решение. Добавил callback, чтоб при остановке на бряке вызывалась моя функция. А в документации по этому поводу я ниче не нашел. Не исключено, конечно, что плохо искал... Т.ч. хелп оставляет о себе впечатления средней тяжести ![]() ![]() |
|
Создано: 08 октября 2005 14:40 · Личное сообщение · #8 Sax0n Я эту срань пробовал отфакать в MovieCollector по методике из двух туторов (там борьба с возвратом доклада API разная) - разбирался с тутором по наномитам в Арме 4.хх - ХРЕН - не покатило - декриптовалась только одна секция. Выходит - не всегда "катит"... ![]() Ara Могу помотреть хелпу (хотя, если он на Инглише - электронные переводчики сносно довольно лопатят) ![]() |
|
Создано: 08 октября 2005 14:48 · Поправил: estet · Личное сообщение · #9 |
|
Создано: 09 октября 2005 01:05 · Личное сообщение · #10 |
|
Создано: 09 октября 2005 01:37 · Личное сообщение · #11 Ммм, пацаны ![]() ![]() ![]() ![]() ![]() Sax0n Cool, сенк. Я тебе предлагаю покодить вместе. Си я знаю, но плагины для оли ниразу не писал, хочу попрактиковаться, заодно докодить плагин и выложить на "разтерзание" ![]() ![]() |
|
Создано: 09 октября 2005 02:55 · Личное сообщение · #12 |
|
Создано: 09 октября 2005 04:04 · Личное сообщение · #13 |
|
Создано: 09 октября 2005 04:24 · Личное сообщение · #14 |
|
Создано: 09 октября 2005 04:41 · Личное сообщение · #15 |
|
Создано: 09 октября 2005 07:37 · Личное сообщение · #16 |
|
Создано: 09 октября 2005 13:37 · Личное сообщение · #17 |
|
Создано: 09 октября 2005 14:09 · Личное сообщение · #18 |
|
Создано: 09 октября 2005 19:54 · Личное сообщение · #19 |
|
Создано: 12 октября 2005 12:48 · Личное сообщение · #20 |
|
Создано: 12 октября 2005 14:08 · Личное сообщение · #21 Надо замиксовать руки, мозги и прогу в нужных пропорциях ![]() ![]() ![]() |
|
Создано: 12 октября 2005 14:11 · Личное сообщение · #22 |
![]() |
eXeL@B —› Протекторы —› In-line для армадиллы |