Что нового

[Процессы] Не могу прочитать память игры с NomadMemory

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Никак не могу прочитать память игры.
Долго и упорно гуглил связку Cheat Engine и NomadMemory.
Пробовал разные способы из примеров.


Этот способ стырен отсюда.
Заметил что значение в $MemoryOpen = _MemoryOpen($PID) при каждом запуске разное. $baseADDR всегда возвращает 0.

Код:
#RequireAdmin
#include <Pointer.au3>
SetPrivilege("SeDebugPrivilege", 1)
Global $Offset1[5] = [0, Dec('C'), Dec('208'), Dec('8'), Dec('B0')]
Global $Pointer = Dec('98DFEC')
Global $PID = ProcessExists('Trove.exe')

$MemoryOpen = _MemoryOpen($PID)
$baseADDR = _MemoryGetBaseAddress($MemoryOpen, 1)
$finalADDR = '0x' & Hex($baseADDR + $Pointer)

$Value = _MemoryPointerRead($finalADDR, $MemoryOpen, $Offset1)

ConsoleWrite($finalADDR & @CR)
MsgBox(0, '', 'PID: ' & $PID & @CR & _
		'MemoryOpen ' & $MemoryOpen & @CR & _
		'MemoryOpen[0]: ' & $MemoryOpen[0] & @CR & _
		'MemoryOpen[1]: ' & $MemoryOpen[1] & @CR & _
		'baseADDR: ' & $baseADDR & @CR & _
		'Value: ' & $Value & @CR & _
		'Value[0]: ' & $Value[0] & @CR & _
		'Value[1]: ' & $Value[1] & @CR & _
		'Address: ' & $finalADDR)

Уже подумываю перейти на AHK там это можно сделать гораздо проще..
 

firex

AutoIT Гуру
Сообщения
943
Репутация
205
gloss
Возможно, что целевой процесс x64, а ваш - x86. Еще вариант (пример):

Код:
#Include <WinAPIEx.au3>

Local $hProcess, $tModule
; ---
$hProcess = _WinAPI_OpenProcess( 0x1F0FFF, 0, ProcessExists( 'scite.exe' ) )
$tModule = _FMem_GetModuleBasicInfo( $hProcess, 'scite.exe' )
ConsoleWrite( 'BaseAddress=' & $tModule.ModulePtr & @CRLF)

Func _FMem_GetModuleBasicInfo( $hProc, $sModule )
	Local $tModules, $aRes, $pModule
	; ---
	$tModules = DllStructCreate("ptr[1024]")
	$tMODULEINFO = DllStructCreate( "ptr BaseOfDll; dword SizeOfImage; ptr EntryPoint; ptr ModulePtr;" )

	$aRes = DllCall( "psapi.dll", "int", "EnumProcessModules", "ptr", $hProc, "ptr", DllStructGetPtr($tModules), "dword", DllStructGetSize($tModules), "dword*", 0 )
	If Not @Error And $aRes[4] Then
		For $Module = 1 To ( $aRes[4] / 4 ) Step 1
			$pModule = DllStructGetData($tModules, 1, $Module)

			$aRes = DllCall( "psapi.dll", "dword", "GetModuleBaseNameW", "ptr", $hProc, "ptr", $pModule, "wstr", "", "dword", 260 )
			If Not @Error And $aRes[3] = $sModule Then
				$aRes = DllCall( "psapi.dll", "bool", "GetModuleInformation", "ptr", $hProc, "ptr", $pModule, "struct*", $tMODULEINFO, "dword", DllStructGetSize( $tMODULEINFO ) )

				$tMODULEINFO.ModulePtr = $pModule
				Return $tMODULEINFO
			EndIf
		Next
	EndIf
	Return 0
EndFunc
 
Автор
G

gloss

Ленивое кодило
Сообщения
155
Репутация
5
С вашим примером работает :ok:
Код:
#RequireAdmin
#include <Pointer.au3>
#Include <WinAPIEx.au3>

Local $hProcess, $tModule
Global $Offset1[5] = [0, Dec('C'), Dec('208'), dec('8'), dec('B0')]
Global $Pointer = Dec('98DFEC')
Global $PID = ProcessExists('Trove.exe')

$hProcess = _WinAPI_OpenProcess( 0x1F0FFF, 0, ProcessExists('Trove.exe') )
$tModule = _FMem_GetModuleBasicInfo( $hProcess, 'Trove.exe' )

$MemoryOpen = _MemoryOpen($PID)
$finalADDR = $tModule.ModulePtr + $Pointer

$Value = _MemoryPointerRead($finalADDR, $MemoryOpen, $Offset1)

ConsoleWrite($Value[1] & @CR)

Func _FMem_GetModuleBasicInfo( $hProc, $sModule )
    Local $tModules, $aRes, $pModule
    ; ---
    $tModules = DllStructCreate("ptr[1024]")
    $tMODULEINFO = DllStructCreate( "ptr BaseOfDll; dword SizeOfImage; ptr EntryPoint; ptr ModulePtr;" )

    $aRes = DllCall( "psapi.dll", "int", "EnumProcessModules", "ptr", $hProc, "ptr", DllStructGetPtr($tModules), "dword", DllStructGetSize($tModules), "dword*", 0 )
    If Not @Error And $aRes[4] Then
        For $Module = 1 To ( $aRes[4] / 4 ) Step 1
            $pModule = DllStructGetData($tModules, 1, $Module)

            $aRes = DllCall( "psapi.dll", "dword", "GetModuleBaseNameW", "ptr", $hProc, "ptr", $pModule, "wstr", "", "dword", 260 )
            If Not @Error And $aRes[3] = $sModule Then
                $aRes = DllCall( "psapi.dll", "bool", "GetModuleInformation", "ptr", $hProc, "ptr", $pModule, "struct*", $tMODULEINFO, "dword", DllStructGetSize( $tMODULEINFO ) )

                $tMODULEINFO.ModulePtr = $pModule
                Return $tMODULEINFO
            EndIf
        Next
    EndIf
    Return 0
EndFunc
 

firex

AutoIT Гуру
Сообщения
943
Репутация
205
gloss
Только вот замечание касательно моего примера, которое раньше я оставил без внимания по неизвестным причинам:

Код:
( $aRes[4] / 4 )


Замените на:
Код:
( $aRes[4] / ((@AutoItX64) ? 8 : 4) )
 
Верх