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

Не получается записать адрес с указателями в код


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

Спросил двух мастеров: в какую тему мне, как новичку, можно писать, пока ничего не ответили, поэтому создал новую тему.

Пишу под себя тренер для игры Dark Souls V. 1.01.

Использую Чит Egnite против 6.3 (RU).

Вопросов много возникает походу написания.

Вот один из них:

Это код на бессмертие и убийство с одного удара.

[ENABLE]

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

newmem:

push edx

lea edx,dword ptr [esi+000000FC]

cmp edx,087bDE2C

pop edx

je returnhere

originalcode:

mov [esi+000000FC],0

exit:

jmp returnhere

"DarkSoulsII.exe"+1BB521:

jmp newmem

nop

returnhere:

[DISABLE]

dealloc(newmem)

"DarkSoulsII.exe"+1BB521:

mov [esi+000000FC],ecx

Если в строке "CMP EDX, 087bDE2C" стоит адрес для текущей загрузки игры, код работает.

Нашёл постоянный адрес [[[DarkSoulsII.exe + FB3E3C] +74] + Ь] здоровья Ггероя.

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

Перепробовал разные варианты, вот один из них:

[ENABLE]

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

newmem:

pushf

lea edx,dword ptr [esi+000000FC]

mov esp,[DarkSoulsII.exe+FB3E3C]

mov esp,[esp+74]

lea esp,[esp+fc]

cmp edx,esp

popf

je returnhere

originalcode:

mov [esi+000000FC],0

exit:

jmp returnhere

"DarkSoulsII.exe"+1BB521:

jmp newmem

nop

returnhere:

[DISABLE]

dealloc(newmem)

"DarkSoulsII.exe"+1BB521:

mov [esi+000000FC],ecx

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

PS: На всякий случай: [DarkSoulsII.exe + FB3E3C] можно записать и так [013B3E3C].

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

Да и значение edx и esp запарывается, т.к. pushf их не сохраняет. Используйте pusha/popa

Есть пара вопросов.

1. Ориганальный код в кейве помещает 0, а в исходнике ecx. Опечатка?


originalcode:
mov [esi+000000FC],0
...
[DISABLE]
dealloc(newmem)
"DarkSoulsII.exe"+1BB521:
mov [esi+000000FC],ecx

2. Что такое Ь ?


[[[DarkSoulsII.exe + FB3E3C] +74] + Ь]

Или всё-таки


lea esp,[esp+fc] < FC ?

3. Я всё же пока newbie, но pushf сохраняет флаги, в том числе нужный ZF. Но


cmp edx,esp
popf
je returnhere

popf загружает старое значение флага до его использования и cmp здесь силы не имеет.

4. Метка originalcode у вас не используется. Можно убрать.

Значения регистров esp и edx запарываются, т.к. pushf/popf сохраняют и загружают только регистр флагов. Используйте тогда pusha/popa

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

Да и значение edx и esp запарывается, т.к. pushf их не сохраняет. Используйте pusha/popa

Есть пара вопросов.

1. Ориганальный код в кейве помещает 0, а в исходнике ecx. Опечатка?

mov [esi+000000FC],0 Нет здесь не опечатка - это One Hit Kill.

2. Что такое Ь ?

Это очепятка :-D Извиняюсь не заметил. Это FC , (Гугл со своим переводчиком мутит.)

Значения регистров esp и edx запарываются, т.к. pushf/popf сохраняют и загружают только регистр флагов. Используйте тогда pusha/popa

Такие варианты, тоже пробовал:

push edx

lea edx,dword ptr [esi+000000FC]

push esp

mov esp,[DarkSoulsII.exe+FB3E3C]

mov esp,[esp+74]

lea esp,[esp+fc]

cmp edx,esp

pop edx

pop esp

je returnhere

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

Такие варианты, тоже пробовал:

push edx

lea edx,dword ptr [esi+000000FC]

push esp

mov esp,[DarkSoulsII.exe+FB3E3C]

mov esp,[esp+74]

lea esp,[esp+fc]

cmp edx,esp

pop edx

pop esp

je returnhere

Нужно не


