Вопрос DLL, LUA, DOTA 2 | Помогите

Начинающий
Статус
Оффлайн
Регистрация
3 Ноя 2024
Сообщения
3
Реакции[?]
0
Поинты[?]
0
Всем привет, хотел обратиться за помощью, возможно кто-то из вас откликнется, чему я очень буду благодарен.

У меня есть injector написанный за несколько дней на C++ (свою функцию он выполняет), так же у меня есть DLL, которая в свою очередь инжектит LUA скрипт в процесс игры dota2.exe, сама DLL загружается, но ожидаемого результата в игре не происходит, то есть скрипт не работает.

То, что я пытаюсь заинжектить в процесс, это изначально написанный для ботов ward helper, который говорит ботам куда нужно расставлять варды, моя идея заключается в том, чтобы сделать эту функцию для обычного игрока.
Условно ты запускаешь игру, спавнишься инжектишь скрипт, а после скрипт автоматически идет расставлять варды, круто да)):hearteyecat:

Если кто-то шарит в LUA и/или C++ и готов на волонтерских началах помочь, буду очень благодарен.
Можно написать в лс на форуме или ответить в топике.
 
Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2023
Сообщения
370
Реакции[?]
31
Поинты[?]
30K
Всем привет, хотел обратиться за помощью, возможно кто-то из вас откликнется, чему я очень буду благодарен.

У меня есть injector написанный за несколько дней на C++ (свою функцию он выполняет), так же у меня есть DLL, которая в свою очередь инжектит LUA скрипт в процесс игры dota2.exe, сама DLL загружается, но ожидаемого результата в игре не происходит, то есть скрипт не работает.

То, что я пытаюсь заинжектить в процесс, это изначально написанный для ботов ward helper, который говорит ботам куда нужно расставлять варды, моя идея заключается в том, чтобы сделать эту функцию для обычного игрока.
Условно ты запускаешь игру, спавнишься инжектишь скрипт, а после скрипт автоматически идет расставлять варды, круто да)):hearteyecat:

Если кто-то шарит в LUA и/или C++ и готов на волонтерских началах помочь, буду очень благодарен.
Можно написать в лс на форуме или ответить в топике.
ты код то покажи, как нам понять что не так?
 
Начинающий
Статус
Оффлайн
Регистрация
3 Ноя 2024
Сообщения
3
Реакции[?]
0
Поинты[?]
0
ты код то покажи, как нам понять что не так?
Ниже код С++

C++:
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <iostream>
#include <string>

#pragma comment(lib, "Psapi.lib")

// Opredelyaem strukturu dlya peredachi argumentov
struct RunParams {
    char windowTitle[256]; // Zagolovok okna
    char keyName[16];      // Nazvanie klavishi
};

// Funktsiya dlya polucheniya ID protsessa po ego imeni
DWORD GetProcessID(const wchar_t* processName) {
    PROCESSENTRY32W pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32W);

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) return 0;

    if (Process32FirstW(hSnapshot, &pe32)) {
        do {
            if (wcscmp(pe32.szExeFile, processName) == 0) {
                CloseHandle(hSnapshot);
                return pe32.th32ProcessID;
            }
        } while (Process32NextW(hSnapshot, &pe32));
    }
    CloseHandle(hSnapshot);
    return 0;
}

// Funktsiya dlya in'ektsii DLL v protsess
void InjectDLL(HANDLE hProcess, const wchar_t* dllPath) {
    void* pDllPath = VirtualAllocEx(hProcess, NULL, (wcslen(dllPath) + 1) * sizeof(wchar_t), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!pDllPath) {
        std::cout << "Ne udalos' vydelit' pamyat' v protsesse." << std::endl;
        return;
    }

    WriteProcessMemory(hProcess, pDllPath, dllPath, (wcslen(dllPath) + 1) * sizeof(wchar_t), NULL);

    HANDLE hLoadThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"), pDllPath, 0, NULL);
    if (hLoadThread) {
        WaitForSingleObject(hLoadThread, INFINITE);
        CloseHandle(hLoadThread);
        std::cout << "DLL uspeshno zagruzheno v protsess." << std::endl;
    }
    else {
        std::cout << "Ne udalos' sozdать potok dlya zagruzki DLL." << std::endl;
    }

    VirtualFreeEx(hProcess, pDllPath, 0, MEM_RELEASE);
}

