Xipho Опубликовано 13 октября, 2012 Поделиться Опубликовано 13 октября, 2012 Пока смог тока +98, не уменьшается и не вылетает прога.Глаза слезятся. [ENABLE]aobscan(_faddress,89xxffxxxxxxxxxxffxx33xx83xxxx39xx7exx8dxxxxxxxxxx8bxxxx8b)alloc(_newmem,2048)label(_returnhere)label(_originalcode)_newmem:mov eax,#99mov edi,#99_originalcode:mov [ebx],eaxcall dword ptr [hooktest.exe+20a4]jmp _returnhere_faddress: // 00FE1177 = hooktest.exe+1177jmp _newmemnopnopnop_returnhere:[DISABLE]aobscan(_faddress,909090ffxx33xx83xxxx39xx7exx8dxxxxxxxxxx8bxxxx8b)_faddress-5:mov [ebx],eaxcall dword ptr [hooktest.exe+20a4]dealloc(_newmem) Ломай дальше )вот скрипт (сломал где то за 15 минут):[ENABLE]//выделение памятиhooktest.exe+1045:push 00000320hooktest.exe+10F6:push 00000320hooktest.exe+11CB:push 00000320//нужное число объектов, умноженное на 4hooktest.exe+1138:cmp edi,00000320//убрать ограничение в 100 объектовhooktest.exe+11F1:db 90 90//отключить уменьшение количества предметовhooktest.exe+11B2:db 90 90[DISABLE]hooktest.exe+1045:push 00000190hooktest.exe+10F6:push 00000190hooktest.exe+11CB:push 00000190hooktest.exe+1138:cmp edi,0000018Chooktest.exe+11F1:jg hooktest.exe+1227hooktest.exe+11B2:dec [ebx]В дополнение к версии 1.4 (1.3 то же самое) Coder'а дописал функцию createObj, теперь звуки будут чередоваться (нужно еще объявить метки z1 и z2)createObj: pushad push 20 call TrainME.exe+16C9 push 14 mov ebx,eax call TrainME.exe+1730 xor esi,esi add esp,08 cmp eax,esi je m1 fld dword ptr [TrainME.exe+3178] inc byte ptr [eax+04] fstp dword ptr [eax+0C] mov [eax+08],edi mov [eax],TrainME.exe+31A0 mov ebx,[TrainME.exe+4110] test ebx,1 jpe z1 mov [eax+10],esi jmp z2 z1: mov [eax+10],10 z2: jmp m2 m1: xor eax,eax m2: lea ecx,[ebp+10] push ecx mov ecx,TrainME.exe+410C mov [ebp+10],eax call TrainME.exe+1160 popad dec eax cmp eax,0 jge createObjretПроверю днем, если будет работать, как и обещал, будет плюс ) Впрочем, как я и говорил, ничего сложного нет, но, тем не менее, будет интересно почитать, каким путем шел при взломе, и были ли какие-то неудобства при взломе )UPDATE:Проверил, не стал тянуть. Все сломано правильно ) Как и обещал, плюс от меня, и, да, SnedS91 переводится в группу Trainer Maker, ибо хорошо показал свои способности )ЗЫ. Все еще жду рассказа, как ломал )ЗЗЫ. Кстати, есть способ гораздо проще, но я его знаю потому, что я писал )))) Но взлом хорош, да. ) Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Итак, как я сломал hooktest.exe :Начало обычное, то есть поиск числа патронов. Здесь проще всего найти значение, один раз выстрелив, а потом перезарядить.Найдя нужное единственное значение, как обычно, ставим бряк на него (на доступ) и нажимаем перезарядку. Наблюдаем следующее:Видим, что с нашим адресом работает 99 раз аж 3 функции! проверим каждую из них:Посмотрев чуть выше первой функции, можно заметить вызов operator delete, что значит здесь идет перебор всех объектов с их удалением, так, значит должен быть и конструктор объектов.Следующие две функции как раз входят в структуру, напоминающую конструктор, причем выше можно заметить место где выделяется память, о чем говорит PUSH 00000190 и последующая функция call ebx, которую можно найти, проследив выше по коду что же пишется в ebx, а именно по адресу hooktest.exe+1028 - mov ebx,[hooktest.exe+209C] что это за функция, можно узнать по адресу, содержавшемуся в [hooktest.exe+209C] : функция создания новых объектов!А значит в нашем цикле создаются патроны и условием выхода из него, является число 18C (396) Дальше я разделил его на 4 (я всегда так делаю, т.к. такие числа часто встречаются в играх) и получил в результате 99! Значит можно добавить скрипт, меняющий число в условии.[ENABLE]hooktest.exe+1138:cmp edi,00000320[DISABLE]hooktest.exe+1138:cmp edi,0000018CНо тут сталкиваемся с неприятностью: при перезарядке программа вылетает! Но все логично: Мы под созданные объекты не выделили память! Значит добавим в скрипт, меняющий значение выделяемой памяти:[ENABLE]hooktest.exe+10F6:push 00000320hooktest.exe+1138:cmp edi,00000320[DISABLE]hooktest.exe+10F6:push 00000190hooktest.exe+1138:cmp edi,0000018CТеперь, при нажатии перезарядки получаем 200 патронов! Но при нажатии выстрела, получаем 0.Дальше я сравнил список функций (бряк на доступ), получаемый при обычном выстреле и список при включенном скрипте:Замечаем, что во втором случае не выполняется inc [esi]. Перейдя в отладчик, натыкаемся на еще одну конструкцию, напоминающую конструктор, и выше замечаем, что опять идет выделение памяти (тоже добавим в скрипт). Условием входа в цикл является 64 (100) вот и ограничение, а значит просто занопим сам прыжок, тогда вход будет всегда![ENABLE]hooktest.exe+10F6:push 00000320hooktest.exe+11CB:push 00000320hooktest.exe+11F1:db 90 90hooktest.exe+1138:cmp edi,00000320[DISABLE]hooktest.exe+10F6:push 00000190hooktest.exe+11CB:push 00000190hooktest.exe+11F1:jg hooktest.exe+1227hooktest.exe+1138:cmp edi,0000018CИ ура, товарищи! Патроны адекватно уменьшаются и при перезарядке их 200, осталось сделать их постоянными.Для этого посмотрим место, где удаляются объекты:Видим рядом с циклом 2 декремента, нам нужен, который снизу, т.к. логичней сначала удалить все объекты, а потом уже уменьшать счетчик =) Допишем наш скрипт:[ENABLE]//выделение памятиhooktest.exe+10F6:push 00000320hooktest.exe+11CB:push 00000320//нужное число объектов, умноженное на 4hooktest.exe+1138:cmp edi,00000320//убрать ограничение в 100 объектовhooktest.exe+11F1:db 90 90//отключить уменьшение количества предметовhooktest.exe+11B2:db 90 90[DISABLE]hooktest.exe+10F6:push 00000190hooktest.exe+11CB:push 00000190hooktest.exe+1138:cmp edi,0000018Chooktest.exe+11F1:jg hooktest.exe+1227hooktest.exe+11B2:dec [ebx]Вот и весь взлом Сложного тут, пожалуй, это анализ кода (например, когда нужно отслеживать как получилось значение какого то регистра), а в принципе тут все просто 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Ломай дальше )SnedS91 красиво пояснил, (Защитил диплом).В общем я останавливался на:Самое интересное место.Теперь, при нажатии перезарядки получаем 200 патронов! Но при нажатии выстрела, получаем 0.Дальше я сравнил список функций (бряк на доступ), получаемый при обычном выстреле и список при включенном скрипте:Я понял что есть ограничение, больше 100, ну выдать кто в математике лучше SnedS91 все опередил. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Sned, могу предложить попытаться сделать для игры "Sniper: Ghost Warrior, обман кол-ва гранат".Долго игру проходить не надо. Идём на тренировочную миссию. Проходим до места, в котром во время игры гранаты появляются на столе, если их там мало.Я пытался сделать так, чтобы после броска гранаты в арсенале игрока создавалась новая. А точнее если кол-во гранат меньше максимального, то создать недостающие гранаты. Сделать это у меня не получилось, а потом всё руки не доходили продолжить. Т.к. гранаты появляются на столе автоматически это прекрасно. Мне не приходилось игру проходить и искать эти гранты в каких-то местах игры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 SnedS91, я и не говорил, что будет очень сложно ) Но молодец, да ) Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Sned, могу предложить попытаться сделать для игры "Sniper: Ghost Warrior, обман кол-ва гранат".Долго игру проходить не надо. Идём на тренировочную миссию. Проходим до места, в котром во время игры гранаты появляются на столе, если их там мало.Я пытался сделать так, чтобы после броска гранаты в арсенале игрока создавалась новая. А точнее если кол-во гранат меньше максимального, то создать недостающие гранаты. Сделать это у меня не получилось, а потом всё руки не доходили продолжить. Т.к. гранаты появляются на столе автоматически это прекрасно. Мне не приходилось игру проходить и искать эти гранты в каких-то местах игры.Хорошо попробую, как скачается Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Если чисто по издеваться над программой то такой скрипт. [ENABLE]alloc(newmem,2048)label(returnhere)label(originalcode)label(exit)newmem:xor eax,esioriginalcode:push eaxpush hooktest.exe+2110exit:jmp returnhere"hooktest.exe"+1140:jmp newmemnopreturnhere:[DISABLE]"hooktest.exe"+1140:push eaxpush hooktest.exe+2110dealloc(newmem)Второй скрипт[ENABLE]alloc(newmem,2048)label(returnhere)label(originalcode)label(exit)newmem:xor eax,esioriginalcode:push eaxpush hooktest.exe+2110exit:jmp returnhere"hooktest.exe"+1230:jmp newmemnopreturnhere:[DISABLE]"hooktest.exe"+1230:push eaxpush hooktest.exe+2110dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 15 октября, 2012 Автор Поделиться Опубликовано 15 октября, 2012 Вот всем полезный урок, прежде всего для меня, WinAPI использовать в TrainME нельзя Снэд, ты просто гениален! Уважаю!Как будет свободное время что-нибудь соображу, а пока работа + ещё учёба и на вождение ходить) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения