Перейти к содержанию

Вызываем функция CE Lua изнутри игры


MasterGH

Рекомендуемые сообщения

Когда в коде игры происходит какое-то условие, то нельзя просто так взять и взывать CE Lua функцию, т.к. код игры ничего не знает о CE. Здесь нужно немного пошаманить на ассемблере и вот два примера.

 

 

 

Примеры взяты с официального форума Cheat Engine. Первый пример может не работать.

 

 

Также с  помощью CE Lua можно работать одновременно с двумя и более процессами запущенной игры как на одном ПК, так и на многих. Два и более одновременно запущенных процесса игры это способ исключить неработающие цепочки указателей, сравнивать связи между данными (структуры, стеки, трейс логи) в том числе и находясь в пошаговой отладке одновременно на более чем одном компе.

[ENABLE]  {$lua}  function testFunc(param)    print("Hello world!")    print("Calling LUA from ASM!!!:)")    print(param)  end  {$asm}  ///#region untouched - Call CE lua function  loadlibrary(luaclient-i386.dll)  luacall(openLuaServer('CELUASERVER'))  globalalloc(luainit, 128)  globalalloc(LuaFunctionCall, 128)  label(luainit_exit)  globalalloc(luaserverinitialized, 4)  globalalloc(luaservername, 12)  luaservername:    db 'CELUASERVER',0  luainit:    cmp [luaserverinitialized],0    jne luainit_exit    push luaservername    call CELUA_Initialize //this function is defined in the luaclient dll    mov [luaserverinitialized],eax    luainit_exit:    ret  LuaFunctionCall:    push ebp    mov ebp,esp    call luainit    push [ebp+c]    push [ebp+8]    call CELUA_ExecuteFunction    pop ebp    ret 8  //luacall call example:  //push integervariableyouwishtopasstolua  //push addresstostringwithfunction  //(The lua function will have access to the variable passed by name "parameter")  //call LuaFunctionCall  //When done EAX will contain the result of the lua function  ///#endregion  globalalloc(myVar,4)  myVar:    dd 0  alloc(luaCallExample, $200)  label(funcName)  createThread(luaCallExample)  luaCallExample:    push 1    push funcName    call LuaFunctionCall    mov [myVar],eax    inc [myVar]    ret  funcName:    db 'testFunc',0  [DISABLE]
callers={}  function store(parameter)    if (callers[parameter]==nil) then      callers[parameter]=1    else      callers[parameter]=callers[parameter]+1    end  end  function getCallers()    for caller,count in pairs(callers) do      print(string.format("%x : %d", caller, count))    end   end  autoAssemble([[  loadlibrary(luaclient-i386.dll)  luacall(openLuaServer('CELUASERVER'))  globalalloc(luainit, 128)  globalalloc(LuaFunctionCall, 128)  label(luainit_exit)  globalalloc(luaserverinitialized, 4)  globalalloc(luaservername, 12)  luaservername:  db 'CELUASERVER',0  luainit:  cmp [luaserverinitialized],0  jne luainit_exit  push luaservername  call CELUA_Initialize //this function is defined in the luaclient dll  mov [luaserverinitialized],eax  luainit_exit:  ret  LuaFunctionCall:  push ebp  mov ebp,esp  call luainit  push [ebp+c]  push [ebp+8]  call CELUA_ExecuteFunction  pop ebp  ret 8  alloc(newmem,2048)  alloc(storecaller, 2048)  label(returnhere)  label(originalcode)  label(exit)  storecaller:  db 'store(parameter)',0  //------------Modify this part:--------------------  newmem:  mov eax,[esp]  push eax  push storecaller  call LuaFunctionCall  originalcode:  mov edi,edi  push ebp  mov ebp,esp  exit:  jmp returnhere  "USER32.dll"+205BA:  //peekMessageW  jmp newmem  returnhere:  ]])
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.