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

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

Здравствуйте ребята!

Тут встал вопрос как выйти на указатель жизней в игре Painkiller.

Коротко о движке Painengine это головная боль :)

 

Так вот искал указатель через автопоиск указателей.

5 уровней ничего не дало

10 уровней сожрал все место на диске и просил еще(поиск длился 27000 секунд)

 

Поиск в ручную обламал меня сразу. то есть инструкция [ecx+04],edx

смещение 4 ищем значение ecx, и тут результат 0.

 

Есть иные методы в таких ситуациях?

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

Бряк на чтение, и анализ всех инструкций. Включая анализ стека по каждой из них.

Анализировал, закономерности есть вот только  те адреса у которых есть некая закономерность обращаются к одной инструкции которая работает с 100500 адресами, поинтер не дает ничего :(.

Принцип был такой 

инструкция [ecx+04],edx работает с over 9000 адресов(срабатывает при нанесении урона)

ищем адрес жизней,нашли, ставим бряк на запись на адрес.

Смотрим стек, путем анализа выясняется что по смещению [esp+14] находится некий адрес(или указатель)

который указывает по кому наносится урон.

То есть если написать фильтр

newmem:

cmp [esp+14],[наш адрес]

je player

jmp original code

 

то фильтр сработает и после прыжка на player останется только один адрес(наших жизней).

Но вот только разобраться с адресом [наш адрес] не могу, так как инструкция отвечающая за него работает с 100500 адресами опять же....

 

Я так понял что там огромное разветвление(огромнейшее) путем анализа кода.

Как в этой куче мусора(из адресов) найти что либо не представляю.

Я все это к чему, может быть тот кому интересно скачает Painkiller поломаем вместе? Взломал очень много игр(и painkiller тоже взломал). Но вот логику painkiller понять не могу. Давайте взломаем вместе :-D.

Вот моря наработка скрипт на god+1hit(работает на всех картах и со всеми боссами)

[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048)label(returnhere)label(orig)label(cont)label(cont2)label(ss)label(ss2)label(ppz)label(ppz2)newmem: //this is allocated memory, you have read,write,execute accessmov [ppz],edimov [ppz2],ediadd [ppz],60cmp [ppz],eaxje cont             //глобальный фильтр на отсев игрока и враговadd [ppz2],58cmp [ppz2],eaxje cont2jmp origcont:cmp esi,106je sscmp esi,FE //локальный фильтр отделения врагов от игрокаje ss2jmp origcont2:cmp esi,106je ss2cmp esi,FD   //локальный фильтр отделения боссов от игрокаje ss2jmp origss:mov [ebx+04],(float)100pop ebxpop ecxjmp returnheress2:mov [ebx+04],0pop ebxpop ecxjmp returnhereorig:mov [ebx+04],edxpop ebxpop ecxjmp returnhereppz:dd 0ppz2:dd 0"Engine.dll"+1510F3:jmp newmemreturnhere:  [DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)"Engine.dll"+1510F3:mov [ebx+04],edxpop ebxpop ecx//Alt: db 89 53 04 5B 59
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

lamalamaz, .С наступающим!
У меня была похожая проблема в одной игре. Долго мучился, искал, ничего не помогало. Потом психонул и в СЕ сделал такой поиск:
Допустим адрес здоровья 805E6840. Искал диапазон 4 байта в  Hex, от 805E0000 до 805EFFFF (можно диапазон сделать побольше).

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

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

Для Painkiller - Battle out of Hell 1.64

1. Оконный режим можно сделать через 3DAnalyze.exe (если не работает, то через запуск админа)

 

2. Поиск в CE рабочих адресов  здоровья, брони, патронов тип Double

 

3. Бряк на адресе здоровья показывает инструкции 

1015CD11 - 8B 48 08 - mov ecx,[eax+08] - постоянно работает

1015CD17 - 8B 50 0C - mov edx,[eax+0C] - постоянно

1015C194 - 89 53 08 - mov [ebx+08],edx - при уроне (смотрим чему равен ebx)

1015C19C - 89 43 0C - mov [ebx+0C],eax - при уроне

 

На всех адресах инструкций постоянно проскакивает огромное количество адресов и безусловно это все мешает исследовать. 

 

4. Ставим бряк на инструкцию 1015C194 в дизассемблере нажав F5. Открываем окно бряков и пишем условие

"EBX==0x00000000" где вместо нулей адрес из пункта 3.

 

5. Отпускаем игру по F9 и ждем пока по герою кто-нибудь ударит. После урона процесс игры останавливается и можно исследовать стек.

 

Там по именам адресов, которые распознает CE видно, что во время удара мечом по главному персонажу вызывается какая-то функция связанная с физикой по понтеру из vTable (из таблицы виртуальных функций при наследовании и полиморфизме), потом вверх по стеку вызов на обновление MenuItem, затем идет вверх по стеку проверка, что если это не число, то ошибка (наверняка из-за Луа + С++ в игре с переводами из Double) и наконец идет запись в адрес здоровья.

 

....

 

Что можно делать дальше:

 

1. Мы можем этот сктек с помощь CE Lua или CE AA скриптов скопировать в новую память. Затем скопировать стек для других случаев в другую новую память. Затем сравнить через окно расструктуризации Dessect Data/Structure. Возможно так можно найти зацепки для создания фильтров.

 

После вызова vTable функции физики поток процесса игры вызывает апдейт для гуи в главном экране, а для ботов этого делать явно не будет (можно проверить через стек ботов). Можно исследовать это развилку для определения, кто свой, а кто чужой.

 

2. Пойти по пути последовательного поиска звеньев цепи указателя, поднимаясь на уровень выше и выше и сравнивания структуры для определения кто свой, а кто чужой.

 

3. Можно поискать инструкции, которые бы работали только с игроком или только те, которые работали с ботами. При этом надо еще постараться найти адрес здоровья ботов.

 

Если что-то узнаю еще, то напишу...

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

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

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

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