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

redcode

🤔
Друг
166
1,400
пытался помочь челику и найти в исходниках самп.луа адреса хуков, но не нашёл
может быть ты найдёшь?
там же пакеты хукаются, какие там могут быть адреса?
для того, чтоб найти адреса нужно знать что конкретно нужно хукать - можно хукнуть обработку пакетов и обрабатывать там, либо сразу же хукать функции, которые вызывает самп после прочтения пакета, а так же нужно знать версию сампа - на разных версиях разные адреса.
 
  • Нравится
Реакции: etereon и Vintik

0x73616D

Активный
140
43
What is wrong with my code? When getting into a vehicle the game crashes (R1)
Что не так с моим кодом? При посадке в транспорт игра вылетает (R1)
C++:
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;
}
The addresses are fine since in the cheat engine, when you obtain both speeds, add them and multiply them by 4, the returned value is the correct one.
С адресами все в порядке, поскольку в чит-движке, когда вы получаете обе скорости, складываете их и умножаете на 4, возвращаемое значение является правильным.
 

F0RQU1N and

Известный
1,292
502

Или через ssdt хукай LdrLoadDll
 
Последнее редактирование:
  • Нравится
Реакции: etereon

ARMOR

God has forsaken us
Модератор
5,060
7,468
адреса памяти то понятно, но samp.events реально?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Она лежит в ntdll.dll, так что в ядре можно перехватить только сусколлы, которые она используете
а как можно найти индекс LdrLoadDll или адресс в самой ntdll.dll? можно пожалуйста какой-нибудь гайд
 

F0RQU1N and

Известный
1,292
502
а как можно найти индекс 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
);
 
  • Вау
Реакции: вайега52
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Функции в 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.dll, то у меня должно получится, то что мне нужно - перехват загрузки длл и я смогу что угодно сделать в этом хуке?
 

F0RQU1N and

Известный
1,292
502
получается, что если я сделаю драйвер и буду хукать LdrLoadDll из ntdll.dll, то у меня должно получится, то что мне нужно - перехват загрузки длл и я смогу что угодно сделать в этом хуке?
LdrLoadDll это не сискалл посмотри его код в ntdll. юзай https://learn.microsoft.com/en-us/w...di/ntddk/nf-ntddk-pssetloadimagenotifyroutine
 

etereon

MQ-Team
Проверенный
332
865
а как можно найти индекс LdrLoadDll или адресс в самой ntdll.dll? можно пожалуйста какой-нибудь гайд
Это экспортируемая функция, так что можно просто вот так (но если ты хочешь что-то сделать из кернел мода, то тебе это ни к чему)
C++:
GetProcAddress(GetModuleHandleA("ntdll.dll"), "LdrLoadDll");
 
Последнее редактирование:
  • Нравится
Реакции: 0xFF

yorenov

Участник
65
65
Как зарегать cmd без использования какого то апи? Короче говоря, пишу плагин, надо чтоб юзер передавал аргумент в функу через cmd, как реализовать не прибегая к использованию какого либо апи?
Аналогия сф апи - SF->getSAMP()->registerChatCommand("text", text); // юзер пишет "/test 1" в чате, вызывается функция test("1") с параметром 1. Думаю ясно объяснил что мне надо короче
 
  • Ха-ха
  • Нравится
Реакции: N08I40K и s1nxs

Oleg1337228

Известный
434
21
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;
}
Как добавить активацию и деактиваю самп?
 
  • Эм
Реакции: Z3roKwq

вайега52

cache miss
Модератор
3,065
3,311
Как зарегать cmd без использования какого то апи? Короче говоря, пишу плагин, надо чтоб юзер передавал аргумент в функу через cmd, как реализовать не прибегая к использованию какого либо апи?
Аналогия сф апи - SF->getSAMP()->registerChatCommand("text", text); // юзер пишет "/test 1" в чате, вызывается функция test("1") с параметром 1. Думаю ясно объяснил что мне надо короче
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать самостоятельное окно imgui, чтобы было без панели управления окном directx9
1701100736957.png

вот я имею в виду такое окно, что обвел и показал стрелочкой, но без ебучего окна которое под крестиком
1701100755408.png

ВСЕМ СПАСИБО ЧАТГПТ МЕНЯ СМОГ УСЛЫШАТЬ
C++:
HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui Standalone Window",
                            WS_POPUP,
                            100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr);
 
Последнее редактирование: