пытался помочь челику и найти в исходниках самп.луа адреса хуков, но не нашёлну, просто 3 хука…
может быть ты найдёшь?
пытался помочь челику и найти в исходниках самп.луа адреса хуков, но не нашёлну, просто 3 хука…
там же пакеты хукаются, какие там могут быть адреса?пытался помочь челику и найти в исходниках самп.луа адреса хуков, но не нашёл
может быть ты найдёшь?
bool MemoryCheck(int pAddress, unsigned char cByte) {
unsigned long dwProtect[2];
unsigned char cValue = cByte;
VirtualProtect(reinterpret_cast<void*>(pAddress), 1, PAGE_READWRITE, &dwProtect[0]);
memcpy(&cValue, reinterpret_cast<void*>(pAddress), 1);
VirtualProtect(reinterpret_cast<void*>(pAddress), 1, dwProtect[0], &dwProtect[1]);
return (cValue > cByte);
}
DWORD GetVehicleCPEDPtr() {
unsigned long dwProtect[2];
DWORD vehicleCPEDPtr;
VirtualProtect(reinterpret_cast<void*>(0xBA18FC), sizeof(DWORD), PAGE_EXECUTE_READ, &dwProtect[0]);
memcpy(&vehicleCPEDPtr, reinterpret_cast<void*>(0xBA18FC), sizeof(DWORD));
return vehicleCPEDPtr;
}
float GetVehicleSpeed(DWORD vehicleCPEDPtr) {
unsigned long dwProtect[2];
float speedX, speedY;
VirtualProtect(reinterpret_cast<void*>(vehicleCPEDPtr + 0x44), sizeof(float), PAGE_EXECUTE_READ, &dwProtect[0]);
memcpy(&speedX, reinterpret_cast<void*>(vehicleCPEDPtr + 0x44), sizeof(float));
VirtualProtect(reinterpret_cast<void*>(vehicleCPEDPtr + 0x44), sizeof(float), dwProtect[0], &dwProtect[1]);
VirtualProtect(reinterpret_cast<void*>(vehicleCPEDPtr + 0x48), sizeof(float), PAGE_EXECUTE_READ, &dwProtect[0]);
memcpy(&speedY, reinterpret_cast<void*>(vehicleCPEDPtr + 0x48), sizeof(float));
VirtualProtect(reinterpret_cast<void*>(vehicleCPEDPtr + 0x48), sizeof(float), dwProtect[0], &dwProtect[1]);
float speed = (speedX + speedY) * 4.0f;
return speed;
}
int WINAPI Thread()
{
while (*(DWORD*)0xC8D4C0 != 9)
Sleep(100);
InitHook();
while (true) {
if (MemoryCheck(0xBA18FC, 1)) {
if (GetVehicleCPEDPtr() != 0) {
float speed = GetVehicleSpeed(GetVehicleCPEDPtr());
if (speed >= 0 && speed <= 60) {
speed = 0;
}
else if (speed > 60 && speed <= 120) {
speed = 20;
}
else if (speed > 120 && speed <= 180) {
speed = 25;
}
else if (speed > 180) {
speed = 33;
}
else {
speed = 0;
}
}
}
}
return 0;
}
Она лежит в ntdll.dll, так что в ядре можно перехватить только сусколлы, которые она используетИли через ssdt хукай LdrLoadDll
адреса памяти то понятно, но samp.events реально?
а как можно найти индекс LdrLoadDll или адресс в самой ntdll.dll? можно пожалуйста какой-нибудь гайдОна лежит в ntdll.dll, так что в ядре можно перехватить только сусколлы, которые она используете
Функции в ntdll в основном это обёртка для syscall`ов, то есть можно просто посмотреть их кода как можно найти индекс LdrLoadDll или адресс в самой ntdll.dll? можно пожалуйста какой-нибудь гайд
const auto ntdll = GetModuleHandleW(L"ntdll.dll");
auto syscall_num = *reinterpret_cast<int*>(
(uintptr_t)GetProcAddress(ntdll, "NtMapViewOfSection") + 4
);
получается, что если я сделаю драйвер и буду хукать LdrLoadDll из ntdll.dll, то у меня должно получится, то что мне нужно - перехват загрузки длл и я смогу что угодно сделать в этом хуке?Функции в ntdll в основном это обёртка для syscall`ов, то есть можно просто посмотреть их код
В начале там что-то примерно:
4C 8B D1 mov r10, rcx
B8 ... mov eax, syscallid
То есть будет примерно что-то такое
C++:const auto ntdll = GetModuleHandleW(L"ntdll.dll"); auto syscall_num = *reinterpret_cast<int*>( (uintptr_t)GetProcAddress(ntdll, "NtMapViewOfSection") + 4 );
LdrLoadDll это не сискалл посмотри его код в ntdll. юзай https://learn.microsoft.com/en-us/w...di/ntddk/nf-ntddk-pssetloadimagenotifyroutineполучается, что если я сделаю драйвер и буду хукать LdrLoadDll из ntdll.dll, то у меня должно получится, то что мне нужно - перехват загрузки длл и я смогу что угодно сделать в этом хуке?
Это экспортируемая функция, так что можно просто вот так (но если ты хочешь что-то сделать из кернел мода, то тебе это ни к чему)а как можно найти индекс LdrLoadDll или адресс в самой ntdll.dll? можно пожалуйста какой-нибудь гайд
GetProcAddress(GetModuleHandleA("ntdll.dll"), "LdrLoadDll");
Как добавить активацию и деактиваю самп?Asi:
rtdhook* hook;
void* __fastcall AttachEntityToEntity(uintptr_t ptr, void* edx, uintptr_t entityTo, CVector offset, CVector rotation)
{
uint8_t type = *reinterpret_cast<uint8_t*>(entityTo + 0x36);
if ((type & 7) == 2) // If entity is attaching to vehicle
*reinterpret_cast<uint32_t*>(ptr + 0x1C) &= 0xFFFFFFFE;
return reinterpret_cast<void* (__thiscall*)(uintptr_t, uintptr_t, CVector, CVector)>
(hook->trampoline)(ptr, entityTo, offset, rotation);
}
int main()
{
hook = new rtdhook(0x54D570, reinterpret_cast<DWORD>(&AttachEntityToEntity));
hook->install();
return 0;
}
Как зарегать cmd без использования какого то апи? Короче говоря, пишу плагин, надо чтоб юзер передавал аргумент в функу через cmd, как реализовать не прибегая к использованию какого либо апи?
Аналогия сф апи - SF->getSAMP()->registerChatCommand("text", text); // юзер пишет "/test 1" в чате, вызывается функция test("1") с параметром 1. Думаю ясно объяснил что мне надо короче
HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui Standalone Window",
WS_POPUP,
100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr);