std::X$$V::Z::_Func_impl_no_alloc
-
Автор темы
- #1
Тут ничего писать не буду т.к в коде достаточно комментариев.
Сосна сам код
Остаётся только интерфейс накинуть.
А, да. Я не очень шарю за байпас при запуске луа, а значит за это может банить
Для начала создаём пустой проект в студии, далее заходим в свойства
Потом в определение препроцессора добавляем
Теперь создаём main.cpp
Потом в определение препроцессора добавляем
_CRT_SECURE_NO_WARNINGS
Теперь создаём main.cpp
Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.
Сосна сам код
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;
}
Остаётся только интерфейс накинуть.
А, да. Я не очень шарю за байпас при запуске луа, а значит за это может банить
Последнее редактирование: