HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 07.01.2026, 06:51
Tema05
Познавший АНТИЧАТ
Регистрация: 05.10.2019
Сообщений: 1,649
С нами: 3477805

Репутация: 168


По умолчанию

Цитата:
Сообщение от wafq  

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

А слова "не сработало" я честно говоря не понимаю. Что значит не сработало? Дебаггером ставить брейпоинты, смотришь что там вызывается, кто куда обращается, что записывает в память. Если не понятно ищешь через что угодно, хоть изменение координат персонажа, зависимость между движением и где в памяти триггерятся кнопки, смотришь кто и откуда их вызывает. Нельзя просто сказать "не сработало". Твой код же исполняется, значит что-то да и делает, хотя и не то что ты ожидал. Опять же ты не говоришь и не показываешь что именно ты пробуешь вызвать и как.

Цитата:
Сообщение от wafq  

Я хочу получать навыки
Ок, молодец, получай, одобряем.

Цитата:
Сообщение от wafq  

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

Цитата:
Сообщение от wafq  

То что сейчас - часть познания и развития. Я делаю софт под себя не больше
Не знаю что ты подумал, но я тебе ни в чём не упрекал, тут большинство даже не поняли бы, что я написал. Попробуй щас найти исполнителя не за 25к, который после слова "ревёрс" не сольётся)

Цитата:
Сообщение от wafq  

Зареверсил, вышло B72D50, спасибо тебе большое, теперь все работает у мя
Адреса всегда принято указывать с названием файла. И смещение от него. Также нужно учесть, что конкретно у gta_sa.exe базовый адрес 40000, а не 1000 как у большинства. Ну ладно, я могу понять, что речь про абсолютный адрес gta_sa.exe.

Ты делаешь не очень хорошую практику. Потому что твой адрес это какое-то место в CPad::TempKeyState (CKeyboardState) (вероятно конкретная клавиша). Так лучше не делать, а указывать оффсеты в структуре и вычислять их (даже когда ты просто хочешь привести пример или указать пишут что-то вроде file.dll+0x55555+4*i (где i индекс чего-то там)).



Далее можно увидеть, что обращение к этим данным есть в 3 местах. В 2 из них это просто очистка.



В 3 же они тупо перезаписываются в CPad:NewKeyState.



И как я выше приводил пример реализации из мунлоадера у нас запись идёт без смешения по структуре CPad. Только считается смещение в 2 байта по индексу клавиши.



А в CPad в начале т.е. без смещения у нас идут NewState клавиши.



Это я всё к тому, что ты пишешь в TempKeyState, которые нигде не используются кроме как записываются в NewKeyState. А реализация из мунлоадера пишет сразу в NewState. И тут как говорится "А не ебанёт? Да не должно.". Может быть обязательно нужно сразу писать в NewState, а может можно и в TempState и оно само запишется туда. Из последствий может быть нарушена поочередность обработки внутри кадра, но хз важно ли это КОНКРЕТНО В ЭТОЙ ситуации.

Также прошу обратить внимание, что CPad::NewKeyState с структурой CKeyboardState это по сути вся клавиатура ближе к уровню винды:


А реализация муна получает указатель на нашу структуру CPad и далее пишет в поле NewState, которое является структурой CControllerState. Отличие этих структур в том, что последние являются так называемыми "gamekey", т.е. набором из состояний 24 игровых клавиш, которые непосредственно влиют на управление персонажам на уровне игры. Это по сути те клавиши, что у нас указаны в настройках. Проше говоря ты записываешь состояния нажатий на уровне самой клавиатуры, а функция муна непосредственно игровые нажатия. Вероятно первые где-то конвертируются в последние.

Я это всё пишу не потому что ты что-то неправильно сделал, нет. А просто, чтоб ты задумался, что именно ты делаешь. В работе с памятью можно запросто выстрелить себе в ногу так, что ты даже не поймёшь, а потом будешь ломать голову. Принято использовать уже существующие реализации от более опытных разработчиков если они есть. Фип сделал эмуляцию клавиш через получение структуры CPad при помощи CPad::GetPad(0) и последующие записи в поле NewState, значит это лучшее решение. Были у этого реальные основания или нет уже другой вопрос, как и то будут ли проблемы в твоей реализации.

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

  #12  
Старый 07.01.2026, 15:25
fuflexxxx
Познающий
Регистрация: 10.06.2020
Сообщений: 37
С нами: 3119285

Репутация: 63
По умолчанию

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

Банально сможешь сделать автоматический ренейм хукнутых функций. Что-то в духе: GetAllNamesInIda -> GetAllHooks -> RenameAllFuncsInAmazingDump. Это достаточно простой способ, который сможет тебе сэкономить время(Не ты будешь по адресам ручками бегать и переименовывать, а скрипт всё сделает).
 
Ответить с цитированием

  #13  
Старый 07.01.2026, 15:45
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

Если вам нужно переписать lua/cleo, то просто берете таблицу опкодов:

Таблица соответствия опкодов

wiki.blast.hk


Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:

Другое - С/С++ Вопрос - Ответ

Первый пример кода - не код на языке C++ А как у него работает?

www.blast.hk


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

По поводу опкодов SF и setGameKeyState в частности, то тут нужно самому реверсить sampfuncs.asi и смотреть реализацию этих опкодов. Проще всего это сделать в IDA через: Search -> Sequence of bytes -> Ввести нужный опкод и выставить настройки, как на скрине



-> Найти строку, где будет push ваш_опкодh и далее перейти в каллбек функцию.



Чтобы тебе не тратить время, сам нашел реализацию клавиши:

C++:





