Описание: Простейшая функция для того чтобы писать на hex asm(оно же байтами ассемблера). Теоретически можно любую функцию Си перевести в hex asm и вставить в эту функцию, потом вызывать с луа(хе-хе, извращение). Написал по фану, но может кому-то нужно будет, возможно даже кто-нибудь улучшит(к примеру добавит расчет смещения для E8(call - опкод asm) и E9(jmp - опкод asm))
Первый параметр сам hex asm, а второй прототип функции.
Пример использования:
Первый параметр сам hex asm, а второй прототип функции.
Lua:
local ffi = require 'ffi'
ffi.cdef [[
void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long flAllocationType, unsigned long flProtect);
int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);
]]
function hexAsmCode(asm, prototype)
local bytes = {}
for byte in asm:gmatch('(%x%x)') do
table.insert(bytes, tonumber('0x'..byte))
end
local code = ffi.new('uint8_t[?]', #bytes, bytes)
local addr = ffi.gc(ffi.C.VirtualAlloc(nil, ffi.sizeof(code), 0x1000, 0x40), function(addr) ffi.C.VirtualFree(addr, 0, 0x8000) end)
ffi.copy(addr, code, ffi.sizeof(code))
return ffi.cast(prototype, addr)
end
Lua:
local code = [[
55
89 E5
8B 45 08
0F AF 45 08
5D
C3
]] -- или просто в одну строку типа 5589E58B45080FAF45085DC3
--Это функция int square(int a) return a*a
local square = hexAsmCode(code, 'int (__cdecl*)(int)')
print(square(4)) --вернет 16