// Funktsiya dlya vyzova funktsii Run i peredachi parametrov
void CallRunFunction(HANDLE hProcess, const wchar_t* dllPath, const char* windowTitle, const char* keyName) {
    HMODULE hModule = LoadLibraryW(dllPath);
    if (!hModule) {
        std::cout << "Ne udalos' zagruzit' DLL v tekushchiy protsess." << std::endl;
        return;
    }

    FARPROC pRun = GetProcAddress(hModule, "Run");
    if (!pRun) {
        std::cout << "Ne udalos' nayti funktsiyu Run." << std::endl;
        FreeLibrary(hModule);
        return;
    }

    // Vydelyaem pamyat' dlya struktury parametrov
    void* pRunParams = VirtualAllocEx(hProcess, NULL, sizeof(RunParams), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!pRunParams) {
        std::cerr << "Ne udalos' vydelit' pamyat' dlya parametrov." << std::endl;
        FreeLibrary(hModule);
        return;
    }

    // Zapolnyaem strukturu parametrov
    RunParams params;
    strncpy_s(params.windowTitle, windowTitle, sizeof(params.windowTitle) - 1);
    strncpy_s(params.keyName, keyName, sizeof(params.keyName) - 1);

    // Zapisyvayem parametry v vydelennuyu pamyat'
    WriteProcessMemory(hProcess, pRunParams, &params, sizeof(RunParams), NULL);

    // Sozdaem potok dlya vyzova funktsii Run
    HANDLE hRunThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRun, pRunParams, 0, NULL);
    if (hRunThread) {
        WaitForSingleObject(hRunThread, INFINITE);
        CloseHandle(hRunThread);
        std::cout << "Funktsiya Run uspeshno vyzvana." << std::endl;
    }
    else {
        std::cout << "Ne udalos' sozdать potok dlya vyzova funktsii Run." << std::endl;
    }

    // Osvobozhdaem pamyat'
    VirtualFreeEx(hProcess, pRunParams, 0, MEM_RELEASE);
    FreeLibrary(hModule);
}

int main() {
    const wchar_t* processName = L"dota2.exe";
    const wchar_t* dllPath = L"C:\\Users\\sun\\source\\repos\\lua_loader_dll\\x64\\Debug\\lua_loader_dll.dll";
    const char* windowTitle = "Dota 2"; // Nazvanie okna, kuda budet in'ektirovatsya DLL
    const char* keyName = "B";                      // Nazvanie klavishi dlya nazhatiya

    DWORD processID = GetProcessID(processName);
    if (processID == 0) {
        std::cout << "Cannot find process Dota 2" << std::endl;
        return 1;
    }

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (!hProcess) {
        std::cout << "Cannot open process." << std::endl;
        return 1;
    }

    InjectDLL(hProcess, dllPath);
    CallRunFunction(hProcess, dllPath, windowTitle, keyName);

    CloseHandle(hProcess);
    return 0;
}
Ниже код DLL, которая подгружает LUA (это говнокод, но даже когда там был на первый взгляд норм код, он все равно не работал)
C++:
#include "pch.h"
#include <windows.h>
#include <lua.hpp>
#include <iostream>

const char* luaCode = R"(-- Функция для проверки наличия Observer Wards в инвентаре
local function hasObserverWard(inventory)
    for i = 0, 5 do -- Индексы предметов в инвентаре
        local item = inventory:GetItemInSlot(i)
        if item and item:GetName() == "item_observer_ward" then
            return true -- Найдены Observer Wards
        end
    end
    return false -- Observer Wards не найдены
end