Код:
int
__stdcall
sub_10082582
(
CScriptThread
*
a1
)
{
unsigned
int
Int
;
// esi
Int
=
CScriptThread
::
GetInt
(
a1
)
;
*
(
_WORD
*
)
(
2
*
Int
+
0xB73458
)
=
CScriptThread
::
GetInt
(
a1
)
;
return
0
;
}
 
Ответить с цитированием

  #14  
Старый 07.01.2026, 17:24
wafq
Новичок
Регистрация: 15.12.2024
Сообщений: 17
С нами: 744380

Репутация: 3
По умолчанию

Цитата:
Сообщение от вайега52  

int __stdcall sub_10082582(CScriptThread *a1) { unsigned int Int; // esi Int = CScriptThread::GetInt(a1); *(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1); return 0;


Ну кстати похоже на правду

Спасибо большое всем кто отписался и не прошел мимо, сейчас буду пробовать



Реализация:





Код:
// game-keys (как в 0B56): 0xB73458 + 2*index
static void SetGameKeyState(int key, short state) {
    if (GAME_KEY_STATE_ADDR (GAME_KEY_STATE_ADDR + key * 2, state);
}

// пример использования в движении:
if (g_useGameKeyState) {
    SetGameKeyState(1, -128);   // forward/back
    SetGameKeyState(0, 0);      // left/right
    SetGameKeyState(16, 255);   // run
    SetGameKeyState(14, 0);     // jump
}


https://vkvideo.ru/video-235216022_456239017

По дебагу видно, GameKey fwd/run реально меняются, но движения всё равно нет. Значит amz не читает B73458 как game‑keys.

Сделал пошаговую “скан‑панель” прямо в меню, чтобы без IDA увидеть реальные оффсеты

https://vkvideo.ru/video-235216022_456239018

Мой максимум

Цитата:
Сообщение от вайега52  

Если вам нужно переписать lua/cleo, то просто берете таблицу опкодов:

Таблица соответствия опкодов

wiki.blast.hk


Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:

Другое - С/С++ Вопрос - Ответ

Первый пример кода - не код на языке C++ А как у него работает?

www.blast.hk


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

По поводу опкодов SF и setGameKeyState в частности, то тут нужно самому реверсить sampfuncs.asi и смотреть реализацию этих опкодов. Проще всего это сделать в IDA через: Search -> Sequence of bytes -> Ввести нужный опкод и выставить настройки, как на скрине

-> Найти строку, где будет push ваш_опкодh и далее перейти в каллбек функцию.

Чтобы тебе не тратить время, сам нашел реализацию клавиши:

C++:





Код:
int
__stdcall
sub_10082582
(
CScriptThread
*
a1
)
{
unsigned
int
Int
;
// esi
Int
=
CScriptThread
::
GetInt
(
a1
)
;
*
(
_WORD
*
)
(
2
*
Int
+
0xB73458
)
=
CScriptThread
::
GetInt
(
a1
)
;
return
0
;
}

Сейчас буду пробовать plugin sdk

в плагине ниче нового

NewKeyState = 0xB73190

OldKeyState = 0xB72F20

CPad::GetPad = 0x53FB70

CPad::UpdatePads = 0x541DD0

Это совпадает с тем, что я уже зареверсил (особенно UpdatePads и New/OldKeyState)

plugin‑sdk полезен как справочник по структурам и базовым адресам, но не даёт готового решения для setGameKeyState

Итог: Пока что единственная рабочая ***ня это tempkeystate которую я зареверсил с чужого софта
 
Ответить с цитированием

  #15  
Старый 07.01.2026, 19:57
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

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

  #16  
Старый 07.01.2026, 20:50
wafq
Новичок
Регистрация: 15.12.2024
Сообщений: 17
С нами: 744380

Репутация: 3
По умолчанию

Цитата:
Сообщение от вайега52  

Для чистоты эксперемента, советую подобное сначала тестить на чистой гта, а потом можно и на амайзинге
Короче все таки через темп найденный вчера смог

https://vkvideo.ru/video-235216022_456239019

Тему удаляю, закрыто. Всем спасибо
 
Ответить с цитированием

  #17  
Старый 07.01.2026, 23:36
Tema05
Познавший АНТИЧАТ
Регистрация: 05.10.2019
Сообщений: 1,649
С нами: 3477805

Репутация: 168


По умолчанию

Цитата:
Сообщение от вайега52  

Если вам нужно переписать lua/cleo, то просто берете таблицу опкодов:

Таблица соответствия опкодов

wiki.blast.hk


Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:

Другое - С/С++ Вопрос - Ответ

Первый пример кода - не код на языке C++ А как у него работает?

www.blast.hk


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

По поводу опкодов SF и setGameKeyState в частности, то тут нужно самому реверсить sampfuncs.asi и смотреть реализацию этих опкодов. Проще всего это сделать в IDA через: Search -> Sequence of bytes -> Ввести нужный опкод и выставить настройки, как на скрине

-> Найти строку, где будет push ваш_опкодh и далее перейти в каллбек функцию.

Чтобы тебе не тратить время, сам нашел реализацию клавиши:

C++:





Код:
int
__stdcall
sub_10082582
(
CScriptThread
*
a1
)
{
unsigned
int
Int
;
// esi
Int
=
CScriptThread
::
GetInt
(
a1
)
;
*
(
_WORD
*
)
(
2
*
Int
+
0xB73458
)
=
CScriptThread
::
GetInt
(
a1
)
;
return
0
;
}

Очень хороший ответ. Это именно то что я имел ввиду с большей конкретикой

Цитата:
Сообщение от вайега52  

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





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...