local ffi = require("ffi") or error("enable unsafe scripts")
ffi.cdef[[
typedef void* HANDLE;
typedef unsigned long DWORD;
int GetUserNameA(char *lpBuffer, DWORD *lpnSize);
]]
local get_pattern = {
GetModuleHandlePtr = ffi.cast("void***", ffi.cast("uint32_t", client.find_signature("engine.dll", "\xFF\x15\xCC\xCC\xCC\xCC\x85\xC0\x74\x0B")) + 2)[0][0],
GetProcAddressPtr = ffi.cast("void***", ffi.cast("uint32_t", client.find_signature("engine.dll", "\xFF\x15\xCC\xCC\xCC\xCC\xA3\xCC\xCC\xCC\xCC\xEB\x05")) + 2)[0][0],
reinterpret_cast = function(addr, typestring)
return function(...) return ffi.cast(typestring, client.find_signature("engine.dll", "\xFF\xE1"))(addr, ...) end
end,
}
do
get_pattern.fnGetModuleHandle = get_pattern.reinterpret_cast(get_pattern.GetModuleHandlePtr, "void*(__thiscall*)(void*, const char*)")
get_pattern.fnGetProcAddress = get_pattern.reinterpret_cast(get_pattern.GetProcAddressPtr, "void*(__thiscall*)(void*, void*, const char*)")
get_pattern.GetModuleHandle = get_pattern.fnGetModuleHandle
get_pattern.GetProcAddress = get_pattern.fnGetProcAddress
get_pattern.lib = { advapi32 = get_pattern.GetModuleHandle("advapi32.dll") }
get_pattern.export = {
advapi32 = {
GetUserNameA = get_pattern.reinterpret_cast(get_pattern.GetProcAddress(get_pattern.lib.advapi32, "GetUserNameA"), "int(__thiscall*)(void*, char*, DWORD*)")
}
}
end
local buffer = ffi.new("char[256]")
local size = ffi.new("DWORD[1]", 256)
local result = get_pattern.export.advapi32.GetUserNameA(buffer, size)
if result == 1 then
local username = ffi.string(buffer)
client.log("user: " .. username)
else
client.log("failed to get")
end