[color=#0000FF][font=helvetica, arial, sans-serif]push edx [/font][/color]
[color=#0000FF][font=helvetica, arial, sans-serif]push esp[/font][/color]
[color=#0000FF][font=helvetica, arial, sans-serif]pop edx[/font][/color]
[color=#0000FF][font=helvetica, arial, sans-serif]pop esp[/font][/color]

Таким образом кладётся в стек edx, сверху esp, а потом в edx загружается верхнее значение из стека, т.е. esp. Поэтому меняются местами значения регистров и игра вылетает

Нужно так


push edx
lea edx,dword ptr [esi+000000FC]
push esp
mov esp,[DarkSoulsII.exe+FB3E3C]
mov esp,[esp+74]
lea esp,[esp+fc]
cmp edx,esp
pop esp
pop edx
je returnhere

Я писал ранее, что можно использовать pusha/popa. Исправляюсь: эти команды работают с 2 байтами регистров(ax,bx...). Для eax,ebx... нужно использовать pushad/popad

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

Нужно не

Нужно так

push edx

push esp

..............

pop esp

pop edx

je returnhere

Поменял, всё равно вылет из игры.

Я писал ранее, что можно использовать pusha/popa. Исправляюсь: эти команды работают с 2 байтами регистров(ax,bx...). Для eax,ebx... нужно использовать pushad/popad

На pushad edx и т.д. ругается сам CE, говорит что эта инструкция не компилируется.

Я конечно нашёл решение, внимательно просмотрев шаг 9 в обучении CE, т.е. с использованием структуры.

Теперь бессмертие выглядит так:

[ENABLE]

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

label(myinstr)

newmem:

cmp dword ptr [eax+1c],01

je myinstr

originalcode:

mov eax,[eax+000000FC]

exit:

jmp returnhere

myinstr:

push [eax+00000104]

pop [eax+000000fc]

jmp originalcode

"DarkSoulsII.exe"+1BB052:

jmp newmem

nop

returnhere:

[DISABLE]

dealloc(newmem)

"DarkSoulsII.exe"+1BB052:

mov eax,[eax+000000FC]

а Убийство с одного удара, так:

[ENABLE]

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

newmem:

cmp dword ptr [esi+1c],01

je returnhere

originalcode:

mov [esi+000000FC],0

exit:

jmp returnhere

"DarkSoulsII.exe"+1BB521:

jmp newmem

nop

returnhere:

[DISABLE]

dealloc(newmem)

"DarkSoulsII.exe"+1BB521:

mov [esi+000000FC],ecx

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

PS: Кстати работа со структурой помогла найти характеристику гГероя, которую простым методом поиска с отсеиванием я найти не смог, а именно выносливость, так что у меня теперь есть и чит на бесконечную выносливость.

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

Как я понял, раз ни кто не пишет, наверное тема на форуме мусолилась неоднократно.

Жаль.

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

KENG может Вы посмотрите (начинал учиться по Вашим урокам на Тюбе, жаль, что нету урока 7 часть 1 и один урок, для меня тоже очень важный, без звука).

KENG, если посмотрите и подскажите, моя благодарность не будет знать границ в пределах возможного :-D .

Короче добился, чтобы первый вариант тоже работал и поэтому, для таких же "Лузеров" как я, выкладываю готовый вариант чита на бессмертие только Вашего Героя:

[ENABLE]

alloc(newmem,2048)

label(returnhere)

newmem:

push edx

lea edx,dword ptr [esi+000000FC]

push eax

lea eax,[[[DarkSoulsII.exe+FB3E3C]+74]+fc]

cmp edx,eax

pop eax

pop edx

je returnhere

mov [esi+000000FC],ecx

jmp returnhere

"DarkSoulsII.exe"+1BB521:

jmp newmem

nop

returnhere:

[DISABLE]

"DarkSoulsII.exe"+1BB521:

mov [esi+000000FC],ecx

dealloc(newmem)

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

Так что тему можно закрыть.

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

ANT' timestamp='1400334599' post='17532']

а зачем такие сложности с пушами и лиами, если можно просто.

Круто!

Но я "Лузер" и пока пишу только первый тренер.

SER[G]ANT всё понял в Вашем скрипте, только не понял, что это - #100. (100 %; - здоровья или просто 100?)

И в игре объединять InfHealth и OHK в один скрипт не стоит из-за NPC, которым нужно сохранить жизнь до поры. А делать фильтры на нужных NPC или всех врагов - эт слишком много и долго. Так что во втором моём варианте я разделил эти два чита используя две инструкции игры.

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

#100 - это, типа значение жизней наобум. Обычно я не вписываю статическое значение, а люблю, чтобы текущее значение всегда равнялось текущему максимальному, но данной игры у меня нет, поэтому сделал по простому.

И делал я это по первому варианту скрипта, где в одном скрипте вы делали и бессмертие, и OHK.

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

SER[G]ANT Сенк!

Во втором моём варианте, как раз я вписываю текущее максимальное здоровье.

SER[G]ANT и ещё вопрос, если можно?

Как встроить спидхак в свой тренер? Хочу на горячую кнопку назначить спидхак встроенный в CE. Нашёл в нете и на форуме "Speed hack_setSpeed (2)" (2 - это в моём случае), но пока не могу врубиться, как встроить это в таблицу и в тренер.

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

Решил проверить, всё ли я понял и вернулся к шагу 9 Туториала CE.

Есть решение с использованием структуры игрока и нахождением ID - Туториал CE v. 6.3 шаг 9 v. ID:


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)

newmem:
cmp [ebx+10],1
je originalcode

mov [ebx+04],0
originalcode:
fldz
jmp returnhere

"Tutorial-i386.exe"+27E76:
jmp newmem
returnhere:


[DISABLE]
"Tutorial-i386.exe"+27E76:
mov [ebx+04],eax
fldz
dealloc(newmem)

Это понятно, это прекрасно работает.

Я, всё-таки в продолжении своего вопроса, нашёл адреса с указателями здоровья наших игроков (Дейва и Эрика), поэтому вариант

Туториал CE v. 6.3 шаг 9 v. Адрес:


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)

newmem:
push edx
lea edx,dword ptr [ebx+04]
push eax
lea eax,[[[006313a0]+4b8]+4]
cmp edx,eax
pop eax
je originalcode

push eax
lea eax,[[[006313a0]+4bc]+4]
cmp edx,eax
pop eax
je originalcode

mov [ebx+04],0
originalcode:
pop edx
fldz
jmp returnhere

"Tutorial-i386.exe"+27E76:
jmp newmem
returnhere:


[DISABLE]
"Tutorial-i386.exe"+27E76:
mov [ebx+04],eax
fldz
dealloc(newmem)

Всё вроде хорошо - при нажатии кнопок "Атака", здоровье наших остаётся неизменным, а враги сразу умирают.

Но при нажатии "Случайная игра" умирают все четыре игрока и соответственно мы проиграли.

Мастера, пожалуйста подскажите, где я ошибаюсь и почему не работает скрипт.

И как правильно всё-таки записать скрипт во втором варианте. А то уже голову сломал.

Извините меня тормоза, собственно SER[G]ANT мне уже всё ответил, перед этим.

Для таких же лузеров как я, выложу правильный скрипт с использованием адресов с указателями:


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)

newmem:
cmp ebx,[[006313a0]+4b8]
je originalcode
cmp ebx,[[006313a0]+4bc]
je originalcode

mov [ebx+04],0
originalcode:
fldz
jmp returnhere

"Tutorial-i386.exe"+27E76:
jmp newmem
returnhere:

[DISABLE]
"Tutorial-i386.exe"+27E76:
mov [ebx+04],eax
fldz
dealloc(newmem)

Здесь тоже всё прекрасно работает. Как я понял, с использованием регистров для нас - начинающих, лучше вначале быть поосторожнее.

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

Полностью согласен, просто хотелось уяснить для себя, как правильно записывать адреса в код.

А по структуре согласен на все сто. Очень помогло, нашёл многие характеристики, именно изучая структуру главного героя (выносливость, которую в этой игре по-моему вообще обычным способом не найдёшь, отравление, окаменение, проклятие ну и т.д.).

Сейчас мучаюсь с поиском координат. В структуре почти в самом начале лежат, координаты это видно, но они больше похожи на координаты камеры, потому что при изменении этих значений (и заморозке) герой стоит на месте, а изменяется именно расстояние до него от камеры. А вот найти координаты Ггероя пока не получается смотрел и в структуре, и поиском неизвестного (здесь вооще: при поиске Z - оставалось около 650 адресов, но они уже ни в какую не менялись, Х или Y - оставалось 2500 неменяющихся значений) уже 7 раз начинал искать, но так и бросал, слишком долго.

Кстати SER[G]ANT как выделить все адреса я понимаю - CTRL+A, а вот ка заморозить сразу много выделенных адресов не могу понять, подскажите пожалуйста.

И повторю вопрос: Как встроить спидхак в свой тренер? Интересует именно назначение Горячих клавиш, а не кнопка на форме (с кнопкой я понял как сделать, как оказалось у меня вообще не работал вызов LUA-скриптов ни в таблице, ни при создании трейнера, так что пришлось вчера пару часов чистить реестр вручную для полного удаления СЕ (утилиты как оказалось не полностью чистят) и по новой переустанавливать СЕ).

И ещё вопрос: Есть ли в доступе исходный код спидхака СЕ или он слишком навороченный для моего теперешнего уровня.

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

как выделить все адреса я понимаю - CTRL+A, а вот ка заморозить сразу много выделенных адресов не могу понять, подскажите пожалуйста.

Нажать на пробел после выделения.

И повторю вопрос: Как встроить спидхак в свой тренер?

Не встраивал, не знаю

И ещё вопрос: Есть ли в доступе исходный код спидхака СЕ или он слишком навороченный для моего теперешнего уровня.

http://cheat-engine.googlecode.com/svn/trunk/Cheat%20Engine/speedhack/

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

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

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

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