Перейти к содержанию

Train ME by Coder, для очень продвинутых гейм хакеров


Coder

Рекомендуемые сообщения

Пока смог тока +98, не уменьшается и не вылетает прога.

Глаза слезятся. :)


[ENABLE]
aobscan(_faddress,89xxffxxxxxxxxxxffxx33xx83xxxx39xx7exx8dxxxxxxxxxx8bxxxx8b)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)
_newmem:
mov eax,#99
mov edi,#99
_originalcode:
mov [ebx],eax
call dword ptr [hooktest.exe+20a4]
jmp _returnhere
_faddress: // 00FE1177 = hooktest.exe+1177
jmp _newmem
nop
nop
nop
_returnhere:

[DISABLE]
aobscan(_faddress,909090ffxx33xx83xxxx39xx7exx8dxxxxxxxxxx8bxxxx8b)
_faddress-5:
mov [ebx],eax
call dword ptr [hooktest.exe+20a4]
dealloc(_newmem)

Ломай дальше )

вот скрипт ;) (сломал где то за 15 минут):


[ENABLE]
//выделение памяти
hooktest.exe+1045:
push 00000320
hooktest.exe+10F6:
push 00000320
hooktest.exe+11CB:
push 00000320

//нужное число объектов, умноженное на 4
hooktest.exe+1138:
cmp edi,00000320

//убрать ограничение в 100 объектов
hooktest.exe+11F1:
db 90 90

//отключить уменьшение количества предметов
hooktest.exe+11B2:
db 90 90

[DISABLE]
hooktest.exe+1045:
push 00000190
hooktest.exe+10F6:
push 00000190
hooktest.exe+11CB:
push 00000190
hooktest.exe+1138:
cmp edi,0000018C
hooktest.exe+11F1:
jg hooktest.exe+1227
hooktest.exe+11B2:
dec [ebx]

В дополнение к версии 1.4 (1.3 то же самое) Coder'а дописал функцию createObj, теперь звуки будут чередоваться :-D

(нужно еще объявить метки 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 createObj
ret

Проверю днем, если будет работать, как и обещал, будет плюс ) Впрочем, как я и говорил, ничего сложного нет, но, тем не менее, будет интересно почитать, каким путем шел при взломе, и были ли какие-то неудобства при взломе )

UPDATE:

Проверил, не стал тянуть. Все сломано правильно ) Как и обещал, плюс от меня, и, да, SnedS91 переводится в группу Trainer Maker, ибо хорошо показал свои способности )

ЗЫ. Все еще жду рассказа, как ломал )

ЗЗЫ. Кстати, есть способ гораздо проще, но я его знаю потому, что я писал )))) Но взлом хорош, да. )

Ссылка на комментарий
Поделиться на другие сайты

Итак, как я сломал hooktest.exe :) :

Начало обычное, то есть поиск числа патронов. Здесь проще всего найти значение, один раз выстрелив, а потом перезарядить.

Найдя нужное единственное значение, как обычно, ставим бряк на него (на доступ) и нажимаем перезарядку. Наблюдаем следующее:

post-8695-0-53217000-1350172282_thumb.jp

Видим, что с нашим адресом работает 99 раз аж 3 функции! проверим каждую из них:

post-8695-0-88858900-1350173053_thumb.jppost-8695-0-14183400-1350173129_thumb.jp

Посмотрев чуть выше первой функции, можно заметить вызов operator delete, что значит здесь идет перебор всех объектов с их удалением, так, значит должен быть и конструктор объектов.

Следующие две функции как раз входят в структуру, напоминающую конструктор, причем выше можно заметить место где выделяется память, о чем говорит PUSH 00000190 и последующая функция call ebx, которую можно найти, проследив выше по коду что же пишется в ebx, а именно по адресу hooktest.exe+1028 - mov ebx,[hooktest.exe+209C] что это за функция, можно узнать по адресу, содержавшемуся в [hooktest.exe+209C] :

post-8695-0-36124300-1350174151_thumb.jp функция создания новых объектов!

А значит в нашем цикле создаются патроны и условием выхода из него, является число 18C (396) Дальше я разделил его на 4 (я всегда так делаю, т.к. такие числа часто встречаются в играх) и получил в результате 99! Значит можно добавить скрипт, меняющий число в условии.


[ENABLE]
hooktest.exe+1138:
cmp edi,00000320
[DISABLE]
hooktest.exe+1138:
cmp edi,0000018C

Но тут сталкиваемся с неприятностью: при перезарядке программа вылетает! Но все логично: Мы под созданные объекты не выделили память! Значит добавим в скрипт, меняющий значение выделяемой памяти:


[ENABLE]
hooktest.exe+10F6:
push 00000320

hooktest.exe+1138:
cmp edi,00000320

[DISABLE]
hooktest.exe+10F6:
push 00000190

hooktest.exe+1138:
cmp edi,0000018C

Теперь, при нажатии перезарядки получаем 200 патронов! Но при нажатии выстрела, получаем 0.

Дальше я сравнил список функций (бряк на доступ), получаемый при обычном выстреле и список при включенном скрипте:

post-8695-0-64844800-1350175496_thumb.jppost-8695-0-62585400-1350176735_thumb.jp

