 |
|

07.01.2026, 06:51
|
|
Познавший АНТИЧАТ
Регистрация: 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 месте могут ломать что-то абсолютно с этим не связанное, через супер косвенные моменты. А могут и не сломать)
|
|
|

07.01.2026, 15:25
|
|
Познающий
Регистрация: 10.06.2020
Сообщений: 37
С нами:
3119285
Репутация:
63
|
|
Просто добавлю немного от себя, тебе тут уже всё расписали более чем, но я бы советовал тебе изучить базовые хуки и питон.
Банально сможешь сделать автоматический ренейм хукнутых функций. Что-то в духе: GetAllNamesInIda -> GetAllHooks -> RenameAllFuncsInAmazingDump. Это достаточно простой способ, который сможет тебе сэкономить время(Не ты будешь по адресам ручками бегать и переименовывать, а скрипт всё сделает).
|
|
|

07.01.2026, 15:45
|
|
Флудер
Регистрация: 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
;
}
|
|
|

07.01.2026, 17:24
|
|
Новичок
Регистрация: 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 которую я зареверсил с чужого софта
|
|
|

07.01.2026, 19:57
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Для чистоты эксперемента, советую подобное сначала тестить на чистой гта, а потом можно и на амайзинге
|
|
|

07.01.2026, 20:50
|
|
Новичок
Регистрация: 15.12.2024
Сообщений: 17
С нами:
744380
Репутация:
3
|
|
Сообщение от вайега52
Для чистоты эксперемента, советую подобное сначала тестить на чистой гта, а потом можно и на амайзинге
Короче все таки через темп найденный вчера смог
https://vkvideo.ru/video-235216022_456239019
Тему удаляю, закрыто. Всем спасибо
|
|
|

07.01.2026, 23:36
|
|
Познавший АНТИЧАТ
Регистрация: 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)
|
|
|
|