-2

我使用作弊引擎在 MyGame 中找到了一个值的地址并创建了一个作弊表(mygame.ct)

这是我发现的一些更改值的 Lua 代码:

function AOBRep(search, change)
    local aob = AOBScan(search)
    if aob then
        for i=0,aob.Count-1 do
            autoAssemble(aob[i]..':\ndb '..change)
        end
        aob.Destroy()
    end
end

function option2()
    searchV = 'B8 41 00 00 C8 41 00 00 F4 41' --off
    searchV2 = 'B8 41 00 00 AF 43 00 00 AF 43' --on1
    replaceV = 'B8 41 00 00 2F 44 00 00 2F 44' --on2
    AOBRep(searchV,replaceV)
    AOBRep(searchV2,replaceV)
end

function option1()
    searchV = 'B8 41 00 00 C8 41 00 00 F4 41' --off
    replaceV = 'B8 41 00 00 AF 43 00 00 AF 43' --on
    AOBRep(searchV,replaceV)
end

MyForm = createForm(true)
MyForm.Caption = 'My Game'
MyForm.Width = 300
MyForm.Height = 200

mbbo = createButton(MyForm)
mbbo.Left = 20
mbbo.Top = 100
mbbo.Width = 80
mbbo.Height = 40
mbbo.onClick = option2
mbbo.Caption = 'Option2'

ahbf = createButton(MyForm)
ahbf.Left = 6
ahbf.Top = 4
ahbf.Width = 90
ahbf.Height = 50
ahbf.onClick = option1
ahbf.Caption = 'Option1'

我想转换此 Lua 代码以更改 C++ 中的值,

例如,将此 Lua 代码转换为将 AOB 值更改B8 41 00 00 C8 41 00 00 F4 41B8 41 00 00 AF 43 00 00 AF 43

function option2()
    searchV = 'B8 41 00 00 C8 41 00 00 F4 41' --off
    searchV2 = 'B8 41 00 00 AF 43 00 00 AF 43' --hs
    replaceV = 'B8 41 00 00 2F 44 00 00 2F 44' --mb
    AOBRep(searchV,replaceV)
    AOBRep(searchV2,replaceV)
end
4

1 回答 1

0

看看 Cheatengine 如何在 Windows 上运行,并且您想在另一个进程的地址空间中替换数据,这一切都归结为使用三个函数:

  1. CreateProcess以便创建一个进程获得一个具有必要访问权限的句柄(这是迄今为止获得一个有效的句柄的最简单方法)。
  2. ReadProcessMemory将内存复制到您自己的进程中,然后您可以在其中memcmp找到匹配项
  3. WriteProcessMemory将您想要的数据复制到您找到模式的位置

虽然这在理论上是微不足道的,但魔鬼在细节中。祝你好运。

您可以考虑使用VirtualQuery来找出实际存在的内存区域,以及QueryVirtualMemoryInformation哪些可以告诉您页面是否是私有的(私有页面可能是您唯一对作弊感兴趣的页面)。否则,您当然可以到处调用ReadProcessMemory,这将“起作用”,但会很浪费(尤其是在完全不知情的情况下,在 64 位下有相当多的地址空间需要遍历)。

于 2020-01-20T14:04:50.433 回答