Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+4 невидимых) |
eXeL@B —› Крэки, обсуждения —› Взлом Alawar игр (отучим от триала) |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . >> |
Посл.ответ | Сообщение |
|
Создано: 28 сентября 2006 04:20 · Личное сообщение · #1 Уж извините за форму написания ведь он почти первый (че-то я в последнее время расщедрился) Мини тутор по снятию триал-защиты с игр от Alawar`a Инструмент: Shadow with bpmx да голова Кролик : Игра "Разгадай код Да Винчи" Как обычно приобрел очередной ComputerBild и на диске прилагаемом к нему нашлась игруха от алавара "Разгадай Код Да Винчи". На все про все наиграться мне отвели 30 минут а игруха класная новый вариант Lines.Поскольку я никогда не смотрю что мне нужно оттдать за то чтобы вдоволь насладится очередным программным продуктом пришлось на время отложить работу и взятся за сей продукт. При первом рассмотрении PEid нашел Aspr.Периодически лазить в реестр и что нибудь там чистить это не по мне. Не долго думая обработал поделку stripper`ом.Получилось.Причем stripper сказал что триал инфы не используются. Уже интересно ДА. Однако продукт после распаковки запускаться не захотел и улетал в несуществующие адреса. Как же так несправедливо получается уже потрачено 5 минут драгоценного времени впустую 8-( не отступать рано продолжим. Загрузил дамп в shadow и своим трейсером дошел до места где вызываются не существующие адреса. Выглядело это место примерно так call dword [4383a8] где по этому адресу лежало 00401440 естественно указывающее вникуда. Беда но зачем же отступать. Я рассудил так раз такой call есть значит что-то не до конца обработало дамп не доведя до ума т.е. при распаковке процедуры приведения проги до нормального вида не включались а сидели в апи аспра т.е. где то же они есть.Поиском всех референсов на адрес 004383а8 нашлась интересное место: 1 PUSH da_vinci.0040E36D ; /Arg5 = 0040E36D 2 PUSH DWORD PTR DS:[428F44] ; |Arg4 = 00000000 3 PUSH da_vinci.0042839C ; |Arg3 = 0042839C 4 PUSH da_vinci.004210DC ; |Arg2 = 004210DC ASCII "GetLocaleInfoW" 5 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll" 6 CALL da_vinci.0040E02F ; \da_vinci.0040E02F 7 JMP DWORD PTR DS:[42839C] ; da_vinci.0040D9F0 8 PUSH da_vinci.0040E24E ; /Arg5 = 0040E24E 9 PUSH DWORD PTR DS:[428F40] ; |Arg4 = 00000000 10 PUSH da_vinci.004283A8<---вот он адресок ; |Arg3 = 004283A8 11 PUSH da_vinci.004210EC а это то что должно быть --> ; |Arg2 = 004210EC ASCII "GetProcAddress" 12 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll" 13 CALL da_vinci.0040E02F ; \da_vinci.0040E02F 14 JMP DWORD PTR DS:[4283A8] 15 PUSH da_vinci.0040E2AA ; /Arg5 = 0040E2AA 16 PUSH DWORD PTR DS:[428F3C] ; |Arg4 = 00000000 17 PUSH da_vinci.004283B8 ; |Arg3 = 004283B8 18 PUSH da_vinci.004210FC ; |Arg2 = 004210FC ASCII "LoadLibraryW" 19 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll" 20 CALL da_vinci.0040E02F ; \da_vinci.0040E02F 21 JMP DWORD PTR DS:[4283B8] ; da_vinci.0040DA3A Осмыслив данный кусок кода начинаю понимать что это то что надо однако ни одного референса на 1 строку решаю рискнуть выставляю оер на строку 8 и жму F8 до 14 строки и о радость по адресу 4383a8 цифирки меняются на почти (внимательно) валидные адреса. 1 PUSH da_vinci.0040E36D ; /Arg5 = 0040E36D 2 PUSH DWORD PTR DS:[428F44] ; |Arg4 = 00000000 3 PUSH da_vinci.0042839C ; |Arg3 = 0042839C 4 PUSH da_vinci.004210DC ; |Arg2 = 004210DC ASCII "GetLocaleInfoW" 5 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll" 6 CALL da_vinci.0040E02F ; \da_vinci.0040E02F 7 JMP DWORD PTR DS:[42839C] ; unicows.GetLocaleInfoW 8 PUSH da_vinci.0040E24E ; /Arg5 = 0040E24E 9 PUSH DWORD PTR DS:[428F40] ; |Arg4 = 00000000 10 PUSH da_vinci.004283A8 ; |Arg3 = 004283A8 11 PUSH da_vinci.004210EC ; |Arg2 = 004210EC ASCII "GetProcAddress" 12 PUSH da_vinci.00420F50 ; |Arg1 = 00420F50 ASCII "kernel32.dll" 13 CALL da_vinci.0040E02F ; \da_vinci.0040E02F 14 JMP DWORD PTR DS:[4283A8] <-видите куда теперь он указывает ; unicows.GetProcAddress И так если использовать данную процедуру (их кстати 2 не небольшом расстоянии друг от друга и дальше (естественно пропуская jmp`ы) можно полностью раскодировать импорт, он там небольшой около 20 имен функций.Но вот зараза если внимательно приглядеться то можно заметить что GetProcAddress находится не во всеми любимом kernel32.dll а в какои то херне под названием unicows.dll (Кстати это микрософтовская библиотека я так не хера и не понял зачем она нужна.Плюс с ней программа не пожелала запускаться. Чтож отступать поздно потрачено уже около 25 минут.Думаю дальше. Далее найдется до фига желающих меня обласкать за то что я пошел обходным путем однако ничего не попишешь в тот момент ко мне пришла такая идея. Я взял да подставил в эту микротаблицу импорта правильные адреса всех фунции т.е. теперь по адресу 4283a8 лежал указатель не на unicows.GetProcAddress а на kernel32.GetProcAddress. Все прекрасно прога запустилась но функции триала остались. Думаю дальше ведь времени уже потрачено около 40 минут. Анализ данного импорта показал что wrapper юзает функции в том числе CreateFile и CreateProcess, WriteProcessMemory т.е. по сути wrapper создает отдельный файл и потом его контролирует. Что ж ставим бряки на эти функции и отпускаем прогу нажимаем в ней продолжать играть и вываливаемся на создании файла game32.img.(нужно только поменять атрибуты для файла на Normal) Все вроде бы готово. Уф.Глушим прогу Переименовываем его в game32.exe и пытаемся запустить и...... ОБЛОМ. Прога не запускается. Думаю дальше. Посмотрим на oep (game32.exe) и видим что не все так просто просто там ничего нет. Загружаем в олю родителя оставляем бряки на старом месте.СТАРТ. Проходим как описано выше до создания дочки (game32....) жмем еще раз f9 и вываливаемся на бряке WriteProcessMemory первый пропускаем он просто записывает дочку а вот когда прогавалится еще раз смотрим что же она пишет и о боги видим что в наш game32... на место оер записывается 6 байт посмотрев в буфер запоминаем их а затем подправляем наш game32.exe. все игра заработала..Облегчение..... P.S. Я не знаю сколько продержится эта защита после опубликования данного минитутора пользуйтесь пока. |
|
Создано: 03 апреля 2011 02:40 · Личное сообщение · #2 Ктонить ковырял последнии игрушки? Подскажите как снять врапер. Восстанавил вроде все байты которые падчаться в процесс WriteProcessMemory... но при запуске когда начинается загрузка ... валиться с ошибкой Access violation - no RTTI data! Интересно что теперь процесс врапера намертво привязан к процессу игры... если вовремя работы игры погасить процесс врапера игра сворачиваться... В общем поделитесь пожалуйста мыслями.. что можно сделать.. Может кто копал? У меня подозрение что игрушка проверяет наличие врапера во время работы, но не найдя валиться.. ----- aLL rIGHTS rEVERSED! |
|
Создано: 03 апреля 2011 03:58 · Поправил: SReg · Личное сообщение · #3 OnLyOnE пишет: Восстанавил вроде все байты которые падчаться На последних гамах только лоадер Ковыряли тут намедни сравнительно большой толпой одну гаму, рабочий файл так и не получили OnLyOnE пишет: Интересно что теперь процесс врапера намертво привязан к процессу игры... если вовремя работы игры погасить процесс врапера игра сворачиваться... Дай ссылку на игру |
|
Создано: 03 апреля 2011 04:19 · Поправил: OnLyOnE · Личное сообщение · #4 SReg пишет: Дай ссылку на игру и SReg пишет: На последних гамах только лоадер Ну я все таки нашел решение... вроде работает на этих двух играх... версия враппера -> 3.1.3.1007 943d_02.04.2011_EXELAB.rU.tgz - wrapper.dll ----- aLL rIGHTS rEVERSED! |
|
Создано: 03 апреля 2011 04:58 · Личное сообщение · #5 SReg пишет: Интересно что теперь процесс врапера намертво привязан к процессу игры... если вовремя работы игры погасить процесс врапера игра сворачиваться... Через WriteProcessMenory копируется вот такой код PUSH EBP MOV EBP,ESP PUSH ECX PUSH ECX MOV EAX,[EBP+8] PUSH DWORD PTR [EAX]//PID wraper process PUSH 0 PUSH 100000 MOV EAX,[EBP+8] CALL [EAX+4]//kernel32.OpenProcess(открываем процес враппера) MOV [EBP-4],EAX//записываем дескриптор враппера CMP DWORD PTR [EBP-4],0//проверяем(если процесс с привилегиями то нам облом) JE L032 PUSH -1 PUSH DWORD PTR [EBP-4] MOV EAX,[EBP+8] CALL [EAX+8]//kernel32.WaitForSingleObject(делаем привязку к врапперу) PUSH DWORD PTR [EBP-4]//объект сдох MOV EAX,[EBP+8] CALL [EAX+14]//kernel32.CloseHandle(закрывает дескриптор процесса) MOV EAX,[EBP+8] CALL [EAX+C]//kernel32.GetCurrentProcessId(узнаём PID нашей игры) PUSH EAX PUSH 0 PUSH 1 MOV EAX,[EBP+8] CALL [EAX+4]//kernel32.OpenProcess(открываем процесс нашей игры) MOV [EBP-8],EAX PUSH 0 PUSH DWORD PTR [EBP-8] MOV EAX,[EBP+8] CALL [EAX+10]//kernel32.TerminateProcess(смерть неверным XDD) L032: XOR EAX,EAX LEAVE RETN 4 ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 03 апреля 2011 07:23 · Поправил: SReg · Личное сообщение · #6 OnLyOnE пишет: Реальная ферма Как вариант OnLyOnE пишет: Ну я все таки нашел решение... вроде работает на этих двух играх...версия враппера -> 3.1.3.1007 943d_02.04.2011_EXELAB.rU.tgz - wrapper.dll Что то я таки не допер, в чем решение то? Пропатчить wrapper.dll всегда можно было, как и ключик с него вытащить Так что без разницы, чей загрузчик, твой или аспровый - это все равно загрузчик. Фишка в том, чтобы программа работала без него, не зря я ж написал что На последних гамах только лоадер Чекает она себя на предмет целки, папины дочки эти |
|
Создано: 03 апреля 2011 10:13 · Личное сообщение · #7 ClockMan пишет: Через WriteProcessMenory копируется вот такой код Это врапер копирует в тело процесса игры? Хорошо.. а когда игру пытаешься запустить без враппера.. ? SReg пишет: Пропатчить wrapper.dll всегда можно было, как и ключик с него вытащить Подскажи пожалуйста, как ключик в данном случае из него вытащить? SReg пишет: Чекает она себя на предмет целки, папины дочки эти Ты место не нашел случайно? ----- aLL rIGHTS rEVERSED! |
|
Создано: 03 апреля 2011 10:17 · Личное сообщение · #8 |
|
Создано: 03 апреля 2011 10:45 · Личное сообщение · #9 |
|
Создано: 03 апреля 2011 10:51 · Личное сообщение · #10 |
|
Создано: 03 апреля 2011 11:04 · Поправил: OnLyOnE · Личное сообщение · #11 SaNX пишет: Бгг. Алавар теперь тырит байты не только с оеп. Ищи еще место, там и валиццо у тебя. Я восстановил байты и на оер и еще в одном месте Code:
Code:
Но игра падает не доходя до последнего места... ClockMan Кстати, приведенный тобой код где выполняется? В процессе игры или врапера? ----- aLL rIGHTS rEVERSED! |
|
Создано: 03 апреля 2011 11:28 · Личное сообщение · #12 OnLyOnE пишет: В процессе игры или врапера Враппер создаёт отдельный поток в запущенной игре. OnLyOnE пишет: Доходит до открытия окна игры.. появляется курсор... и все... падает Там хитрая проверка црк ,запусти файл не восстановленный и в памяти восстанови испорченный код и о чудо файл заработает )) ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 03 апреля 2011 14:06 · Поправил: OnLyOnE · Личное сообщение · #13 ClockMan пишет: Там хитрая проверка црк Действительно , спасибо за подсказку.. P.S. Пипец... реально хитрая проверка... никак не отловлю... Там есть место где идет проверка... Code:
Но это явно не то.. ----- aLL rIGHTS rEVERSED! |
|
Создано: 03 апреля 2011 19:23 · Поправил: huckfuck · Личное сообщение · #14 Проверки начинаются с вызова GetModuleFileNameA Например, по адресу 004057B1 Чуть ниже вызывается функция подсчёта црц (004B4620) На входе: начало и длина данных На выходе - байт Проверяется этот байт по адресам 004AE69E и 004AE6BF Входные данные для подсчета црц берутся из ресурсов игры (видимо, из скриптов) |
|
Создано: 03 апреля 2011 21:24 · Личное сообщение · #15 huckfuck пишет: Проверки начинаются с вызова GetModuleFileNameA Например, по адресу 004057B1 Чуть ниже вызывается функция подсчёта црц (004B4620) На входе: начало и длина данных На выходе - байт Проверяется этот байт по адресам 004AE69E и 004AE6BF Входные данные для подсчета црц берутся из ресурсов игры (видимо, из скриптов) Да..да... Причем проверка как ни странно всего одна... Это кусок из функции.. Code:
----- aLL rIGHTS rEVERSED! |
|
Создано: 29 апреля 2011 17:15 · Поправил: Isaev · Личное сообщение · #16 SuperФерма ru.mirror.alawar.com/DreamFarmRus_11489.exe wrapper.dll я распаковал, он вызывает WriteProcessMemory 3 раза Code:
только почему-то после возврата данные не записываются!? В первом случае например, должны 64 байта из 00F22688 записаться в 00407739? Или я что-то не так понял? в 0013B2C4 пишет, что 64 байта записаны возвращает не 0, всё же должно быть нормально... Или от какой-то базы надо смещение считать? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 29 апреля 2011 18:07 · Поправил: Vovan666 · Личное сообщение · #17 |
|
Создано: 29 апреля 2011 19:07 · Личное сообщение · #18 Как бы скачать результат я не хотел, интересно как его получить... Vovan666 пишет: Да и смыл ковырять онлайновую игру? какая разница что ковырять? Vovan666 пишет: А что мешает поставить bp WriteProcessMemory? И всё будет видно, что, куда и сколько раз пишется. а я что выше сделал? В том то и дело, что видно что и куда, но не пишется (или пишется не туда). т.е. данные после вызова WriteProcessMemory не изменяются. Вот вызов: Code:
Состояние памяти до вызова: Code:
после вызова остаётся так же байт в байт ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 29 апреля 2011 19:19 · Личное сообщение · #19 Code:
Так понятней? Буфер и адрес и не должны меняться, мой последний анвраппер как раз на выходе байты и берет. |
|
Создано: 29 апреля 2011 19:25 · Поправил: Isaev · Личное сообщение · #20 Vovan666 пишет: Не помню нафига нужна всегда писал 0 Это для выхода. По этому адресу записывается количество записаных байт Vovan666 пишет: Буфер и адрес и не должны меняться В смысле не должны? Vovan666 пишет: Address = 407739 ;Куда пишем Если мы туда пишем, значит там должны меняться! Как я понимаю Address = 407739 ;Куда пишем Buffer = 00F22688 ;Откуда пишем Берём 64 байта начиная с адреса 00F22688 и копируем их -> начиная с адреса 407739 только на практике это не так или я не так понимаю ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 29 апреля 2011 19:36 · Личное сообщение · #21 Isaev пишет: Берём 64 байта начиная с адреса 00F22688 и копируем их начиная с адреса 407739 только на практике это не так или я не так понимаю Либо ты тупишь, либо одно из двух. 0013B2AC 000001A4 |hProcess = 000001A4 ;Process ID Посмотри внимательней; Это ид не того процесса в котором ты сейчас, а df.wrp.exe Сравни мой файл с df.wrp.exe и всё станет ясно. | Сообщение посчитали полезным: Isaev |
|
Создано: 29 апреля 2011 19:40 · Личное сообщение · #22 |
|
Создано: 23 июля 2011 22:50 · Личное сообщение · #23 не могу встать на WriteProcessMemory, со стронгом палится, с фантомом надает с ошибкой Protection Error 103, he бряки не срабатывают на WriteProcessMemory иногда выыодит "Debugged program was unable to process exception" как дойти до WriteProcessMemory? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 23 июля 2011 23:24 · Поправил: OnLyOnE · Личное сообщение · #24 Isaev пишет: не могу встать на WriteProcessMemory, со стронгом палится, с фантомом надает с ошибкой Protection Error 103, he бряки не срабатывают на WriteProcessMemory иногда выыодит "Debugged program was unable to process exception" как дойти до WriteProcessMemory? P.S. сперто было только оер.. файло полностью рабочее ----- aLL rIGHTS rEVERSED! |
|
Создано: 24 июля 2011 01:52 · Поправил: Isaev · Личное сообщение · #25 |
|
Создано: 24 июля 2011 04:08 · Личное сообщение · #26 Isaev пишет: не могу встать на WriteProcessMemory, со стронгом палится, Часть WriteProcessMemory Эммулируется Asprotectom поэтому обычный бряк будет палится,а железный и вовсе несработает,ставте бряк на конец функции и смотрите где он вызывается(3 разных вызова). ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 24 июля 2011 04:21 · Личное сообщение · #27 |
|
Создано: 24 июля 2011 07:56 · Личное сообщение · #28 Isaev пишет: принцип его получения Принцип до безобразия прост, тут даже олли не надо (только между нами )... Запускаешь игру, потом ее сворачиваешь в трей (иногда достаточно нажать клавишу Windows). Далее дампишь рабочий процесс игры (который с wrap) LordPE. Открываешь полученный дамп в HEX-редакоторе (в моем случае это HiEW) идешь на ЕР и видишь что все байты на месте. Переносишь спертые байты в врапленный файл, получаешь рабочий... все. ----- aLL rIGHTS rEVERSED! | Сообщение посчитали полезным: Isaev |
|
Создано: 24 июля 2011 08:08 · Личное сообщение · #29 |
|
Создано: 24 июля 2011 14:17 · Личное сообщение · #30 Принцип до безобразия прост Хороший способ тоже им пользуюсь довольно давно (года полтора наверное - когда Невософт с защитой тоже заморочнулся - танцуют с алаваром вокруг да около =), но поможет он только в случае когда сперто ОЕП. Хуже когда еще сперто в средине что-нибудь - хотя и это не проблема =) ----- Don_t hate the cracker - hate the code. |
|
Создано: 24 июля 2011 18:30 · Поправил: SaNX · Личное сообщение · #31 Бгг. Невософт вообще сосет хуйца. Я все игры анврапил своим простейшим анвраппером: Code:
----- SaNX | Сообщение посчитали полезным: Isaev, Soso |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . >> |
eXeL@B —› Крэки, обсуждения —› Взлом Alawar игр (отучим от триала) |