 |
|

13.09.2022, 18:37
|
|
Постоянный
Регистрация: 01.05.2021
Сообщений: 752
С нами:
2650753
Репутация:
98
|
|
Сообщение от sc6ut
{куда надо}20-{откуда}10-{размер инструкции}5=5
Скаут, (20 - 10) - 5 = 5, либо
20 - (10 - 5) = 15...
У нас в итоге не получается адрес равному 20...
|
|
|

13.09.2022, 18:39
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от Yuriy Code
Скаут, (20 - 10) - 5 = 5, либо
20 - (10 - 5) = 15...
У нас в итоге не получается адрес равному 20...
ты скобки сам себе в голове придумал? перечитай как jmp работает, должно получится 5
|
|
|

13.09.2022, 18:42
|
|
Постоянный
Регистрация: 01.05.2021
Сообщений: 752
С нами:
2650753
Репутация:
98
|
|
Сообщение от sc6ut
ты скобки сам себе в голове придумал? перечитай как jmp работает, должно получится 5
😱, Скаут, но тогда jmp будет на адрес 5...
|
|
|

13.09.2022, 18:48
|
|
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами:
3174020
Репутация:
213
|
|
Сообщение от Yuriy Code
😱, Скаут, но тогда jmp будет на адрес 5...
Сообщение от sc6ut
она является релативной, то есть на сколько прыгнуть ПОСЛЕ себя.
ебаный рот читать научись я просто вахуе нет слов
15(адрес после jmp)+5(на сколько прыгнуть)=20
|
|
|

09.11.2022, 11:18
|
|
Флудер
Регистрация: 02.02.2019
Сообщений: 5,070
С нами:
3831395
Репутация:
183
|
|
У меня одного jmp хук вызывает краш при запуске игры? В консоль выводится только первое сообщение сампа, и дальше моментальный краш.
|
|
|

08.08.2024, 17:19
|
|
Участник форума
Регистрация: 23.10.2020
Сообщений: 135
С нами:
2925217
Репутация:
83
|
|
void* SetCallHook(uintptr_t HookAddress, void* DetourFunction) {
uintptr_t OriginalFunction = *reinterpret_cast(HookAddress + 1) + HookAddress + 5;
DWORD oldProt;
VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), PAGE_READWRITE, &oldProt);
*reinterpret_cast(HookAddress + 1) = reinterpret_cast(DetourFunction) - HookAddress - 5;
VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), oldProt, &oldProt);
return reinterpret_cast(OriginalFunction);
}
а причем тут хук адрес + 1 Откуда взялась единица? объясните пожалуйста
|
|
|

09.08.2024, 01:09
|
|
Познающий
Регистрация: 10.06.2020
Сообщений: 37
С нами:
3119285
Репутация:
63
|
|
Сообщение от maksmanus228
void* SetCallHook(uintptr_t HookAddress, void* DetourFunction) {
uintptr_t OriginalFunction = *reinterpret_cast(HookAddress + 1) + HookAddress + 5;
DWORD oldProt;
VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), PAGE_READWRITE, &oldProt);
*reinterpret_cast(HookAddress + 1) = reinterpret_cast(DetourFunction) - HookAddress - 5;
VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), oldProt, &oldProt);
return reinterpret_cast(OriginalFunction);
}
а причем тут хук адрес + 1 Откуда взялась единица? объясните пожалуйста
Инструкции Call/Jmp работают через переход по RVA, Инструкция состоит из байтов E8/E9 + 4 байта на RVA. Т.е HookAddress - это адрес, где будут байты примерно такие E8 05 00 00 00 - в данном примере будет вызвана функция по адресу текущему + 0x5, и получается, что HookAdress + 1 - это байты rva. Они обычно кастуются к типу 4 байта и туда пишется своё значение.
|
|
|

26.08.2024, 14:16
|
|
Участник форума
Регистрация: 23.10.2020
Сообщений: 135
С нами:
2925217
Репутация:
83
|
|
Сообщение от fuflexxxx
Инструкции Call/Jmp работают через переход по RVA, Инструкция состоит из байтов E8/E9 + 4 байта на RVA. Т.е HookAddress - это адрес, где будут байты примерно такие E8 05 00 00 00 - в данном примере будет вызвана функция по адресу текущему + 0x5, и получается, что HookAdress + 1 - это байты rva. Они обычно кастуются к типу 4 байта и туда пишется своё значение.
а понял, спасибо большое
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|