-- Функция для размещения Observer Wards
local function placeObserverWards()
    local hero = Entities:GetLocalPlayer():GetAssignedHero() -- Получаем локального героя
    if not hero then
        print("Hero not found!")
        return
    end

    local inventory = hero:GetInventory() -- Получаем инвентарь героя
    if hasObserverWard(inventory) then
        print("Observer Wards found in inventory.")
        
        -- Ищем позицию для размещения
        local targetPosition = Vector(0, 0, 0) -- Здесь вы можете указать координаты, где хотите разместить варды
        -- Логика размещения варда
        hero:CastAbilityOnPosition(targetPosition, hero:FindAbilityByName("item_observer_ward"), 0)
        
        print("Placing Observer Ward at position: ", targetPosition)
    else
        print("No Observer Wards found in inventory.")
    end
end

-- Основная функция, которая будет вызвана при запуске скрипта
local function main()
    print("Lua script is running.")
    placeObserverWards() -- Вызываем функцию размещения варда
end

-- Запускаем основной процесс
main()
)";

void ExecuteLuaScript() {
    lua_State* L = luaL_newstate(); // Create a new Lua state
    luaL_openlibs(L);                // Open standard Lua libraries

    // Load the Lua code from the string
    if (luaL_dostring(L, luaCode) != LUA_OK) {
        MessageBoxA(NULL, lua_tostring(L, -1), "Lua Error", MB_OK | MB_ICONERROR);
        lua_pop(L, 1); // Remove error message from the stack
        lua_close(L);  // Close Lua state
        return;
    }

    lua_close(L); // Close Lua state after execution
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        ExecuteLuaScript(); // Execute Lua script on DLL attach
    }
    return TRUE;
}
 
Пользователь
Статус
Оффлайн
Регистрация
26 Авг 2023
Сообщения
370
Реакции[?]
31
Поинты[?]
30K
Всем привет, хотел обратиться за помощью, возможно кто-то из вас откликнется, чему я очень буду благодарен.

У меня есть injector написанный за несколько дней на C++ (свою функцию он выполняет), так же у меня есть DLL, которая в свою очередь инжектит LUA скрипт в процесс игры dota2.exe, сама DLL загружается, но ожидаемого результата в игре не происходит, то есть скрипт не работает.

То, что я пытаюсь заинжектить в процесс, это изначально написанный для ботов ward helper, который говорит ботам куда нужно расставлять варды, моя идея заключается в том, чтобы сделать эту функцию для обычного игрока.
Условно ты запускаешь игру, спавнишься инжектишь скрипт, а после скрипт автоматически идет расставлять варды, круто да)):hearteyecat:

Если кто-то шарит в LUA и/или C++ и готов на волонтерских началах помочь, буду очень благодарен.
Можно написать в лс на форуме или ответить в топике.
попробуй другой инжектор мб - процесс хакер, екстрим инжектор
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Ниже код С++

C++:
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <iostream>
#include <string>

#pragma comment(lib, "Psapi.lib")

// Opredelyaem strukturu dlya peredachi argumentov
struct RunParams {
    char windowTitle[256]; // Zagolovok okna
    char keyName[16];      // Nazvanie klavishi
};

// Funktsiya dlya polucheniya ID protsessa po ego imeni
DWORD GetProcessID(const wchar_t* processName) {
    PROCESSENTRY32W pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32W);

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) return 0;

    if (Process32FirstW(hSnapshot, &pe32)) {
        do {
            if (wcscmp(pe32.szExeFile, processName) == 0) {
                CloseHandle(hSnapshot);
                return pe32.th32ProcessID;
            }
        } while (Process32NextW(hSnapshot, &pe32));
    }
    CloseHandle(hSnapshot);
    return 0;
}

