Гайд Свой C++ lua executor

std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Тут ничего писать не буду т.к в коде достаточно комментариев.

Для начала создаём пустой проект в студии, далее заходим в свойства
1608747191991.png

Потом в определение препроцессора добавляем _CRT_SECURE_NO_WARNINGS
1608747282287.png

Теперь создаём main.cpp

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.



1608747480074.png

Сосна сам код
C++:
#include <Windows.h>
#include <iostream>
#include <string>
#include <thread>
#include <filesystem>
#include <fstream>

class c_lua_interface //фул https://github.com/Sanceilaks/LemiGMODv2/blob/c5747d778902a15b852ebb23ac044ff43c2b6634/src/game_sdk/interfaces/lua/lua.h#L76
{
public:
    void run_string(char const* filename, char const* path, char const* string_toun, bool run = true, bool show_errors = true) //виртуальная функция
    {
        using fn = void(__thiscall*)(c_lua_interface*, char const*, char const*, char const*, bool, bool);
        return (*(fn**)this)[92](this, filename, path, string_toun, run, show_errors);
    }
};

class c_lua_shared //то, что мне было не лень ревёрсить https://github.com/Sanceilaks/LemiGMODv2/blob/c5747d778902a15b852ebb23ac044ff43c2b6634/src/game_sdk/interfaces/lua/lua.h#L174
{
public:
    c_lua_interface* get_interface(int state) //виртуальная функция
    {
        using fn = c_lua_interface * (__thiscall*)(c_lua_shared*, int);
        return (*(fn**)this)[6](this, state);
    }
};

typedef void* (*abstract_interface)(const char* name, int* return_code);

c_lua_shared* get_lua_shared()
{
    //получаем указатель на функцию CreateInterface
    auto create_interface = (abstract_interface)GetProcAddress(GetModuleHandleA("lua_shared.dll"), "CreateInterface");
    //вызываем её
    return (c_lua_shared*)create_interface("LUASHARED003", 0);
}

void start()
{
    //открываем консоль
    AllocConsole();
    //перенаправляем потоки
    freopen("conin$", "r", stdin);
    freopen("conout$", "w", stdout);
    freopen("conout$", "w", stderr);

    using namespace  std::chrono_literals;

    //получаем lua_shared
    auto lua_shared = get_lua_shared();
    //Получаем client lua_interface
    c_lua_interface* lua_interface = nullptr;
    do
    {
        lua_interface = lua_shared->get_interface(0);
        std::this_thread::sleep_for(1s);
    } while (!lua_interface); //Пока не зайдём на карту, не сможем получить

    while (true)
    {
        //Получаем путь до луа файла
        std::string path_to_lua;
        std::cout << "Enter path to lua >> ";
        std::cin >> path_to_lua;

        //проверяем его
        if (!std::filesystem::exists(path_to_lua))
        {
            std::cout << "Path invalid!\n";
            continue;
        }

        //создаём поток
        std::ifstream lua_file;
        lua_file.open(path_to_lua);

        //проверяем на валидность
        if (lua_file)
        {
            //читаем
            std::string lua_string((std::istreambuf_iterator<char>(lua_file)), std::istreambuf_iterator<char>());
            //запускаем
            lua_interface->run_string("", "", lua_string.c_str());
            std::cout << path_to_lua << " >> injected!\n";
        }
        else
        {
            std::cout << "Filed to open file " << path_to_lua << std::endl;
        }

        //закрываем поток
        lua_file.close();
    }
}


BOOL WINAPI DllMain(HMODULE dll, DWORD  reason_for_call, LPVOID reserved)
{
    DisableThreadLibraryCalls(dll);
    if (reason_for_call == DLL_PROCESS_ATTACH)
    {
        //создаём новый поток для нашей длл
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)start, NULL, NULL, NULL);
    }

    return TRUE;
}

Остаётся только интерфейс накинуть.

А, да. Я не очень шарю за байпас при запуске луа, а значит за это может банить
 
