我的方式是先執行lua申請共享內存,內存名稱是進程id,這樣多開也不受影響,然后通過共享內存的名字就可以讀到地址了。之后的人造指針的地址也都可以放這里集中管理。
-- 申請內存
local size = 1024 -- 申請 1024 字節(1 KB)內存
-- 定義共享內存名稱為進程id
local sharedMemoryName = getOpenedProcessID()
local address = allocateSharedMemory(sharedMemoryName,size)if address == 0 thenshowMessage("內存申請失敗!")
else-- 顯示成功消息--showMessage(string.format("內存申請成功,地址:0x%X", address))-- 注冊符號local symbolName = "cheat"registerSymbol(symbolName, address)-- 將內存地址寫入首地址writeInteger(symbolName,address)showMessage(string.format("符號 '%s' 已注冊,地址:0x%X", symbolName, address))
end
然后是用C#通過進程id讀取共享內存的代碼:
try
{// 打開共享內存using (var mmf = MemoryMappedFile.OpenExisting("28728")){// 創建視圖訪問器using (var accessor = mmf.CreateViewAccessor()){// 讀取共享內存中的數據byte[] buffer = new byte[1024];accessor.ReadArray(0, buffer, 0, buffer.Length);//字節數組的讀取應與CE中的偏移保持一致}}
}
catch (Exception ex)
{Console.WriteLine("讀取共享內存失敗:" + ex.Message);
}
CE中lua函數參考:
https://wiki.cheatengine.org/index.php?title=Lua