Замечаем, что во втором случае не выполняется inc [esi]. Перейдя в отладчик, натыкаемся на еще одну конструкцию, напоминающую конструктор, и выше замечаем, что опять идет выделение памяти (тоже добавим в скрипт). Условием входа в цикл является 64 (100) вот и ограничение, а значит просто занопим сам прыжок, тогда вход будет всегда!


[ENABLE]
hooktest.exe+10F6:
push 00000320

hooktest.exe+11CB:
push 00000320


hooktest.exe+11F1:
db 90 90

hooktest.exe+1138:
cmp edi,00000320

[DISABLE]
hooktest.exe+10F6:
push 00000190

hooktest.exe+11CB:
push 00000190

hooktest.exe+11F1:
jg hooktest.exe+1227

hooktest.exe+1138:
cmp edi,0000018C

И ура, товарищи! Патроны адекватно уменьшаются и при перезарядке их 200, осталось сделать их постоянными.

Для этого посмотрим место, где удаляются объекты:

post-8695-0-69169200-1350176738_thumb.jp

Видим рядом с циклом 2 декремента, нам нужен, который снизу, т.к. логичней сначала удалить все объекты, а потом уже уменьшать счетчик =) Допишем наш скрипт:


[ENABLE]
//выделение памяти
hooktest.exe+10F6:
push 00000320
hooktest.exe+11CB:
push 00000320

//нужное число объектов, умноженное на 4
hooktest.exe+1138:
cmp edi,00000320

//убрать ограничение в 100 объектов
hooktest.exe+11F1:
db 90 90

//отключить уменьшение количества предметов
hooktest.exe+11B2:
db 90 90

[DISABLE]
hooktest.exe+10F6:
push 00000190
hooktest.exe+11CB:
push 00000190
hooktest.exe+1138:
cmp edi,0000018C
hooktest.exe+11F1:
jg hooktest.exe+1227
hooktest.exe+11B2:
dec [ebx]

Вот и весь взлом ;) Сложного тут, пожалуй, это анализ кода (например, когда нужно отслеживать как получилось значение какого то регистра), а в принципе тут все просто ^_^

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Ломай дальше )

SnedS91 красиво пояснил, (Защитил диплом).

В общем я останавливался на:

Самое интересное место.

Теперь, при нажатии перезарядки получаем 200 патронов! Но при нажатии выстрела, получаем 0.

Дальше я сравнил список функций (бряк на доступ), получаемый при обычном выстреле и список при включенном скрипте:

Я понял что есть ограничение, больше 100, ну выдать кто в математике лучше :)

SnedS91 все опередил.

Ссылка на комментарий
Поделиться на другие сайты

Sned, могу предложить попытаться сделать для игры "Sniper: Ghost Warrior, обман кол-ва гранат".

Долго игру проходить не надо. Идём на тренировочную миссию. Проходим до места, в котром во время игры гранаты появляются на столе, если их там мало.

Я пытался сделать так, чтобы после броска гранаты в арсенале игрока создавалась новая. А точнее если кол-во гранат меньше максимального, то создать недостающие гранаты. Сделать это у меня не получилось, а потом всё руки не доходили продолжить. Т.к. гранаты появляются на столе автоматически это прекрасно. Мне не приходилось игру проходить и искать эти гранты в каких-то местах игры.

Ссылка на комментарий
Поделиться на другие сайты

Sned, могу предложить попытаться сделать для игры "Sniper: Ghost Warrior, обман кол-ва гранат".

Долго игру проходить не надо. Идём на тренировочную миссию. Проходим до места, в котром во время игры гранаты появляются на столе, если их там мало.

Я пытался сделать так, чтобы после броска гранаты в арсенале игрока создавалась новая. А точнее если кол-во гранат меньше максимального, то создать недостающие гранаты. Сделать это у меня не получилось, а потом всё руки не доходили продолжить. Т.к. гранаты появляются на столе автоматически это прекрасно. Мне не приходилось игру проходить и искать эти гранты в каких-то местах игры.

Хорошо попробую, как скачается :)

Ссылка на комментарий
Поделиться на другие сайты

Если чисто по издеваться над программой то такой скрипт. :)


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
xor eax,esi
originalcode:
push eax
push hooktest.exe+2110
exit:
jmp returnhere
"hooktest.exe"+1140:
jmp newmem
nop
returnhere:
[DISABLE]
"hooktest.exe"+1140:
push eax
push hooktest.exe+2110
dealloc(newmem)

Второй скрипт


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
xor eax,esi
originalcode:
push eax
push hooktest.exe+2110
exit:
jmp returnhere
"hooktest.exe"+1230:
jmp newmem
nop
returnhere:
[DISABLE]
"hooktest.exe"+1230:
push eax
push hooktest.exe+2110
dealloc(newmem)

Ссылка на комментарий
Поделиться на другие сайты

Вот всем полезный урок, прежде всего для меня, WinAPI использовать в TrainME нельзя :)

Снэд, ты просто гениален! Уважаю!

Как будет свободное время что-нибудь соображу, а пока работа + ещё учёба и на вождение ходить)

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.