Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


Cheat Engine Forum Index
PostGo back to topic
FreeER
Grandmaster Cheater Supreme
Reputation: 53
Joined: 09 Aug 2013
Posts: 1091

PostPosted: Wed Aug 16, 2017 6:45 am    Post subject:

if X is a registered symbol then you don't really need lua to do this


Code:
registersymbol(X)
alloc(X,4)

addressToInjectCode:
cmp eax,[esi+2c]
je blah
mov [x],eax


will do the job, if the jump is taken then the mov never happens so eax is not written to X, if it's not taken then it does... If you want a boolean for whether it's been updated then you could either compare it to it's previous value in lua or simply allocate 8 bytes and use 4 for that boolean, eg. mov [x],eax and mov [x+4], 1 (indicates update) then in lua set the boolean to 0 whenever you're done with it.

now if you really want/need to run some lua code when the jump is not taken the only way I've seen is something like this example for step 2 of the tutorial:

Code:
// http://forum.cheatengine.org/viewtopic.php?p=5726944#5726944  basic x64 call example
// http://forum.cheatengine.org/viewtopic.php?t=604761           faster call with CELUA_ExecuteFunctionByReference

{$lua}
-- lua function to run, could be in global table
function testMe(id)
  print('testMe was called with id ' .. tostring(id) .. '!')
  --[[
  -- registers are not updated unfortunatetly, even with get/set context...
  -- I suppose a breakpoint could be set on the return address and set them there,
  -- a registered symbol would make it easy to find
  debug_getContext() -- update registers for lua
  print(('%x'):format(EBX+0x480))
  print(EAX)
  debug_setContext() -- update registers for asm
  --]]

  -- disable the mem rec, after a delay for the script to finish
  -- or you'll probably crash when you return from the lua function
  -- to the asm code that was deallocated.... lol
  local t = createTimer()
  t.Interval = 300 -- milliseconds 3/10 of a second
  t.OnTimer = function(t)
    local mr = getAddressList().getMemoryRecordByID(id)
    if mr then mr.Active = false end
    t.destroy()
  end
end
{$asm}

loadlibrary(luaclient-i386.dll)
luacall(openLuaServer('CELUASERVER'))


CELUA_ServerName:
  db 'CELUASERVER',0

globalalloc(luaFunctionCode, 200)
luaFunctionCode:
db 'testMe(parameter)',0 // parameter set by CELUA_ExecuteFunction

[ENABLE]
aobscan(step2HitMeCode, 89 83 ?? ?? ?? ?? 8d 55 ?? e8 ?2 62)
alloc(newmem, $1000) // globalalloc mem is not dealloced

label(return)

newmem:
  mov [ebx+00000480], eax // set step 2 value
  push eax // save eax
  // push this scripts id (could be pointer to arguments in memory somewhere)
{$lua}
  return memrec and ('push #' .. memrec.id) or ('push #224') -- pre CE6.7 doesn't have memrec
{$asm}
  push luaFunctionCode // lua code to run
  call CELUA_ExecuteFunction // run it, make sure it doesn't dealloc mem that's running lol
  pop eax
  jmp return

step2HitMeCode:
  jmp newmem
  nop
return:
registerSymbol(step2HitMeCode)

[DISABLE]
step2HitMeCode:
  mov [ebx+00000480], eax
unregisterSymbol(step2HitMeCode)
dealloc(newmem)
Back to top
View user's profile Send private message
Post reviews:   Approve 1
Author Review
Twistedfate
Review: Approve
Post reference:
ReviewPosted: Wed Aug 16, 2017 7:21 am

thank you
Back to top
View user's profile Send private message
Display:  
Cheat Engine Forum Index


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites