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

Вызов функции по адресу


Гость MMAC

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

Это очень странно.. при таком зацикливании  функции отрабатывают в течение 5сек и затем игра вылетает. Но если вручную быстро кликать Enable Disable, то все нормально. Поэтому, думаю, тут дело не в таймере

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

течение 5сек и затем игра вылетает.

А без sleep, пробовал:

[ENABLE]alloc(newmem,4096)CREATETHREAD(newmem);label(flag)registersymbol(flag)newmem:push 00mov ecx,023FB090call 0x00393A20mov ecx,eaxcall 0x00366100cmp byte ptr [flag],0jne newmemretflag:db 1[DISABLE]unregistersymbol(flag)dealloc(newmem) 
Ссылка на комментарий
Поделиться на другие сайты

но без интервала логично что игра рухнет

Не уверен.

Тогда поставь бряки и посмотри, что с ESP происходит, может быть опять смещается. 

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

Эксперты, подскажите, это корректное зацикливание потока?

Это фигня

т.к. sleep будет работать только для Cheaet Engine. а не для потока, который ты создал через Createthread(newmem). 

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

Первая проблема, с которой приходится сталкиваться мне - это нехватка практики вызова игровых функций, и средненькие или подзабытые знания о системном программирование ОС Windows на WinAPI. Для решения проблемы надо вспомнить перечитать, почитать углубленно про потоки, про компиляторы, стек, функции, а также любые статьи и исследования по вызову функций. Начиная с офицальной документации и заканчивая поиском по Гуглу. 

Вторая проблема, это специфика работы потоков. Насколько я помню (к сожалению сейчас не хочу проверять) два потока не могут одновременно исполнять одну и ту же секцию кода и для этого надо использовать специальные команды ожидания работы потоков... Т.е. если будет случай, что два потока в одной секции кода, то это может перевести к закрытию приложения. Createthread(newmem) может привести к конфликту потоков, особенно если новый поток секцию кода другого потока использует сверх часто, часто или даже разово. 

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

Четвертая проблема - код после желаемой call, который хотели бы вызвать. После желаемой функции call могут идти функции, которые чистят предыдущие данные или помещают их по адресам для дальнейшей работы. Это говорит о том, что мы не можем просто вызывать одну call, а надо еще и после этого что-то сделать. 

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

1) функции - обработчики событий (системных или игровых) без аргументов функций или с ними.  В основном  срабатываемые по горячим клавишам или же по действиям в игре. Например, функция обрабатывающая событие, что игрок1 получил опыт, сделав что-то в игре (подняв предмет, выполнив какой-то квест)

2) функции в секции экспорта, импорта для exe и dll файлов. Эти функции должны с относительно меньшим шансом вызывать сбои, передав правильно аргументы функций. Но все же может так, что надо учитывать код  до и после выполнения этих функций. 

Пока самый лучший вариант я вижу - заставлять игру вызывать функции искусственно меняя условия в игре через правку кода или правку данных. Т.е. найти условия и данные, по которым вызывается функция и создать эти условия искусственно. Например, можно править счетчики данных, что приведет к вызову функции. Если счетчик патронов в обойме меньше 0, то вызовется функция перезарядки и на не придется её вызывать лишним потоком. Да, нам не нужна функция перезарядки в читах, это просто пример. Например, в цикле проверяется постоянно условие, не случилось ли чего в игре, после чего произойдет вызов ветви кода с желаемым результатом. Т.е. мы можем поправить чуток код проверки условия или поправить данные адресов, что приведет к желаемому вызову функции... 

 

Такие дела...

[ENABLE]alloc(newmem,4096)CREATETHREAD(newmem);label(flag)registersymbol(flag)newmem:push 00mov ecx,023FB090call 0x00393A20mov ecx,eaxcall 0x00366100{$lua}sleep(1000){$asm}cmp [flag],0jne newmemretflag:db 1[DISABLE]unregistersymbol(flag)dealloc(newmem)
{$lua}sleep(1000)
Ссылка на комментарий
Поделиться на другие сайты

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

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

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