// Funktsiya dlya in'ektsii DLL v protsess
void InjectDLL(HANDLE hProcess, const wchar_t* dllPath) {
    void* pDllPath = VirtualAllocEx(hProcess, NULL, (wcslen(dllPath) + 1) * sizeof(wchar_t), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!pDllPath) {
        std::cout << "Ne udalos' vydelit' pamyat' v protsesse." << std::endl;
        return;
    }

    WriteProcessMemory(hProcess, pDllPath, dllPath, (wcslen(dllPath) + 1) * sizeof(wchar_t), NULL);

    HANDLE hLoadThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"), pDllPath, 0, NULL);
    if (hLoadThread) {
        WaitForSingleObject(hLoadThread, INFINITE);
        CloseHandle(hLoadThread);
        std::cout << "DLL uspeshno zagruzheno v protsess." << std::endl;
    }
    else {
        std::cout << "Ne udalos' sozdать potok dlya zagruzki DLL." << std::endl;
    }

    VirtualFreeEx(hProcess, pDllPath, 0, MEM_RELEASE);
}

// Funktsiya dlya vyzova funktsii Run i peredachi parametrov
void CallRunFunction(HANDLE hProcess, const wchar_t* dllPath, const char* windowTitle, const char* keyName) {
    HMODULE hModule = LoadLibraryW(dllPath);
    if (!hModule) {
        std::cout << "Ne udalos' zagruzit' DLL v tekushchiy protsess." << std::endl;
        return;
    }

    FARPROC pRun = GetProcAddress(hModule, "Run");
    if (!pRun) {
        std::cout << "Ne udalos' nayti funktsiyu Run." << std::endl;
        FreeLibrary(hModule);
        return;
    }

    // Vydelyaem pamyat' dlya struktury parametrov
    void* pRunParams = VirtualAllocEx(hProcess, NULL, sizeof(RunParams), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!pRunParams) {
        std::cerr << "Ne udalos' vydelit' pamyat' dlya parametrov." << std::endl;
        FreeLibrary(hModule);
        return;
    }

    // Zapolnyaem strukturu parametrov
    RunParams params;
    strncpy_s(params.windowTitle, windowTitle, sizeof(params.windowTitle) - 1);
    strncpy_s(params.keyName, keyName, sizeof(params.keyName) - 1);

    // Zapisyvayem parametry v vydelennuyu pamyat'
    WriteProcessMemory(hProcess, pRunParams, &params, sizeof(RunParams), NULL);

    // Sozdaem potok dlya vyzova funktsii Run
    HANDLE hRunThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRun, pRunParams, 0, NULL);
    if (hRunThread) {
        WaitForSingleObject(hRunThread, INFINITE);
        CloseHandle(hRunThread);
        std::cout << "Funktsiya Run uspeshno vyzvana." << std::endl;
    }
    else {
        std::cout << "Ne udalos' sozdать potok dlya vyzova funktsii Run." << std::endl;
    }

    // Osvobozhdaem pamyat'
    VirtualFreeEx(hProcess, pRunParams, 0, MEM_RELEASE);
    FreeLibrary(hModule);
}

int main() {
    const wchar_t* processName = L"dota2.exe";
    const wchar_t* dllPath = L"C:\\Users\\sun\\source\\repos\\lua_loader_dll\\x64\\Debug\\lua_loader_dll.dll";
    const char* windowTitle = "Dota 2"; // Nazvanie okna, kuda budet in'ektirovatsya DLL
    const char* keyName = "B";                      // Nazvanie klavishi dlya nazhatiya

    DWORD processID = GetProcessID(processName);
    if (processID == 0) {
        std::cout << "Cannot find process Dota 2" << std::endl;
        return 1;
    }

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if (!hProcess) {
        std::cout << "Cannot open process." << std::endl;
        return 1;
    }

    InjectDLL(hProcess, dllPath);
    CallRunFunction(hProcess, dllPath, windowTitle, keyName);

    CloseHandle(hProcess);
    return 0;
}
Ниже код DLL, которая подгружает LUA (это говнокод, но даже когда там был на первый взгляд норм код, он все равно не работал)
C++:
#include "pch.h"
#include <windows.h>
#include <lua.hpp>
#include <iostream>