Последнее редактирование:
GodFull
Забаненный
Статус
Оффлайн
Регистрация
27 Июл 2020
Сообщения
487
Реакции[?]
128
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Screenshot_1.png
Блин блинушки не компилит:roflanEbalo:
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
скинь проект
ты скорее всего не весь код скопировал. У тебя на 59 строчке создание потока для длл, а это на ~100 происходит
 
Последнее редактирование:
GodFull
Забаненный
Статус
Оффлайн
Регистрация
27 Июл 2020
Сообщения
487
Реакции[?]
128
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
скинь проект

ты скорее всего не весь код скопировал. У тебя на 59 строчке создание потока для длл, а это на ~100 происходит
Абсолютно все скопировано из твоей темы
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Абсолютно все скопировано из твоей темы
C++:
#include <Windows.h>
#include <iostream>
#include <string>
#include <thread>
#include <filesystem>
#include <fstream>

class c_lua_interface //фул https://github.com/Sanceilaks/LemiGMODv2/blob/c5747d778902a15b852ebb23ac044ff43c2b6634/src/game_sdk/interfaces/lua/lua.h#L76
{
public:
    void run_string(char const* filename, char const* path, char const* string_toun, bool run = true, bool show_errors = true) //виртуальная функция
    {
        using fn = void(__thiscall*)(c_lua_interface*, char const*, char const*, char const*, bool, bool);
        return (*(fn**)this)[92](this, filename, path, string_toun, run, show_errors);
    }
};

class c_lua_shared //то, что мне было не лень ревёрсить https://github.com/Sanceilaks/LemiGMODv2/blob/c5747d778902a15b852ebb23ac044ff43c2b6634/src/game_sdk/interfaces/lua/lua.h#L174
{
public:
    c_lua_interface* get_interface(int state) //виртуальная функция
    {
        using fn = c_lua_interface * (__thiscall*)(c_lua_shared*, int);
        return (*(fn**)this)[6](this, state);
    }
};

typedef void* (*abstract_interface)(const char* name, int* return_code);

c_lua_shared* get_lua_shared()
{
    //получаем указатель на функцию CreateInterface
    auto create_interface = (abstract_interface)GetProcAddress(GetModuleHandleA("lua_shared.dll"), "CreateInterface");
    //вызываем её
    return (c_lua_shared*)create_interface("LUASHARED003", 0);
}
 
GodFull
Забаненный
Статус
Оффлайн
Регистрация
27 Июл 2020
Сообщения
487
Реакции[?]
128
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
#include <Windows.h>
#include <iostream>
#include <string>
#include <thread>
#include <filesystem>
#include <fstream>

class c_lua_interface //фул https://github.com/Sanceilaks/LemiGMODv2/blob/c5747d778902a15b852ebb23ac044ff43c2b6634/src/game_sdk/interfaces/lua/lua.h#L76
{
public:
    void run_string(char const* filename, char const* path, char const* string_toun, bool run = true, bool show_errors = true) //виртуальная функция
    {
        using fn = void(__thiscall*)(c_lua_interface*, char const*, char const*, char const*, bool, bool);
        return (*(fn**)this)[92](this, filename, path, string_toun, run, show_errors);
    }
};

class c_lua_shared //то, что мне было не лень ревёрсить https://github.com/Sanceilaks/LemiGMODv2/blob/c5747d778902a15b852ebb23ac044ff43c2b6634/src/game_sdk/interfaces/lua/lua.h#L174
{
public:
    c_lua_interface* get_interface(int state) //виртуальная функция
    {
        using fn = c_lua_interface * (__thiscall*)(c_lua_shared*, int);
        return (*(fn**)this)[6](this, state);
    }
};

typedef void* (*abstract_interface)(const char* name, int* return_code);

c_lua_shared* get_lua_shared()
{
    //получаем указатель на функцию CreateInterface
    auto create_interface = (abstract_interface)GetProcAddress(GetModuleHandleA("lua_shared.dll"), "CreateInterface");
    //вызываем её
    return (c_lua_shared*)create_interface("LUASHARED003", 0);
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Сверху Снизу