![]() |
eXeL@B —› Основной форум —› Исследование Girder 3.3.10 |
<< . 1 . 2 . 3 . 4 . >> |
Посл.ответ | Сообщение |
|
Создано: 06 ноября 2005 05:02 · Личное сообщение · #1 Доброго времени суток всем! Я в крэкерском искусстве пока новичок, поэтому очень надеюсь, что кто-нибудь из профессионалов уделит моей проблеме немного внимания. Суть в следующем. Я хочу исследовать программу Girder версии 3.3.10. Это программа для обработки команд с ИК-пульта и управления компьютером. О программах такого типа уже был разговор на форуме, правда, в другом аспекте. Найти её можно по этой ссылке: promixis.com/download.php?ID=673 . И вот столкнулся с такой ситуацией: не могу определить, запакован ли исполняемый файл. Программа вроде бы написана на Дельфи (в пользу этого говорят большой размер exe-файла, и в Restorator'е формочку какую-то видно, и названия процедур и свойств), а PEid пишет: "Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]". Запускал ProtectionID 5.0 - результат: "Armadillo [unknown version] detected !". PE-Scan 1.4a отвечает, что "no recognised packer/encryptor found" (вроде как отсутствуют распознаваемые пакеры - несколько радует), а DeDe 3.50 при нажатии кнопки "Процесс" сначала выводит сообщение "DConsoleapplication compiled with runtime packages found", затем при загрузке цели очень надолго останавливается (я так и не дождался окончания загрузки). В этой связи у меня вопрос: как мне решить, упакована программа или нет? И, если это действительно Armadillo, то что против него можно в дальнейшем предпринять? Если у кого-то есть время и желание, подскажите, пожалуйста. ![]() |
|
Создано: 19 декабря 2005 21:10 · Личное сообщение · #2 |
|
Создано: 19 декабря 2005 22:25 · Личное сообщение · #3 |
|
Создано: 19 декабря 2005 22:43 · Личное сообщение · #4 rep0A пишет: Используй скрипт Какой именно? Тот, который в туторе (для Армы 4.20) или Armadillo Standard Unpack? Судя по предыдущим сообщениям, это не слишком навороченная Арма, может, с ней и Standard справится? rep0A, ещё вопрос: какого размера должен получиться дамп до добавления импорта (сохранённый Лордом) и какого размера после добавления импорта в ImpRec'е? ![]() |
|
Создано: 19 декабря 2005 23:11 · Поправил: rep0A · Личное сообщение · #5 |
|
Создано: 19 декабря 2005 23:45 · Личное сообщение · #6 rep0A, спасибо большое за ссылку, но хочется самому достичь результата... Я тебя не слишком расспросами достал? Ты извини, если что... Просто консультируюсь как у более опытного, закалённого в боях с Армадиллой товарища ;) А сам пока окончательно запутался. rep0A пишет: Например там таких call-ов не будет. Будут jmp-ы. А у меня и CALL'ы откуда-то взялись. Применил стандартный скрипт. Вот фрагмент кода, начиная с найденной OEP: 00588C2C PUSH EBP <-OEP 00588C2D MOV EBP,ESP 00588C2F ADD ESP,-18 00588C32 PUSH EBX 00588C33 PUSH ESI 00588C34 XOR EAX,EAX 00588C36 MOV DWORD PTR SS:[EBP-18],EAX 00588C39 MOV DWORD PTR SS:[EBP-14],EAX 00588C3C MOV DWORD PTR SS:[EBP-10],EAX 00588C3F MOV EAX,Girder.00588864 00588C44 CALL Girder.00406DE0 00588C49 MOV EBX,Girder.0058EF74 00588C4E XOR EAX,EAX 00588C50 PUSH EBP 00588C51 PUSH Girder.00588EA8 00588C56 PUSH DWORD PTR FS:[EAX] 00588C59 MOV DWORD PTR FS:[EAX],ESP 00588C5C MOV EDX,Girder.00588EC0 00588C61 MOV EAX,Girder.00588ED0 00588C66 CALL Girder.005887D4 00588C6B LEA EDX,DWORD PTR SS:[EBP-10] 00588C6E MOV EAX,Girder.00588ED8 00588C73 CALL Girder.00588630 00588C78 MOV EAX,DWORD PTR SS:[EBP-10] 00588C7B MOV EDX,Girder.00588EC0 00588C80 CALL Girder.00403FC8 00588C85 JNZ SHORT Girder.00588C9E 00588C87 PUSH Girder.0058EF70 00588C8C PUSH 0 00588C8E PUSH 0 ... Как видишь, целых четыре вызова, и только один условный переход в самом конце. А если следовать твоим указаниям: rep0A пишет: Просто понажимай F7 от оеп пока первый такой jmp не появится. Первый JMP при пошаговом проходе появляется только здесь (их тут целых 4): 00406CE0 JMP DWORD PTR DS:[58F2DC] 00406CE6 MOV EAX,EAX 00406CE8 JMP DWORD PTR DS:[58F2D8] 00406CEE MOV EAX,EAX 00406CF0 JMP DWORD PTR DS:[58F2D4] 00406CF6 MOV EAX,EAX 00406CF8 JMP DWORD PTR DS:[58F2D0] 00406CFE MOV EAX,EAX 00406D00 PUSH EBX ... Я, может, не там копаю? Поправь, если не так. ![]() |
|
Создано: 20 декабря 2005 00:19 · Личное сообщение · #7 |
|
Создано: 20 декабря 2005 20:45 · Личное сообщение · #8 [U]Serge пишет: 00406CE0 JMP DWORD PTR DS:[58F2DC] 00406CE6 MOV EAX,EAX 00406CE8 JMP DWORD PTR DS:[58F2D8] 00406CEE MOV EAX,EAX 00406CF0 JMP DWORD PTR DS:[58F2D4] 00406CF6 MOV EAX,EAX 00406CF8 JMP DWORD PTR DS:[58F2D0] 00406CE0 - FF25 DCF25800 JMP DWORD PTR DS:[<&kernel32.GetModuleHa>; kernel32.GetModuleHandleA
![]() |
|
Создано: 21 декабря 2005 01:27 · Личное сообщение · #9 NIKOLA Ага, до этих вызовов я уже догадался. rep0A пишет: Если ты поставишь ret в ту процедуру и импорт не перенаправится в тело армы, то потом вылезет MessageBox с сообщением что произошла ошибка импорта и программа будет закрыта или чтото в этом роде. Чтобы окно не появлялось надо "занопить" прыжок. Нашёл так: bp MessageBoxA rep0A, а как поставить брекпойнт на функцию через bp? Внизу, через Command Bar? Но там для bp приведён следующий формат: bp address, string - Break with condition [останов по условию] ИМХО, больше бы подошла команда bpx, но как с ней ни мучался - не могу никуда её толком пристроить, чтобы сработала как надо. Запускаю её перед последним переходом на OEP (перед постановкой брекпойнта на OEP), потом стартую - и вот снова появляется сообщение о невозможности импорта. Как правильно сделать, и, главное, КОГДА по ходу действия надо поставить останов на MessageBoxA? ![]() |
|
Создано: 21 декабря 2005 07:32 · Личное сообщение · #10 |
|
Создано: 21 декабря 2005 20:29 · Личное сообщение · #11 [U]Serge пишет: Как правильно сделать, и, главное, КОГДА по ходу действия надо поставить останов на MessageBoxA? Вот когда ты записал ret в начало той процедуры и снял бряк на память, вот тогда и надо ставить bp MessageBox в низу в CommandBar-е. Если не сработает, попробуй поставить бряк не на первый байт("B"->2раза ЛКМ на бряке и поменять бряк с начала на ret). [U]Serge пишет: а как поставить брекпойнт на функцию через bp? Внизу, через Command Bar? Да. NIKOLA пишет: 00406CE0 - FF25 DCF25800 JMP DWORD PTR DS:[<&kernel32.GetModuleHa>; kernel32.GetModuleHandleA Вот так сразу и было? Не надо было рет в процедуре прописывать? ![]() |
|
Создано: 21 декабря 2005 21:06 · Личное сообщение · #12 |
|
Создано: 21 декабря 2005 23:50 · Поправил: rep0A · Личное сообщение · #13 |
|
Создано: 21 декабря 2005 23:53 · Личное сообщение · #14 |
|
Создано: 22 декабря 2005 00:06 · Личное сообщение · #15 |
|
Создано: 22 декабря 2005 22:34 · Личное сообщение · #16 rep0A Вот мини тутор. Всё что написано ниже, касается конкретно этой проги (см. назв. темы). Загружаем Girder.exe в Олю. В отладчике на вкладке Options>Debugging options>Exeptioons ставим везде галочки. Запускаем по ф9, появиться наг. В главном окне олли Go to>Expression пишем CreateThread и жмём ОК. Попали в системную функцию. Ставим бряк на конец этой функции (RET). В наге жмём ОК. Остановились на бряке. Выходим по ф7, попали в арму, выходим из этой функции по ф7. Скролим вниз пару строчек, видим это: 003DCA81 PUSH DWORD PTR DS:[ESI+C]
Видим две команды CALL ECX, нас интересует только вторая команда перед RET, ставим на неё бряк и ф9, остановились и ф7. Мы на ОЕП: 00588C2C PUSH EBP
Теперь займёмся импортом. Нам нужно найти один правильный вызов любой апи, на первом кале, выделяем его и Follow, попали сюда: 00406DE0 PUSH EAX
выше видем: 00406DAB CALL Girder.00406CD8 ; JMP to kernel32.GetModuleFileNameA
на этом адресе опять Follow и попадае сюда: 00406CD8 JMP DWORD PTR DS:[58F2E0] ; kernel32.GetModuleFileNameA
выделяем этот адрес и Follow in Dump>Memory Address. В окне дампа выделяем первые четыре байта и Breakpoint>Hardware, on write>Dword. Перезапускаем олю (Ctrl+F2) и ф9 (бряк с CreateThread пока можно снять, что бы не мешал). Появится наг. В наге жмём ОК, остановились здесь: 77C36FA3 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
это нам не интересно, ещё раз ф9, остановились здесь: 003D9925 MOV ECX,DWORD PTR SS:[EBP-359C]
Убераем старый бряк Debug>Hardware breakpoints> Delete и ставим новый Breakpoint>Hardware, on execution на строчку выше того места где остановились, а именно: 003D992B MOV DWORD PTR DS:[EAX],ECX
Перезапускаем олю (Ctrl+F2) и ф9. В наге опять ОК и остановились здесь: 003D992B MOV DWORD PTR DS:[EAX],ECX
Теперь, выделяем регистр EAX (в окне регистров) и Follow in Dump. Вокне дампа у нас начало таблицы (ИАТ). Сейча нам нужно найти, так называемый (по Нарвахе), магический прыжок. Здесь я не буду об'яснять как его найти, я его определяю на глаз. Если кому интересно, потрассеруйте весь этот цикл. Вот участок кода: 003D97D0 JMP 003D9941
Нопим его. Идём обратно на то место, где остановились и ниже видим: 003D9941 CALL DWORD PTR DS:[3E30A4] ; kernel32.GetTickCount
см.коментарий. Отпускаем по ф9. Появится окно с ошибкой "Cannot find import" и т.д. ни вкоем случае не закрывайте это окно. Теперь копируем всю таблицу Binary>Binary Copy и сохраняем в текстовый файл, вот теперь можно закрыть окно. Делаем рестарт (снимаем хардварный бряк) и ф9 , опять появиться наг. В главном окне олли Go to>Expression пишем CreateThread и жмём ОК ну и доходим до ОЕП. Идём, в окне дампа, на начало нашей таблицы и вставляем из текстового файла, нашу сохранённую таблицу и дампим, потом запускаем импрек ну и дальше как обычно. Если захочется отрезать лишнии секции, после дампа ребуильдим ресурсы>отрезаем секции>вставляем ребулд.секцию ресурсов>цепляем ИАТ импреком. Всё. ![]() |
|
Создано: 23 декабря 2005 00:52 · Личное сообщение · #17 Большое спасибо за тутор! Много стало более понятным. В принципе я всё делал также до NIKOLA пишет: ставим новый Breakpoint>Hardware, on execution на строчку выше того места где остановились, а именно: 003D992B MOV DWORD PTR DS:[EAX],ECX Если вместо этого проскролить наверх пока не будет 00CB9770 FF15 8033CC00 CALL DWORD PTR DS:[CC3380] ; msvcrt._stricmp, поставить бряк(Breakpoint->Hardware, on exetution) на Call чуть выше, тоесть на 00CB975A, перезапустить прогу,брякнутся на 00CB975A,нажать F7,нажать пробел, ввести ret, снять бряк и запустить(F9), то получится тотже эффект. ![]() NIKOLA пишет: Теперь копируем всю таблицу Binary>Binary Copy и сохраняем в текстовый файл А вот до этого не додумался. Вместо этого искал переход отвечающий за это окно и нопил его. ![]() ![]() |
|
Создано: 23 декабря 2005 20:09 · Личное сообщение · #18 А я сделал так, как делал rep0A. Мне этот вариант пока кажется более простым. Хотя надо будет и второй способ попробовать. У меня пока вот какая проблема. Сделал всё по первому варианту, вроде бы получилось. Единственное, что не могу, так это занопить вызов MessageBoxA. Вернее, я поставил точку останова по этой функции, нашёл её адрес, заменяю на nop-ы, а она всё равно вылезает. За три дня уже все варианты перепробовал. Вчера случайно как-то получилось, сделал дамп, а импорт не успел, на работу бежать надо было. Повторить фокус не удалось, как ни мучался. Вот такой вопрос: по какому адресу правильнее делать NOP? Пробовал нопить по написанному rep0A адресу, получается, только размер файла другой выходит. Но ведь у меня может быть другой адрес этого джампа? Вызов процедуры (у меня) я привёл в аттаче. ![]() ![]() |
|
Создано: 24 декабря 2005 00:45 · Поправил: rep0A · Личное сообщение · #19 [U]Serge Я могу конечно расказать как найти нужный переход, но намого легче делать как NIKOLA NIKOLA пишет: Теперь копируем всю таблицу Binary>Binary Copy и сохраняем в текстовый файл, вот теперь можно закрыть окно. Делаем рестарт (снимаем хардварный бряк) и ф9 , опять появиться наг. В главном окне олли Go to>Expression пишем CreateThread и жмём ОК ну и доходим до ОЕП. Идём, в окне дампа, на начало нашей таблицы и вставляем из текстового файла, нашу сохранённую таблицу и дампим, потом запускаем импрек ну и дальше как обычно. ![]() |
|
Создано: 25 декабря 2005 19:44 · Личное сообщение · #20 rep0A пишет: Я могу конечно расказать как найти нужный переход Расскажи, если не сложно. Хочу попробовать оба способа. Попробовал делать по тутору (by NIKOLA). Как нашли OEP, вроде понятно. А вот дальше не очень: NIKOLA пишет: Теперь займёмся импортом. Нам нужно найти один правильный вызов любой апи, на первом кале, выделяем его и Follow Просьба прокомментировать подробнее с учётом недостатка опыта Вашего покорного слуги ;) Выделяем сам CALL (команду) или вызов апи? Если апи, то как его найти? Надо ли делать рестарт перед этим и затем всё снова до первого CALL ECX, или после нахождения OEP возвращаемся (Ctrl+G) на первый CALL ECX? ![]() |
|
Создано: 25 декабря 2005 19:58 · Поправил: NIKOLA · Личное сообщение · #21 |
|
Создано: 26 декабря 2005 00:16 · Личное сообщение · #22 [U]Serge пишет: Просьба прокомментировать подробнее с учётом недостатка опыта Вашего покорного слуги ;) ты лучше попытайся понять что и зачем делается, а не методом тыка действуй ;) NIKOLA пишет: Появится окно с ошибкой "Cannot find import" и т.д. ни вкоем случае не закрывайте это окно. Теперь копируем всю таблицу Binary>Binary Copy и сохраняем в текстовый файл, вот теперь можно закрыть окно. а зачем ? лучше сразу читать эту иат импреком, потом пофиг что будешь делать с процессом и когда появится дамп, импорт то уже в импреке будет правильный, останется только фиксдамп нажать. ![]() |
|
Создано: 26 декабря 2005 02:23 · Личное сообщение · #23 NIKOLA, извини за глупый вопрос. Я тебя неправильно понял, думал, что ты говоришь про первый CALL, который был ранее, а ты имел в виду первый CALL, который идёт сразу после OEP. Сорри. Mario555 пишет: ты лучше попытайся понять что и зачем делается Именно этим я сейчас и занимаюсь, поэтому вожусь так долго. Проблема в том, что я чего-то, может быть, недопонимаю или неправильно понимаю (как в случае с этим CALL-ом). Но я пытаюсь разобраться и до всего дойти сам, а если что-то становится непонятным, то спрашиваю. Бывает и так, что пока дождусь ответа, сам уже разберусь (так было, например, в случае с бряком на MessageBoxA. Команду ввёл, забыл Enter нажать, бряк и не сработал ;). Ты абсолютно прав, понимание - это главное. Сабж с данной защитой - это только частный случай. Универсального способа для распаковки всех программ с армой вроде бы пока ещё не придумали, поэтому важно знать технику самого процесса, понимать его суть. В принципе, я почти разобрался с тем порядком, который предложил NIKOLA, сейчас разбираюсь с финальной частью, с таблицей IAT. ![]() |
|
Создано: 26 декабря 2005 16:52 · Личное сообщение · #24 [U]Serge пишет: Расскажи, если не сложно. Хочу попробовать оба способа. Брякнулись на меседжбоксе. Теперь нажимаем Debug->Execute till user code и ОК в меседжбоксе. Оказались в арме. Из окна ошибки мы узнали что ошибка произошла в функции ARMDEBUG= и поэтому ставим бряк на 5CBDA2: 005CBDA2 |. 68 EC465F00 PUSH Girder.005F46EC ; ASCII "ARMDEBUG=" Перезапускаем прогу и оказываемся на адресе 5CBDA2. Теперь несколько раз нажимаем F8 и замечаем что прога запускается в этом call-е: 005CBDCE |> E8 CDF7FFFF CALL Girder.005CB5A0 Ставим на него бряк и перезапускаем прогу. После того как мы на нём оказались жмём F7, видим что в call-e всего один вызов. Входим в него(F7). Теперь упорно жмём F8 пока не окажемся здесь: 005CB4D5 > E8 61E8FFFF CALL Girder.005C9D3B Ещё раз нажимаем F8. Вылезает наг. Жмём в нём на OK. Ещё несколько раз нажимаем на F8 замечаем что прога запускается тут: 005CB4FC . FF15 54AA5F00 CALL DWORD PTR DS:[5FAA54] Смотрим что сверху и видим этот прыжок: 005CB4F5 . 75 11 JNZ SHORT Girder.005CB508 Ставим на него бряк, перезапускаем прогу и восстанавливаем импорт как раньше. Только вместо окна с ошибкой о импорте брякаемся на 5CB4F5. Смотрим что стоит ниже: Jump is taken. Теперь нажимаем пробел, вводим nop. Осталось только дойти до ОЕП и сдампить. Только мучится если можно сделать раз в 20 легче и быстрее. ![]() ![]() |
|
Создано: 26 декабря 2005 19:22 · Личное сообщение · #25 rep0A пишет: Только мучится если можно сделать раз в 20 легче и быстрее А я уже сделал по тутору от NIKOLA (кстати, NIKOLA, респект тебе за тутор, отлично всё изложил). Только ненужные секции пока выкидывать не пробовал (попробую обязательно). Теперь хочу с другим методом разобраться. Ведь легче разбираться, когда проводишь аналогии типа: "...ага, в этом методе мы это сделали вот так, а здесь добились того же самого вот так...". ИМХО, так материал лучше усваивается. ![]() |
|
Создано: 26 декабря 2005 19:50 · Личное сообщение · #26 |
|
Создано: 26 декабря 2005 21:17 · Личное сообщение · #27 |
|
Создано: 26 декабря 2005 21:24 · Личное сообщение · #28 |
|
Создано: 26 декабря 2005 21:42 · Поправил: rep0A · Личное сообщение · #29 |
|
Создано: 27 декабря 2005 00:21 · Личное сообщение · #30 |
|
Создано: 30 декабря 2005 00:13 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . >> |
![]() |
eXeL@B —› Основной форум —› Исследование Girder 3.3.10 |