Доброго времени суток, форумчане. Желание написать эту статью появилось у меня после того, как ко мне обратились с заказом: в трейнере, который был изготовлен в Cheat Engine нужно сменить заголовок окна и одну надпись в About. Думал, дело пяти секунд в Restorator'е, но... В общем, встречайте) ОСМОТР ПАЦИЕНТА Качаем трейнер: http://rghost.ru/39400006 Запускаем его, и видим: Посмотрим, что у нас в ресурсах: Видим два интересных ресурса: ARCHIVE, и DECOMPRESSOR. Сразу можно предположить из названий, что в Архиве находятся сжатые данные (возможно: музон, который играет; ехешник, который запускается и т.д.), а Декомпрессор этот архив распаковывает. Ну что ж, надо выяснить, каким образом работает декомпрессор, какие ему параметры передавать и куда все распакуется. АНАЛИЗ ДЕКОМПРЕССОРА Суем наш трейнер в Olly Debugger и ставим брейкпоинт на вызов CreateProcessA (кстати, он у нас один там такой найдется). Запускаем отладку. Видим, что в стек у нас нас затолкались параметры для вызова CreateProcessA. Смотрим на них внимательно: Код: CPU Stack Address Value Comments 0012F248 ?0012F3F8 ; ?ApplicationName = "C:\WINDOWS\Temp\cetrainers\CET153C.tmp\213.EXE" 0012F24C ?0012FD1C ; ?CommandLine = ""C:\WINDOWS\Temp\cetrainers\CET153C.tmp\213.EXE" -ORIGIN:"D:\Install\cracking\projects\21\"" 0012F250 ?00000000 ; ?pProcessSecurity = NULL 0012F254 ?00000000 ; ?pThreadSecurity = NULL 0012F258 ?00000000 ; ?InheritHandles = FALSE 0012F25C ?00000000 ; ?CreationFlags = 0 0012F260 ?00000000 ; ?pEnvironment = NULL 0012F264 ?0012F2F4 ; ?CurrentDirectory = "C:\WINDOWS\Temp\cetrainers\CET153C.tmp" 0012F268 ?0012F2B0 ; ?pStartupInfo = 0012F2B0 -> STARTUPINFOA {Size=68., Reserved1=NULL, Desktop=NULL, Title=NULL, X=0, Y=0, Width=0, Height=0, XCountChars=0, YCountChars=0, FillAttribute=0, Flags=0, ShowWindow=SW_HIDE, Reserved2=0, Reserved3=NULL, hStdInput=NULL, hStdOutput= 0012F26C ?0012F2A0 ; ?pProcessInformation = 0012F2A0 -> PROCESS_INFORMATION {hProcess=NULL, hThread=NULL, ProcessID=0, ThreadID=0} Жирным я выделил нужные нам строчки. Код: CurrentDirectory = "C:\WINDOWS\Temp\cetrainers\CET153C.tmp" Это директория, в которую трейнер-обертка распаковывает свое содержимое - Временная папка. Смотрим, что там у нас. А там у нас два файла: Код: 213.EXE CET_Archive.dat По размерам и содержимому это тот же Декомпрессор и Архив. Теперь смотрим, какие параметры передаются Декомпрессору: Код: CommandLine = ""C:\WINDOWS\Temp\cetrainers\CET153C.tmp\213.EXE" -ORIGIN:"D:\Install\cracking\projects\21\"" Как видим, параметр у нас только один: рабочая директория, но, думаю, можно обойтись и без нее. Пробуем выполнить дальше вызов CreateProcessA и посмотреть, что произойдет дальше во временной папке. Жмем в отладчике клавишу F8 (выполнить одну команду без захода в нее). Видим, что во временном каталоге создалась папка extracted, в которую затем извлеклось содержимое Архива: Код: extracted\win32\dbghelp.dll extracted\213.EXE extracted\CET_TRAINER.CETRAINER (после успешного запуска трейнера удаляется) extracted\defines.lua extracted\lua5.1-32.dll extracted\xmplayer.exe Давайте осмотрим извлеченные файлы: win32\dbghelp.dll - из названия файла ясно, что это стандартная debug-библиотека, которая используется тем же Olly Debugger. 213.EXE - в свойствах файла написано, что это Cheat Engine 6.2.0.2606. Наверняка, это он и производит запуск реального трейнера. CET_TRAINER.CETRAINER - гугл нам говорит, что это и есть трейнер. Правда там еще говорится, что при открытии этого файла в блокноте у нас должен показаться XML-подобный документ, но у нас отобразилась полная белиберда. Значит, файл зашифрован. defines.lua - какой-то LUA-скрипт с определениями. При осмотре его ничего интересного не обнаружилось. lua5.1-32.dll - библиотека для выполнения LUA-скрипта. xmplayer.exe - из названия понятно, что оно играет музон. Но нам этот файлик не интересен. Теперь посмотрим, как же выполняется трейнер. АНАЛИЗ ЗАПУСКА РЕАЛЬНОГО ТРЕЙНЕРА Для сей задачи мы загрузим Декомпрессор в Olly Debugger (перед этим закрыв трейнер-обертку). И посмотрим, что оно и как запускает. А раз запускает, значит нам нужно перехватить вызов все того же CreateProcessA. Смотрим, что в стеке: Код: CPU Stack Address Value Comments 0143FE88 ?00000000 ; ?ApplicationName = NULL 0143FE8C ?000D5628 ; ?CommandLine = "C:\WINDOWS\Temp\cetrainers\CET153C.tmp\extracted\213.EXE "C:\WINDOWS\Temp\cetrainers\CET153C.tmp\extracted\CET_TRAINER.CETRAINER"" 0143FE90 ?00000000 ; ?pProcessSecurity = NULL 0143FE94 ?00000000 ; ?pThreadSecurity = NULL 0143FE98 ?00000000 ; ?InheritHandles = FALSE 0143FE9C ?00000000 ; ?CreationFlags = 0 0143FEA0 ?00000000 ; ?pEnvironment = NULL 0143FEA4 ?0005D1F0 ; ?CurrentDirectory = "C:\WINDOWS\Temp\cetrainers\CET153C.tmp\extracted\" 0143FEA8 ?0143FF3C ; ?pStartupInfo = 0143FF3C -> STARTUPINFOA {Size=68., Reserved1=NULL, Desktop=NULL, Title=NULL, X=0, Y=0, Width=0, Height=0, XCountChars=0, YCountChars=0, FillAttribute=0, Flags=0, ShowWindow=SW_HIDE, Reserved2=0, Reserved3=NULL, hStdInput=NULL, hStdOutput= 0143FEAC ?0143FF2C ; ?pProcessInformation = 0143FF2C -> PROCESS_INFORMATION {hProcess=NULL, hThread=NULL, ProcessID=0, ThreadID=0} Видим, что извлеченный EXE-шник получает в качестве параметра путь к зашифрованному трейнеру (ну и, очевидно, что сразу его и запускает, перед этим расшифровывая). АНАЛИЗ CHEAT ENGINE Открывает дебаггер и жмем File->Open. В появившемся окошке выбираем ЕХЕ-шник Cheat Engine, а в строке Arguments пишем путь к CET_TRAINER.CETRAINER. Жмем Открыть. Теперь необходимо поставить брейкпоинт на открытие файла трейнера: функция CreateFileA. Запускаем отладку (F9). Отладчик прервался на открытии файла. Теперь наша задача побродить немного пошагово по коду до тех пор, пока не увидим что-нибудь интересное (например, расшифрованный текст XML-файла). "Ходить" будем клавишей F8 (без захода в процедуры) - а вдруг нам повезет) Первое, на что мы наткнемся: Код: CPU Disasm Address Hex dump Command Comments 004D2D49 ?· 8B45 90 MOV EAX, DWORD PTR SS:[LOCAL.28] 004D2D4C ?· BA F8668100 MOV EDX, OFFSET 008166F8 ; ASCII "<?XML" 004D2D51 ?· E8 DA5AF3FF CALL 00408830 ; [213.00408830 Но при осмотре в дампе адреса, который находится в EAX, мы не увидим начала "<?XML", так что крутим дальше. При одном из дальнейших шагов у нас снова произойдет прерывание на CreateFileA, но нам оно уже не интересно, поэтому просто шагаем дальше. Не бойтесь что-то упустить - не заметить то, что мы ищем невозможно) Внезапно: Код: CPU Disasm Address Hex dump Command Comments 004D4A8A ?· 8B55 DC MOV EDX, DWORD PTR SS:[LOCAL.9] ; ASCII "<?xml version="1.0" encoding="utf-8"?> <CheatTable CheatEngineTableVersion="14"> <Forms> <CETrainer>ACBB855F9451F33E7CEFB2C0D24B23B9344A8BD2B18402928A7497807449B34B28A582A44AAA844A4A4BED52520A08487748772EF95B7C9EE7FDFE03EF870F67"... 004D4A8D ?· 8B4D E8 MOV ECX, DWORD PTR SS:[LOCAL.6] 004D4A90 ?· 8B45 F8 MOV EAX, DWORD PTR SS:[LOCAL.2] 004D4A93 ?· 8B5D F8 MOV EBX, DWORD PTR SS:[LOCAL.2] 004D4A96 ?· 8B1B MOV EBX, DWORD PTR DS:[EBX] 004D4A98 ?· FF93 84000000 CALL NEAR DWORD PTR DS:[EBX+84] Ух ты! Видим, что в EDX передается указатель на начало XML-файла. Это уже интересно. Даем первой строчке выполниться, и переходим затем по этому адресу в дампе (правой кнопкой на значении в регистре EDX->Follow in Dump). Теперь делаем так: Жмем правой кнопкой и выбираем Binary->Copy All; Открываем шестнадцатеричный редактор, и вставляем в него то, что скопировалось; Очищаем от мусора полученный файл (ведь мы знаем, что начало файла должно содержать "<?xml", а окончание: "</CheatTable>"); Сохраняем его с расширением *.CT - стандартное расширение для проектов Cheat Engine. СОБСТВЕННО ВСЕ Все закрываем, качаем нормальный дистрибутив Cheat Engine, устанавливаем, и открываем в нем наш проект. А там уже редактируйте сколько душе угодно) Автор: Владимир Мефисто Special for XakerName