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

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

Имеем репак русской Акеллы (~ 5 Гб). С существующим тренером игра части вылетает, решил попробовать завесить своими силами. Может вылетать не будет... начал с патронов. Одной инструкцией удалось завесить сразу все патроны, кроме дробовика. У дробовика пуля в каждом стволе лишь одна, и если её выстрелить, пуля исчезает и толку от завешанных патронов никакого... видимо пуля здесь - отдельный объект. Нужна помощь :) Кстати, рабочий тренер дробовик тоже не завешивает((

Пойду с жизнью разбираться...

Upd: мда... меняю патроны в таблицы, без всяких скриптов, просто значение в таблице - игра вылетает... хотя до этого ломал, ничего не вылетало... бред((

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

у меня с патронами подобная шняга была, я просто забил на дробаш...

Когда ломанёшь хелы скажи что за тип данных.

Кстати там ещё ломануть довоенные патроны можно и давление в пневмовинтовке...

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

Жизни вроде бы нашлись - тип float. Когда полностью здоровы Жизнь = 1.0. При ранениях жизнь уменьшается до нуля...

С бессмертием есть косяк. Если провалиться в какую-нибудь нору, а иногда и в перестрелках может глюкнуть (в перестрелках редко), игра вместо того чтобы предложить загрузить последний сэйв зависает (не вылетает, а виснет, хотя разница невелика). Очень неприятный глюк. Что тут можно поделать ума не приложу... вот такой у меня скрипт на бессмертие

[sp=Бессмертие]

[ENABLE]
aobscan(_faddress,f3xxxxxxxxxxxxxx0fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)

_newmem:
cmp [eax+000001e4],0
jna _originalcode //от этих двух строк толку мало
mov [eax+000001e4],(float)1

_originalcode:
movss xmm0,[eax+000001e4]
jmp _returnhere

_faddress: // 007387BC = AgPmEventLoggingEnabled+1683FC
jmp _newmem
nop
nop
nop
_returnhere:

[DISABLE]
aobscan(_faddress,9090900fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)

_faddress-5:
movss xmm0,[eax+000001e4]

dealloc(_newmem)
//Alt: db F3 0F 10 80 E4 01 00 00

[/sp]

Когда пытаюсь сделать патронов в обойме больше, чем их может быть, игра снова виснет... (ещё надо убедиться что косяк в этом). Выяснил, что максимальное число патронов в обойме лежит в структуре оружия по смещению 544h (сами патроны находятся по смещению 4ECh). Теперь для каждого оружия прописывается максимально допустимое значение патронов в обойме - 1 (минус один из-за инструкции вычитания патронов). Для дробовика максимальное значение 2 (двухстволка) - менять бестолку :( самое хреновое, что если завесить патроны другого оружия, с активированным читом дробовик хрен перезарядишь((

Также без проблем завесил перегрев автомата... пока всё. Деньги не пробовал пока, да с ними проблем быть не должно)

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

Нужна помощь. Написал скрипт с отключением бессмертия при падении в яму, но он оказался привязан к статическому адресу(( причём в этом адресе тупо ноль вбит. Жизни сравниваются с нулём. Если больше, получаем восстановление здоровья, если нет - дохнем. Есть риск погибнуть в бою. Но тут похоже уже никак не отфильтруешь падение в яму с убийством от хедшота какого :( Собственно вот скрипт - как его отвзять бы от статики?

[sp=Бессмертие 2][ENABLE]

aobscan(_faddress,f3xxxxxxxxxxxxxx0fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)

alloc(_newmem,2048)

registersymbol(_dead) // как только я инициализирую _dead - игра виснет, даже если я не использую переменную в своей инъекции!

label(_dead)

label(_returnhere)

label(_originalcode)

_newmem:

movss xmm0,[eax+000001e4]

comiss xmm0,[_dead] //с этой строкой игра виснет. И без неё тоже (при попытке объявить переменную _dead)

// comiss xmm0,[agpmeventloggingenabled+3fcff4] //сравнение с нулём - с этой строкой игра не виснет

jna _returnhere //жизни ушли в ноль - отключаем чит

mov [eax+000001e4],(float)1 //если остались живы - восстанавливаем 100% здоровья

_originalcode:

movss xmm0,[eax+000001e4]

jmp _returnhere

_faddress: // 007387BC = AgPmEventLoggingEnabled+1683FC

jmp _newmem

nop

nop

nop

_dead:

dd 0

_returnhere:

[DISABLE]

aobscan(_faddress,9090900fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)

_faddress-5:

movss xmm0,[eax+000001e4]

dealloc(_newmem)

unregistersymbol(_dead)

//Alt: db F3 0F 10 80 E4 01 00 00[/sp]

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

да я думаю не стоит заморачиваться, на читхеппенсе так же бессмертие работает...

Всмысли тоже с косяками? Ну так если читхаппенс не сделал, это не значит что не стоит пытаться :)

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

Победил я дробовик! Пытался я искать 1 когда патрон в стволе есть и 0 когда нету. Ничего не нашлось. А надо было наоборот искать 0 когда патрон есть, и 1 когда нету :) Находим этот 1-байтовый флаг для обоих стволов дробовика, добавляем в скрипт патронов и получаем завешанный дробовик :) остался неприятный глюк, который я попробую как-то решить завтра - если в момент активакции чита бесконечных патронов в одном из стволов не окажется патрона, завешается только один ствол(( и даже если отключить чит, дробовик так и не перезарядится, пока в таблице не пропишешь 0 патронов. Но это мелочи. Один ствол в любом случае завесится

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

[sp=Проверка не окончательная][ENABLE]

aobscan(_faddress,f3xxxxxxxxxxxxxx0fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)

alloc(_newmem,2048)

registersymbol(_dead) // как только я инициализирую _dead - игра виснет, даже если я не использую переменную в своей инъекции!

label(_dead)

label(_returnhere)

label(_originalcode)

_newmem:

movss xmm0,[eax+000001e4]

comiss xmm0,[_dead] //с этой строкой игра виснет. И без неё тоже (при попытке объявить переменную _dead)

// comiss xmm0,[agpmeventloggingenabled+3fcff4] //сравнение с нулём - с этой строкой игра не виснет

jna _returnhere //жизни ушли в ноль - отключаем чит

mov [eax+000001e4],(float)1 //если остались живы - восстанавливаем 100% здоровья

_originalcode:

movss xmm0,[eax+000001e4]

jmp _returnhere

_faddress: // 007387BC = AgPmEventLoggingEnabled+1683FC

jmp _newmem

nop

nop

nop

_dead:

dd 0

_returnhere: (! ошибка)

[DISABLE]

aobscan(_faddress,9090900fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)

_faddress-5:

movss xmm0,[eax+000001e4]

dealloc(_newmem)

unregistersymbol(_dead)

//Alt: db F3 0F 10 80 E4 01 00 00[/sp]

Также проследи за флагами возможно надо сохранять флаги pushf до сравнения и восстанавливать после popf

Посмотри в отладке в OllyDbg как выполняется код.

Загляни в справочник по инструкциям (привел некоторые)

[sp=Таблица. Инструкции расширения SSE]Инструкция Описание

Пересылка данных с участием регистров ХММ

MOVAPS Пересылка 128-битных данных между памятью и регистрами ХММ или

между регистрами ХММ. Данные в памяти должны быть выровнены по границе 16-байтного параграфа

MOVUPS Пересылка 128-битных данных между памятью и регистрами ХММ или между регистрами ХММ (без требования выравнивания)

MOVHPS Пересылка 64-битных данных между памятью и старшей половиной регистров ХММ или между регистрами ХММ (младшая половина ХММ не изменяется)

MOVHLPS Пересылка старшей половины источника в младшую половину назначения (старшая половина регистра назначения не меняется)

MOVLHPS Пересылка младшей половины источника в старшую половину назначения (младшая половина регистра назначения не меняется)

MOVLPS Пересылка 64-битных данных между памятью и младшей половиной регистров ХММ или между регистрами ХММ (старшая половина ХММ не изменяется)

MOVMSKPS Сборка старших бит упакованных операндов из регистра ХММ в регистр общего назначения (биты 31, 63, 95 и 127 регистра ХММ попадают в биты О, 1, 2 и 3 регистра-приемника, остальные биты приемника будут нулевыми)

MOVSS Пересылка скалярного операнда (младшие 32 бита) между памятью и регистрами ХММ или между регистрами ХММ

Арифметические инструкции над числами в FP-формате в регистрах ХММ

ADDPS Векторное сложение

SUBPS Векторное вычитание

ADDSS Скалярное сложение

SUBSS Скалярное вычитание

MULPS Векторное умножение

MULSS Скалярное умножение

DIVPS Векторное деление

DIVSS Скалярное деление

SQRTPS Векторное извлечение квадратного корня

SQRTSS Скалярное извлечение квадратного корня

MAXPS Векторное нахождение максимума

MAXSS Скалярное нахождение максимума

MINPS Векторное нахождение минимума

MINSS Скалярное нахождение минимума

Сравнение

CMPPS Векторное сравнение (задается полный набор 12 условий, как в инструкциях условных переходов). В том элементе операнда назначения, для которого условие сравнения выполняется, устанавливаются все единицы (32 бита), где не выполняется - все нули

CMPSS Скалярное сравнение (12 условий), аналогично предыдущему, но только для младших 32 бит

COMISS Скалярное сравнение с установкой бит ZF, PF и CF регистра EFLAGS (биты 0F, SF и AF обнуляются)

UCOMISS Скалярное сравнение, но без генерации исключения в случае NaN (при этом ZF=PF=CF=1)

ситуация несравнимости может возникнуть, если один из операндов является NAN или бесконечностью

Пример работы сравнения, но уже не блоком SSE, а FPU

...

fcomp Number;сравнили ST(0) с Number,

;установили нужные флаги

fstsw [status];выгрузили слово состояния сопра

;в заранее объявленную двухбайтную переменную Status

fwait;выполняем синхронизацию

;пусть сопр отдохнёт

;дальше работает CPU

mov ax, [status];грузим слово состояния в регистр ax

;при этом старший байт слова состояния окажется в ah

sahf;загружаем ah в младший байт регистра eflags

...[/sp]

Терпение и попытка за попыткой и всё получится... Я лично подсказать не могу, потому что чувствую, что нагорожу ошибок.

Насчёт дробовика, думаю справишься скоро.

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

Кстати, на счёт бессмертия и прочей ериси:

Человек с ником Recifense (это тот самый который длиннючие скрипты делает) все эти проблемы по другому решает:

Ищет скажем не то, сколько денег сейчас у гг, а сколько тратиццо в данный момент, то есть ставит при покупке значение 0.

С бессмертием тоже самое, ставит 0 вместо урона.

Реально найти как то эти значения?

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

насчет бесконечных патронов у дробовиков. это с обрезом все легко и просто.

[cod][ENABLE]

aobscan(_faddress,83xxxxxxxxxxxx85xx74xx83xxxx83xxxxf0xxxxxxc7xxxxxxxxxxxxxx8bxxxx)

aobscan(_faddress2,c6xxxx8bxx8bxxxx8bxxffxxxxxxxxc2xxxx8bxx8bxxxxxxxxxx8bxxffxxxxxx)

//патроны в обрезе

_faddress2: // 00743C16 = AgPmEventLoggingEnabled+173856

mov byte ptr [ebx],00

//патроны во всех оружиях

_faddress: // 0073E3F3 = AgPmEventLoggingEnabled+16E033

nop

nop

nop

nop

nop

nop

nop

[DISABLE]

aobscan(_faddress,909085xx74xx83xxxx83xxxxf0xxxxxxc7xxxxxxxxxxxxxx8bxxxx)

aobscan(_faddress2,8bxxxx8bxxffxxxxxxxxc2xxxx8bxx8bxxxxxxxxxx8bxxffxxxxxx)

_faddress-5:

add dword ptr [edi+000004ec],ff

_faddress2-5:

mov byte ptr [ebx],01[/cod]

А вот с дробовиком с 6 патронами - вот там засада.

Лучшее, что пока удалось сделать, так это избавиться от нерабочей перезарядки после того как все патроны отстреляли. Теперь просто звук "чик" при попытке выстрелить ;P. Для пополнения патронов в нем нужно переключить на другое оружие и потом снова на дробовик.. но это не вариант так делать постоянно.

[cod][ENABLE]

aobscan(_faddress3,c6xxxxxxxxxxxxf6xxxxxx74xx8bxx8bxxxxxxxxxx8bxxffxxc6xxxxxxb0xxxx)

//нет раздражающей перезарядки, когда закончились патроны в 6 патронном дробовике

_faddress3: // 007223AC = AgPmEventLoggingEnabled+151FEC

mov byte ptr [edi+000001c8],00

[DISABLE]

aobscan(_faddress3,9090f6xxxxxx74xx8bxx8bxxxxxxxxxx8bxxffxxc6xxxxxxb0xxxx)

_faddress3-5:

mov byte ptr [edi+000001c8],01[/cod]

P.S. игры, которые прохожу, не ломаю. Относительно недавно ее прошел и только сегодня начал ковырять.

В игре предусмотрены читы, если посмотреть в "user.cfg" папке с игрой, то можно увидеть

bind console kGRAVE

g_global_god off

g_god off

g_unlimitedammo off

Но конфиг игра берет из папки "C:UsersxxxAppDataLocal4A Games"

вот только консоль запустить пока не получилось. Если бы удастся запустить, то можно многое натворить

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

Вот такой пока тренер получился

[sp=скрин тренера]07959c4898eb.jpg[/sp]

Надо ещё все виды оружия завесить, включая гранаты. Потом может выложу.

PS встроенное бессмертие интересно работает... жизни отнимаются, а смерть не наступает. При падении в яму тоже живой остаюсь, но из ямы уже не выбраться (на этот случай надо супер прыжок сделать... попробую). Можно в тренер это бессмертие воткнуть. Но как его найти? Из игры то чит не отключишь(

А чит на патроны гранаты тоже не вешает((

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

Ну да, дизайн надо будет придумать :)

У 5-ствольного дробовика (6-стволку пока не нашёл) немного хитрее сделано. Флаг принимает значения в зависимости от комбинации патронов в нём. Когда дробовик полон всеми 5 патронами флаг этот = 63, а потом с каждым выстрелом это число уменьшается в 2 раза, т.е. 63, 31, 15, 7, 3, 1, 0 (получается тут даже не байты нужно искать, а биты) итого 5 выстрелов, 0 блокирует выстрел. Можно завесить этот флаг на единице, и одна пуля всегда будет оставаться в патроннике, без всякой перезарядки. Завесил противогазы (1 противогаз=60 секундам; получается 5 противогазов = 300 (float)), хотя с 0 противогазом чит не срабатывает. В чужих тренерах тоже такой нюанс...

гранаты пока не получилось завесить(

PS спасибо за скрипт патронов, мой скрипт слетел при покупке нового оружия...

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

иногда 55 иногда 63 - это из-за того, что иногда в данном дробовике максимальное число патронов в обоиме "5", а иногда "6". так что мы говорим об одном и том же дробовике.

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

Бессмертие я сделал так.

[ENABLE]
//на основе этого скрипта можно и One Hit Kill сделать, только нужно сначало найти указатели на друганов, типа хантера, Бурбона и т.д., а то им хана.
aobscan(_faddress,d9xxxxxxxxxx85xx74xxf3xxxxxxxxxxxxxx0fxxxxxxxxxxxx77xx8bxx8bxxxx)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)
label(_player)

_newmem:
cmp esi,[00a2a7c0]
je _player
_originalcode:
fstp dword ptr [esi+000001e4]
jmp _returnhere

_player:
nop
nop
nop
nop
nop
nop
jmp _returnhere

_faddress: // 0074FCB5 = AgPmEventLoggingEnabled+17F8F5
jmp _newmem
nop
_returnhere:

[DISABLE]
aobscan(_faddress,9085xx74xxf3xxxxxxxxxxxxxx0fxxxxxxxxxxxx77xx8bxx8bxxxx)

Игра не виснет при падении в яму, но и не помираешь, и остаешься вечным ее пленником, т.к. выбраться никак нельзя =/

Данный косяк из-за того, что падение в яму не запускает скрипт смерти (вообще тут скрипт не используется), а тупо наносится урон при падении.

Есть одна задумка по решению этой проблемы, только фиг знает, получится ли.

а с 5/6 патронным дробовиком я сделал так

[ENABLE]
aobscan(_faddress3,d0xxxxxxxxxxxxc2xxxx8bxxxxxxxxxx8bxxxx8dxxxxxxxxxxxxxxxxxxffxxxx)
alloc(_newmem,2048)
label(_returnhere)

_newmem:
mov byte ptr [esi+00000556],1
jmp _returnhere

_faddress3: // 007241AA = AgPmEventLoggingEnabled+153DEA
jmp _newmem
nop
_returnhere:

[DISABLE]
aobscan(_faddress3,90xxc2xxxx8bxxxxxxxxxx8bxxxx8dxxxxxxxxxxxxxxxxxxffxxxx)

_faddress3-5:
shr byte ptr [esi+00000556],1

dealloc(_newmem)

upd

с моим скриптом бессмертия можно умереть от атмосферы (т.е. без противогаза если) =/ Завтра по другому сделаю тогда.

upd2

смерть от отравления не зависит от кол-ва жизней, нужно искать др. значение.

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

А вы попробуйте сделать так называемый "float - режим" или полёта героя, чтобы можно было подняться из ямы по горячим клавишам. Для этого надо искать координаты перемещения, ставить бряки и т.п.

Я тоже игру скачал :-P Попробую сделать этот режим. Но я не могу сделать оконный режим (пока не получилось :-[ )

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

C:UsersxxxAppDataLocal4A Gamesuser.cfg (как в XP этот путь пишется не помню)

"r_fullscreen ON" вместо "r_fullscreen OFF" поставь.

P.S. проще сделать опцию "KillME", чем заморачиваться с super-jmp или всегда можно отключить бессмертие и подорваться на динамите.

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

P.S. проще сделать опцию "KillME", чем заморачиваться с super-jmp или всегда можно отключить бессмертие и подорваться на динамите.

Нафига такие сложности? Esc же работает. Грузим последний чекпоинт и переигрываем) И суицид не нужен... а вот суперджамп или флаймод можно сделать..

PS А есть у кого опыт в чите прохождения сквозь стены? Я даже не представляю как такой чит можно сделать, если он изначально в игру не встроен...

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

Конечно есть опыт. Я делал на старой игре Академии Джедаев. Надо найти адрес Z координаты, пока я всё её найти не могу. Предположительно этот адрес должен быть в структуре игрока.

Затем самый простой способ, это в часто обращаемую инструкцию вписывать изменяющийся пользовательский параметр высоты.

А супер прыжок я не делал. Хотя интересно было бы. Ведь тут нужно найти адрес массы героя из его структуры и изменить его. А на него можно выйти через бряк на запись в координату Z. Изменяем массу и получаем прыжок.

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

Что-то я не понял как координата Z поможет проходить сквозь стены?.. Я сейчас в Метро поставил высоту 10 и оказался за пределами карты)) в Метро XYZ имеют тип double. Я правда искал float и нашёл, а инструкции всплыли movq, значит должно быть double

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

По идеи если установишь координаты дальше стены, то можешь проходить сквозь. Узнав координату Z, ты выйдешь на все остальные: X, Y. И возможно ещё координаты вектора прицела. По ним некоторые умники делают аимботы с раздачей хедшотов в мультиплерных играх.

Там не double, а там 4 float значения, которые можно уместить в 128-ми разрядный регистр XMM Иными словами 4 раза по 32 разряда (по 4 байта)

Должен сказать, что эта игра на мой взгляд гораздо лучше оптимизирована чем большинство других ранее 2009 года. В этой игре очень много инструкций из набора SSE. Уже хочешь не хочешь, а надо учить все тонкости работы со скалярными и векторными инструкциями типа movq [esi+30],xmm0

Пока всё на рабочую Z выйти не могу - экран дёргается, а вместо этого герой должен падать.

От структуры героя по смещению +A0 находится какое-то значение которое связано с Z

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

У меня получилось установка по координатам :D Новый бесценный опыт - я направил себя в одно место и некоторых людей случайно :D По какому-то критерию не все направились в одно место.

Получается что я могу переставлять не только себя но и других игроков. Но скрипты пока не доработаны.

Создаю структуру координат

[ENABLE]
alloc(_newmem,2048)

label(_coord)
registersymbol(_coord)

_newmem:
_coord:
dd (float)48.45
dd (float)2.96
dd (float)-3.54
dd (float)1 // чё это за данные я без понятия

[DISABLE]
dealloc(_newmem)
unregistersymbol(coord)
//Alt: db 0F 28 44 24 10

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

[ENABLE]
aobscan(_faddress,66xxxxxxxx8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)

_newmem:
movaps xmm0,[_coord]
_originalcode:
db 66 0F D6 46 30 //"movq [esi+30],xmm0" - не компилировалось, поэтому пришлось писать байтами
jmp _returnhere

_faddress: // 00753ECF = metro2033.exe+353ECF
jmp _newmem
_returnhere:

[DISABLE]
aobscan(_faddress,8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx)

_faddress-5:
db 66 0F D6 46 30 //movq [esi+30],xmm0

dealloc(_newmem)
//Alt: db 66 0F D6 46 30

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

Посмотри вот эту инструкцию для координаты Х aobscan(_faddress,f3xxxxxxxxxxxxxxf3xxxxxxxxxxxxxxxx8bxxxxxx8bxxxxxxd9xxxxxxd9xxxx) или metro2033.exe+71CF2 (movq xmm0,[ecx+00000118])

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

скажу честно, не умею делать опцию телепорта.. ммм... точнее никогда не пытался ее сделать, хоть и примерно представляю как. Все из-за того, что.. а нафига ? Какой в ней смысл ?

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

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

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

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