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

Digger Man52

52NGG
Проверенный
1,122
987
как мне сделать функцию StartAdditionalThread в отдельном файле. Чтобы при кнопке start вызывалась эта функция из другого файла
создаешь другой файл, вообще поебать какое расширение(принято .h), назовем его допустим hui.lol потом #include "hui.lol" в основном файле, и прописываешь реализацию функции в hui.lol, потом вызываешь функцию
 
  • Нравится
Реакции: Basedbounty

Basedbounty

Активный
184
88
C++:
void func1(){
    std::cout « "func1";
}

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

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

Digger Man52

52NGG
Проверенный
1,122
987
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
D

deleted-user-139653

Гость
такой вопрос, можно это реализовать на 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 Man52

52NGG
Проверенный
1,122
987
такой вопрос, можно это реализовать на 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

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

0x73616D

Активный
140
42
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,309
498

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

ARMOR

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

F0RQU1N and

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