[BITS 32] [CPU PRESCOTT] xrLUA_ISZ equ 0x005CC104 szluaopen_base equ xrLUA_ISZ + 12; 0x005CC110 szluaopen_package equ xrLUA_ISZ + 27; 0x005CC11F szluaopen_table equ xrLUA_ISZ + 45; 0x005CC131 szluaopen_io equ xrLUA_ISZ + 61; 0x005CC141 szluaopen_os equ xrLUA_ISZ + 74; 0x005CC14E szluaopen_string equ xrLUA_ISZ + 87; 0x005CC15B szluaopen_math equ xrLUA_ISZ + 104; 0x005CC16C szluaopen_debug equ xrLUA_ISZ + 119; 0x005CC17B szluaopen_jit equ xrLUA_ISZ + 135; 0x005CC18B szluaopen_coco equ xrLUA_ISZ + 149; 0x005CC199 szlua_pushcclosure equ xrLUA_ISZ + 164; 0x005CC1A8 szlua_pushstring equ xrLUA_ISZ + 183; 0x005CC1BB szlua_call equ xrLUA_ISZ + 200; 0x005CC1CC szbase equ szluaopen_base + 8 ; "base" sz_ equ szbase + 4 ; "" szpackage equ szluaopen_package + 8 ; "package" sztable equ szluaopen_table + 8 ; "package" szio equ szluaopen_io + 8 ; "package" szos equ szluaopen_os + 8 ; "package" szstring equ szluaopen_string + 8 ; "package" szmath equ szluaopen_math + 8 ; "package" szdebug equ szluaopen_debug + 8 ; "package" szjit equ szluaopen_jit + 8 ; "package" szcoco equ szluaopen_coco + 8 ; "package" xrLUA_IAT equ 0x005CC1D5 luaopen_base equ xrLUA_IAT + ( 4 * 0 ) ; 0x005CC1D5 luaopen_package equ xrLUA_IAT + ( 4 * 1 ) ; 0x005CC1D9 luaopen_table equ xrLUA_IAT + ( 4 * 2 ) ; 0x005CC1DD luaopen_io equ xrLUA_IAT + ( 4 * 3 ) ; 0x005CC1E1 luaopen_os equ xrLUA_IAT + ( 4 * 4 ) ; 0x005CC1E5 luaopen_string equ xrLUA_IAT + ( 4 * 5 ) ; 0x005CC1E9 luaopen_math equ xrLUA_IAT + ( 4 * 6 ) ; 0x005CC1ED luaopen_debug equ xrLUA_IAT + ( 4 * 7 ) ; 0x005CC1F2 luaopen_jit equ xrLUA_IAT + ( 4 * 8 ) ; 0x005CC1F6 luaopen_coco equ xrLUA_IAT + ( 4 * 9 ) ; 0x005CC1F9 lua_pushcclosure equ xrLUA_IAT + ( 4 * 10 ) ; 0x005CC1FD lua_pushstring equ xrLUA_IAT + ( 4 * 11 ) ; 0x005CC201 lua_call equ xrLUA_IAT + ( 4 * 12 ) ; 0x005CC205 luahack_load: ; eax is state ptr push ebx ; func ptr push esi ; str ptr push edx ; edx is relocated base image ptr, becomes state ptr push edi ; call func call luahack_eip_offset luahack_eip_offset: pop ecx sub ecx, byte luahack_eip_offset ; get func base mov ebx, edx mov esi, edx mov edi, edx add ebx, luaopen_base add esi, szluaopen_base add edi, lua_pushcclosure xchg edx, eax ; grab state ptr passed thru eax ; base add esi, sz_ - szluaopen_base ; 12 add eax, luahack_postreg ; return to after luahack_reg hack push eax luahack_reg: push ebx push edx call [ edi ] add esp, 4*2 push esi push edx call [ edi + 4 ] add esp, 4*2 push dword 0x00000000 push dword 0x00000001 push edx call [ edi + 8 ] add esp, 4*3 ret luahack_postreg: ; package add esi, szpackage - sz_ ; 11 add ebx, luaopen_package - luaopen_base ; 4 call near luahack_reg ; table add esi, sztable - szpackage; 18 add ebx, luaopen_table - luaopen_package ; 4 call near luahack_reg ; io add esi, szio - sztable ; 16 add ebx, luaopen_io - luaopen_table ; 4 call near luahack_reg ; os add esi, szos - szio ; 13 add ebx, luaopen_os - luaopen_io ; 4 call near luahack_reg ; string add esi, szstring - szos ; 13 add ebx, luaopen_string - luaopen_os ; 4 call near luahack_reg ; math add esi, szmath - szstring ; 17 add ebx, luaopen_math - luaopen_string ; 4 call near luahack_reg ; debug add esi, szdebug - szmath ; 15 add ebx, luaopen_debug - luaopen_math ; 4 call near luahack_reg ; jit add esi, szjit - szdebug ; 16 add ebx, luaopen_jit - luaopen_debug ; 4 call near luahack_reg ; coco add esi, szcoco - szjit ; 14 add ebx, luaopen_coco - luaopen_jit ; 4 call near luahack_reg xchg eax, edx ; return luaState pointer pop edi ; call func pop edx ; edx is base reloc ptr, becomes state ptr - passed by eax pop esi ; str ptr pop ebx ; func ptr ret