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

Digger Man

Любитель Linux
Модератор
1,635
1,116
void func1(){
std::cout « "func1";
}

void func2(){
std::cout « "func2";
}

int main() {
while(true) {
func1;
func2;
}
return 0;
} - как вы видите у меня есть две функции, и третия основая, в которой я вызываю две эти функции, как мне в главной функции сделать что при вызове func1 - замараживалось на определенное время, но func2 продалжала работать, после разморозки функции func1, происходил код из func1, а потом опять замораживался, но func2 продалжал работу
создать bool переменную, и если она фолс, то пропускать func1, а когда тебе надо, сделаешь ее true, если тебе по какому то таймеру надо, тогда запускай в отдельном потоке таймер и считай, потом делай true
 
  • Нравится
Реакции: Basedbounty

percheklii

Известный
725
266
такой вопрос, можно это реализовать на c++ в asi плагине? адреса памяти то понятно, но samp.events реально?

Lua:
local sampev = require("samp.events")
local memory = require("memory")

memory.write(0x70476E, 0x0B32, 4, true); memory.write(0x70476A, 0xE9575653, 4, true) --NoPostFx
memory.write(0x53EA95, 0xB7C7F0, 4, true); memory.setfloat(0xB7C7F0, 201, true) --Drawdist
memory.setuint8(getModuleHandle("samp.dll") + 0x9D170, 0xC3, true) --FpsUnlock
memory.copy(0x4EB9A0, memory.strptr("\xC2\x04\x00"), 3, true) --NoRadio
memory.copy(0x866C94, memory.strptr("$%d"), 6, true) --NoMoneyZero
memory.write(0x52228E, 0xB6EC1C, 4, true) -- SensitivityFix
memory.write(5497324, 235, 1, true) --NoTargetBlip
memory.write(8931716, 0, 4, true) --FixBlackRoads
memory.setuint8(0x5909AB, 0x1, true) --FastLoad

function main()
callFunction(0x7469A0, 0, 0)
end

function sampev.onServerMessage(color, text)
    if text:find("Чтобы завести транспорт") or text:find("Чтобы закрыть транспорт") then
        sampSendChat("/engine")
    end
end

function sampev.onShowTextDraw(id, data)
    data.text = data.text:gsub("~w~galaxy%-rpg%.online~n~", "")
    return {id, data}
end

function sampev.onDisplayGameText(style, time, text)
    return {4, 2000, text}
end
 
  • Эм
Реакции: F0RQU1N and

Digger Man

Любитель Linux
Модератор
1,635
1,116
такой вопрос, можно это реализовать на c++ в asi плагине? адреса памяти то понятно, но samp.events реально?

Lua:
local sampev = require("samp.events")
local memory = require("memory")

memory.write(0x70476E, 0x0B32, 4, true); memory.write(0x70476A, 0xE9575653, 4, true) --NoPostFx
memory.write(0x53EA95, 0xB7C7F0, 4, true); memory.setfloat(0xB7C7F0, 201, true) --Drawdist
memory.setuint8(getModuleHandle("samp.dll") + 0x9D170, 0xC3, true) --FpsUnlock
memory.copy(0x4EB9A0, memory.strptr("\xC2\x04\x00"), 3, true) --NoRadio
memory.copy(0x866C94, memory.strptr("$%d"), 6, true) --NoMoneyZero
memory.write(0x52228E, 0xB6EC1C, 4, true) -- SensitivityFix
memory.write(5497324, 235, 1, true) --NoTargetBlip
memory.write(8931716, 0, 4, true) --FixBlackRoads
memory.setuint8(0x5909AB, 0x1, true) --FastLoad

function main()
callFunction(0x7469A0, 0, 0)
end

function sampev.onServerMessage(color, text)
    if text:find("Чтобы завести транспорт") or text:find("Чтобы закрыть транспорт") then
        sampSendChat("/engine")
    end
end

function sampev.onShowTextDraw(id, data)
    data.text = data.text:gsub("~w~galaxy%-rpg%.online~n~", "")
    return {id, data}
end

function sampev.onDisplayGameText(style, time, text)
    return {4, 2000, text}
end
ну, просто 3 хука…
 
  • Нравится
Реакции: Z3roKwq

redcode

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

!Sam#0235

Активный
122
40
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,310
494

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

ARMOR

kjor32 is legend
Модератор
4,852
6,081
адреса памяти то понятно, но samp.events реально?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Она лежит в ntdll.dll, так что в ядре можно перехватить только сусколлы, которые она используете
а как можно найти индекс LdrLoadDll или адресс в самой ntdll.dll? можно пожалуйста какой-нибудь гайд
 

F0RQU1N and

Известный
1,310
494
а как можно найти индекс 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
);
 
  • Вау
Реакции: why ega
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Функции в 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,310
494
получается, что если я сделаю драйвер и буду хукать LdrLoadDll из ntdll.dll, то у меня должно получится, то что мне нужно - перехват загрузки длл и я смогу что угодно сделать в этом хуке?
LdrLoadDll это не сискалл посмотри его код в ntdll. юзай https://learn.microsoft.com/en-us/w...di/ntddk/nf-ntddk-pssetloadimagenotifyroutine
 

etereon

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

yorenov

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