Как изменить значение из памяти через C ++ (получить значение из чит-движка) - PullRequest
0 голосов
/ 19 января 2020

Я нашел адрес значения в MyGame с помощью Cheat Engine и создал Cheat Table (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 41 в B8 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

1 Ответ

0 голосов
/ 20 января 2020

Видя, как Cheatengine работает на Windows, и вы хотите заменить данные в адресном пространстве другого процесса, все сводится к использованию трех функций:

  1. CreateProcess для создания процесса и получите дескриптор с необходимыми правами доступа к нему (это, безусловно, самый простой способ получить дескриптор, который будет работать).
  2. ReadProcessMemory для копирования памяти в ваш собственный процесс, где вы можете memcmp найти совпадение
  3. WriteProcessMemory для копирования данных, которые вы хотите, в место, где вы нашли шаблон

Хотя это довольно тривиально в теории, дьявол кроется в деталях. Удачи.

Вы можете использовать VirtualQuery, чтобы узнать, какие области памяти действительно существуют, и QueryVirtualMemoryInformation, который может сказать вам, является ли страница частной (личные страницы, вероятно, являются единственными, которые вас интересуют. за читы). В противном случае вы, конечно, можете просто вызвать ReadProcessMemory повсюду, что будет «работать», но будет бесполезным (особенно под 64 битами, когда есть совсем немного адресного пространства, которое нужно пройти, когда вы делаете так совершенно не информирован).

...