LUA скрипт [arctictech] GameUI MessageBox / library for work with VT

Статус
В этой теме нельзя размещать новые ответы.
Модератор раздела "Создание скриптов для читов"
Модератор
Статус
Оффлайн
Регистрация
1 Фев 2020
Сообщения
1,198
Реакции[?]
390
Поинты[?]
45K
code_language.lua:
local ffi = require "ffi"

ffi.cdef[[
    void* GetProcAddress(void* hModule, const char* lpProcName);                      // @note: получает адрес функции
    void* LoadLibraryA(const char* lpLibFileName);                                    // @note: загружает dll в память
    typedef void* (__cdecl *CreateInterfaceFn)(const char* pName, int* pReturnCode);  // @note: тип указателя на функцию CreateInterface
]]

--@note: создаем таблицу для хранения функций
local vt = {}

--@note: функция для получения интерфейса из модуля
function vt.get_interface(module_name, interface_name)
    local module_handle = ffi.C.LoadLibraryA(module_name)
    local create_interface_fn = ffi.cast("CreateInterfaceFn", ffi.C.GetProcAddress(module_handle, "CreateInterface"))
    local interface_ptr = create_interface_fn(interface_name, nil)

    return interface_ptr
end

--@note: функция для получения указателя на функцию из виртуальной таблицы
function vt.getvfunc(obj, index)
    local vtable = ffi.cast("intptr_t**", obj)[0] --@note: получаем указатель на таблицу виртуальных функций
    return ffi.cast("intptr_t", vtable[index])    --@note: возвращаем указатель на функцию по её индексу
end

--@note: создаем класс для работы с интерфейсом
vt.library = {}
vt.library.__index = vt.library

--@note: конструктор класса
function vt.library.new(interface_ptr)
    local self = setmetatable({}, vt.library)   --@note: создаём новый объект и устанавливаем ему таблицу как мета-таблицу
    self.interface = interface_ptr              --@note: сохраняем указатель на интерфейс
    return self                                 --@note: возвращаем объект
end

--@note: метод для вызова функции из виртуальной таблицы по индексу
function vt.library:call_vfunc(index, ret_type, ...)
    local func_ptr = ffi.cast(ret_type .. "(__thiscall*)(void*, ...)", vt.getvfunc(self.interface, index))
    return func_ptr(self.interface, ...)
end

return vt

пример использования:
code_language.lua:
local vt = require "library"

local gameui_interface = vt.get_interface("client.dll", "GameUI011")
local gameui = vt.library.new(gameui_interface)
gameui:call_vfunc(19, "void", "yougame.biz", "lol", true, false, nil, nil, nil, nil, nil)


кидать "библиотеку" нужно по пути: Counter-Strike: Global Offensive\lua


1725752693557.png

1725772025962.png

переделал код. теперь его можно использовать не только для вызова msg_box, но и других функций, которые находятся в виртуальной таблице
 
Последнее редактирование:
pasting corporation
Участник
Статус
Оффлайн
Регистрация
4 Дек 2022
Сообщения
749
Реакции[?]
219
Поинты[?]
6K
code_language.lua:
local ffi = require("ffi")

ffi.cdef[[
    void* GetProcAddress(void* hModule, const char* lpProcName);                      // @note: получает адрес функции
    void* LoadLibraryA(const char* lpLibFileName);                                    // @note: загружает dll в память
    typedef void* (__cdecl *CreateInterfaceFn)(const char* pName, int* pReturnCode);  // @note: тип указателя на функцию CreateInterface
]]

--@note: создаем таблицу для хранения функций
local vt = {}

function vt.get_interface(module_name, interface_name)
    local module_handle = ffi.C.LoadLibraryA(module_name)
    local create_interface_fn = ffi.cast("CreateInterfaceFn", ffi.C.GetProcAddress(module_handle, "CreateInterface"))
    local interface_ptr = create_interface_fn(interface_name, nil)

    return interface_ptr
end

function vt.getvfunc(obj, index)
    local vtable = ffi.cast("intptr_t**", obj)[0] --@note: получаем указатель на таблицу виртуальных функций
    return ffi.cast("intptr_t", vtable[index])    --@note: возвращаем указатель на функцию по её индексу
end

vt.GameUI = {}
vt.GameUI.__index = vt.GameUI

function vt.GameUI.new(interface_ptr)
    local self = setmetatable({}, vt.GameUI) --@note: создаём новый объект и устанавливаем ему таблицу как мета-таблицу
    self.interface = interface_ptr           --@note: сохраняем указатель на интерфейс
    return self                              --@note: возвращаем объект
end

function vt.GameUI:msg_box(title, message, show_ok, show_cancel, ok_command, cancel_command, closed_command, custom_button_text, unknown)
    --@note: получаем указатель на необходимую функцию по индексу 19
    local msg_box_func = ffi.cast("void(__thiscall*)(void*, const char*, const char*, bool, bool, const char*, const char*, const char*, const char*, const char*)", vt.getvfunc(self.interface, 19))
 
    --@note: вызываем эту функцию
    msg_box_func(self.interface, title, message, show_ok, show_cancel, ok_command, cancel_command, closed_command, custom_button_text, unknown)
end

return vt

пример использования:

code_language.lua:
local vt = require("virtual_table_da_realna_ne_shutka_bro_hvatit_chitat_ya_zhe_dlya_primera_nazvanie_napisal_nu_realna")

local gameui_interface = vt.get_interface("client.dll", "GameUI011")

local gameui = vt.GameUI.new(gameui_interface)

gameui:msg_box("yougame.biz", "lol", true, false, nil, nil, nil, nil, nil)


кидать скрипт нужно по пути: Counter-Strike Global Offensive\lua


Посмотреть вложение 285162
а зач
 
Модератор раздела "Создание скриптов для читов"
Модератор
Статус
Оффлайн
Регистрация
1 Фев 2020
Сообщения
1,198
Реакции[?]
390
Поинты[?]
45K
переделал код. теперь его можно использовать не только для вызова msg_box, но и других функций, которые находятся в виртуальной таблице
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу