Только для образовательных целей! |
|
Автор: | bi0w0rM [AHTeam] |
Уровень: | Для опытных |
Программа: |
Размер: |
Инструменты: |
"Луч зари К стене приник Я слышу звон ключей Вот и все... Палач мой здесь Со смертью на плече" [[iNTR-0] Как-то давно еще в лицее надо было найти на праздник фонограмму Ленинграда "WWW". Так как у меня есть инет, все естественно свалили на меня. Я ехал домой и думал: где ж я искать это буду? Есть ли такая фонограмма в природе вообще? Да даже если есть, то хрен я там выкачаю ее, так как это точно жирная mp-три-ха, а инета было мало :(( И действительно, Яндекс мало что мне дал. И тогда я просто набрал нашару сайт: www.karaoke.ru и оказалось есть такой сайт! Более того, искомая фонограмма там оказалась и качать пришлось на редкость мало - файл был с расширением .kar и весил всего-то несколько килобайт. Но открыть его надо было специальной прогой, звалась она Karaoke GALAXY Player 4.1.0.0, ну качать было около мегабайта. Прога была успешно скачана, фанера была перекатана на кассету(правда музыка от оригинала отличалсь). Прога была шароварная и взлом ее я оставил напотом. Потом решил все-таки засесть за нее и вот что я накопал..
[[cRACKiNG] Прога запакована каким-то убогим паковщиком, скорее всего это частный случай, когда программеры таки сами решили хотяп запаковать программу. Ну для распаковки мне не помогли бы никакие авто-распаковщики, так как, самый прикольный GUW32 после установки XP не стал запускаться, а ProcDUMP не смог(может и смог бы, если скрипт написать). С софтайсом у меня пока тоже проблемы. Итак, берем с сайта www.smidqeonsoft.com или с родного www.wasm.ru ;) софтину PEBrowse Professional Interactive (супер реальное название!). Может у вас тоже проблемы с софтайсом, но я уже не считаю, что это уж такая кульая вещь. Его реально может заменить PEBrowse или наконец OllyDbg 1.09! Я удачно распаковывал прогу с любым из этих отладчиков.
Я сейчас быстро опишу устройство паковщика. Не задавайте вопросов: "Откуда он знал, где переход на OEP??", я еще во времена WinME у себя на компе все исследовал софтайсом, но и тут догадаться нетрудно. Открываем прогу в PEBrowse(или в OllyDbg). В OllyDbg 1.05 выскочила "ошибка", то есть вам нужно нажать Shift+F9 и анализ продолжится дальше. Вот куда нас привел PEBrowse:
PID: 1440 TID: 240 - Stack Contents for 0x000000CC 0x000000CC: 0x77F83E02: RtlCaptureContext + 0x09F0 0x77F65EC2: RtlConvertExclusiveToShared + 0x0282 0x77F68CA1: RtlpEnsureBufferSize + 0x00C7 Проходим эту фигню по F10 и попадаем в начало кода распаковщика:
Disassembly of 0x004596EE in Galakar.exe + 0x4596EE: NOP 0x4596EF: NOP 0x4596F0: NOP 0x4596F1: JNZ 0x4596F3 ; SYM:0x000596F3; (*+0x2) 0x4596F3: JMP 0x513000 ; SYM:0x00113000; (*+0xB990D) ; <==0x004596F1(*-0x2) ;******************************************************************************** 0x513000: PUSHAD ; <==0x004596F3(*-0xB990D) Если вы используете OllyDbg, то остановитесь сразу же на этом коде. И вместо F10 в OllyDbg надо нажимать F7(Step). После выполнения "JMP 0x513000" произойдет переход вот сюда:
Disassembly of 0x00513001 in Galakar_non.exe + 0x513001: CALL 0x513006 ; SYM:0x00113006 0x513006: POP EBP ; <==0x00513001(*-0x5) 0x513007: SUB EBP,0x43A8EA ; SYM:0x0003A8EA ; CODE(?):0x8A 0x75 0x45 0x40 0x51300D: MOV EAX,0x43A8E4 ; SYM:0x0003A8E4 ; CODE(?):0x0F 0xDE 0xCC 0xD5 0x513012: ADD EAX,EBP 0x513014: SUB EAX,DWORD PTR [EBP+0x43AD78] ; SYM:0x0003AD78 0x51301A: MOV DWORD PTR [EBP+0x43AD84],EAX ; SYM:0x0003AD84 0x513020: CMP BYTE PTR [EBP+0x43AD6E],0x0 ; SYM:0x0003AD6E 0x513027: JNZ 0x51303E ; SYM:0x0011303E 0x513029: INC BYTE PTR [EBP+0x43AD6E] ; SYM:0x0003AD6E 0x51302F: CALL 0x513051 ; SYM:0x00113051 0x513034: CALL 0x5132AC ; SYM:0x001132AC 0x513039: CALL 0x513348 ; SYM:0x00113348 0x51303E: MOV EAX,DWORD PTR [EBP+0x43AD70] ; SYM:0x0003AD70 0x513044: ADD EAX,DWORD PTR [EBP+0x43AD84] ; SYM:0x0003AD84 0x51304A: MOV DWORD PTR [ESP+0x1C],EAX 0x51304E: POPAD 0x51304F: JMP EAX Кликаем на последнюю команду JMP EAX и, если вы в PEBrowse в контекстном меню выбираете Add Breakpoint, а если в OllyDbg, то просто нажимаем F2. Мы тем самым поставили брейкпоинт, то есть дальнейшие инструкции программы будут выполняться и остановятся на адресе 51304F. Пустим программу "на волю", пусть брякнется. В PEBrowse надо нажать F5, а в OllyDbg F9. Теперь F10(в Олли F7) и мы на OEP (original entry point).
PID: 1440 TID: 240 - Stack Contents for 0x004C9CC0 0x004C9CC0: Galakar_non.exe+0x000C9CC0 Ну знающие скажут: какой же это OEP? Это муть какая-то! Не пугайтесь, не муть, я в софтайсе проверял в свое время :) Таперича берем PEditor by y0da (y0da.cjb.net, если там что-то есть), жмем Tasks и процессу Galakar дедаем Full Dump, сохраняем дамп в папке проги. Теперь можно выйти из отладчика(крестик вверху окна есть у любого отладчика :)). Какой там у нас OEP? С9СС0б вот заходим в HIEW и проходим на этот оффсет-адрес и смотрим:
push ebp mov ebp,esp add esp, -010 Да, это нормальный OEP. Теперь откроем дамп в PEditor by y0da и внесем изменения: пропишем Entry Point реальный - 000C9CC0. Теперь импорт... Вообще, раньше я забивал на таблицу импорта, когда жил в win9x, но потом крупно обломался, когда не стали работать мои распакованные проги, что я накрэкал. Стало быть, если у вас win2k или XP, то обязательно нужно восстановить импорт!Запускаем оригинальную прогу(пакованную) и запускаем ImpRec, выбираем в списке процессов наш galakar, прописываем OEP C9CC0 и жмем IAT AutoSearch(автопоиск таблицы импорта), потом Get Import. Смотрим: импорт не запаганен, то есть у всех библиотек стоит YES, осталось дело за малым: нажимаем Fix Dump и выбираем наш дамп. Теперь, если все проделано ПРАВИЛЬНО, то дамп должен запускаться. Теперь сравните размер оригинального файла и распакованного - заметно отличаются, вот так вот! Теперь, DeDe.. Вообще DeDe я бы назвал не делфи-декомпилером, а vcl-декомплером, так как он декомпилит любые проги, написанные на делфи или на c++builer, главное, чтобы был(а) использован(а) VCL. А наша прога именно такая! Открываем прогу(разжатую) в DeDe и декомпилим. В чем вся проблемы то? А в том, что прога везде снует своим сообщением: "Вы юзаете незарегенную версию", осталось еще слово "чих-пых" приписать :) Показывается оно с опр. интервалом, а значит тут либо заюзано API SetTimer, либо делфи-компонент TTimer(который в последствии тоже юзает SetTimer ;)). Заходим в Procedures и смотрим в юните un_Galakar событие MessageTimerTimer... ну тут ослу понятно, что это именно тот таймер :) Кстати, включать или нет таймер решается где-то при загрузке, но лень это все трейсить, поэтому я решил запороть сам таймер >;) Ага, видим привычное для делфи событий начало:
004C94E8 55 push ebp 004C94E9 8BEC mov ebp, esp 004C94EB 6A00 push $00 004C94ED 53 push ebx 004C94EE 8BD8 mov ebx, eax 004C94F0 33C0 xor eax, eax 004C94F2 55 push ebp 004C94F3 6863954C00 push $004C9563 И конец этой процедуры:
****** END | 004C956A 5B pop ebx 004C956B 59 pop ecx 004C956C 5D pop ebp 004C956D C3 ret Заходим в HIEW, меняем push 00 на jmp 4C956A ;) и теперь таймер перескакивает показывание окна и все зашибись! Да, но только когда будете прописывать в HIEW, не забудьте, что надо писать не jmp 4C956A, а jmp C956A, так как HIEW работает с физическими адресами. Ну что, убит наг и все чих-пых. Только прога блин шпионская, так что с ней в инет ЛУЧШЕ не выходить и вообще лучше не ломать ее, а то вломятся злые дяди и комп заберут :)) Почему шпионская? Ну может это и не так, но в листинге w32dasm я наше вот что:
Import Module 020: wsock32.dll
Addr:001162F0 hint(0073) Name: WSAStartup Addr:001162FE hint(006F) Name: WSAGetLastError Addr:00116310 hint(0039) Name: gethostname Addr:0011631E hint(0034) Name: gethostbyname Addr:0011632E hint(0033) Name: gethostbyaddr Addr:0011633E hint(0017) Name: socket Addr:00116348 hint(0015) Name: setsockopt Addr:00116356 hint(0014) Name: sendto Addr:00116360 hint(0013) Name: send Addr:00116368 hint(0012) Name: select Addr:00116372 hint(0011) Name: recvfrom Addr:0011637E hint(0010) Name: recv Addr:00116386 hint(0009) Name: htons Addr:0011638E hint(000D) Name: listen Addr:00116398 hint(000B) Name: inet_ntoa Addr:001163A4 hint(000A) Name: inet_addr Addr:001163B0 hint(0009) Name: htons Addr:001163B8 hint(0004) Name: connect Addr:001163C2 hint(0003) Name: closesocket Addr:001163D0 hint(0002) Name: bind Addr:001163D8 hint(0001) Name: accept Зачем нужно API для работы с сетью? Во-во... Может она так обновления спрашивает, не знаю... Вообще, если вы сломали прогу для работы с инетом, то велика вероятность, что могут запалить(ну ловить может и не станут:). Так что проги для работы с инетом нужно тщательно проверять. но наша прога таковой не является и оффициально не зарегистрирована, и по сетке она будет передавать, что это unreg-версия... Ну не будет же она байты попатченные передавать! :) Мы то сделали что-то вроде этого: глотка тут же соединена с кишкой, пропуская желудок :))))))
[[oUTRO] Всем пока, потом еще что-нибудь напишу, а пока вот мои кААрдинаты: bioworm@mail.ru ICQ: 257390724 bioworm.narod.ru
|