const char* luaCode = R"(-- Функция для проверки наличия Observer Wards в инвентаре
local function hasObserverWard(inventory)
    for i = 0, 5 do -- Индексы предметов в инвентаре
        local item = inventory:GetItemInSlot(i)
        if item and item:GetName() == "item_observer_ward" then
            return true -- Найдены Observer Wards
        end
    end
    return false -- Observer Wards не найдены
end

-- Функция для размещения Observer Wards
local function placeObserverWards()
    local hero = Entities:GetLocalPlayer():GetAssignedHero() -- Получаем локального героя
    if not hero then
        print("Hero not found!")
        return
    end

    local inventory = hero:GetInventory() -- Получаем инвентарь героя
    if hasObserverWard(inventory) then
        print("Observer Wards found in inventory.")
       
        -- Ищем позицию для размещения
        local targetPosition = Vector(0, 0, 0) -- Здесь вы можете указать координаты, где хотите разместить варды
        -- Логика размещения варда
        hero:CastAbilityOnPosition(targetPosition, hero:FindAbilityByName("item_observer_ward"), 0)
       
        print("Placing Observer Ward at position: ", targetPosition)
    else
        print("No Observer Wards found in inventory.")
    end
end

-- Основная функция, которая будет вызвана при запуске скрипта
local function main()
    print("Lua script is running.")
    placeObserverWards() -- Вызываем функцию размещения варда
end

-- Запускаем основной процесс
main()
)";

void ExecuteLuaScript() {
    lua_State* L = luaL_newstate(); // Create a new Lua state
    luaL_openlibs(L);                // Open standard Lua libraries

    // Load the Lua code from the string
    if (luaL_dostring(L, luaCode) != LUA_OK) {
        MessageBoxA(NULL, lua_tostring(L, -1), "Lua Error", MB_OK | MB_ICONERROR);
        lua_pop(L, 1); // Remove error message from the stack
        lua_close(L);  // Close Lua state
        return;
    }

    lua_close(L); // Close Lua state after execution
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        ExecuteLuaScript(); // Execute Lua script on DLL attach
    }
    return TRUE;
}
ты вызываешь функции и используешь переменные которых не существует - Entities, GetLocalPlayer и т.д.
как оно по-твоему должно работать?
луа джаваскрипт питон джава и тд это языки которые совершенно ничего серьезного не умеют делать и сами по себе они абсолютно бесполезны, весь их прикол в том что к ним можно привязать прослойку написанную на С(++)(некоторые прослойки зачастую уже сразу при запуске привязываются, например часть стандартной библиотеки(например как luaL_openlibs это делает) и т.д.) которая уже будет делать работу, а язык будет ей "управлять"(давать ей работу).
имплементируй сам эти функции на С(++) и привязывай к луа машине.
если ты хочешь использовать луа апи доты -
1) она онли для сервера поэтому она на клиенте у тебя не будет работать. она предназначена для написания плагинов для сереров(кастомок кароче).
2) она привязана к дотовской луа машине а не к твоей собственной
 
Начинающий
Статус
Оффлайн
Регистрация
3 Ноя 2024
Сообщения
3
Реакции[?]
0
Поинты[?]
0
ты вызываешь функции и используешь переменные которых не существует - Entities, GetLocalPlayer и т.д.
как оно по-твоему должно работать?
луа джаваскрипт питон джава и тд это языки которые совершенно ничего серьезного не умеют делать и сами по себе они абсолютно бесполезны, весь их прикол в том что к ним можно привязать прослойку написанную на С(++)(некоторые прослойки зачастую уже сразу при запуске привязываются, например часть стандартной библиотеки(например как luaL_openlibs это делает) и т.д.) которая уже будет делать работу, а язык будет ей "управлять"(давать ей работу).
имплементируй сам эти функции на С(++) и привязывай к луа машине.
если ты хочешь использовать луа апи доты -
1) она онли для сервера поэтому она на клиенте у тебя не будет работать. она предназначена для написания плагинов для сереров(кастомок кароче).
2) она привязана к дотовской луа машине а не к твоей собственной
спасибо
 
Сверху Снизу