Что нового

Чтение значения в памяти процесса

alex.n201

Новичок
Сообщения
25
Репутация
1
С памятью работаю первый раз, использую NomadMemory.au3.
Через ArtMoney нахожу значение.
Проблема - при чтении значения _MemoryRead всегда вовращает 0.

AutoIt Version: 3.3.14.2
Игра War Thunder.
Нужно считать количество Побед


Код прилагаю:
Код:
#include <NomadMemory.au3>
#include <Array.au3>
SetPrivilege("SeDebugPrivilege", 1)

$hwnd = WinActivate("[CLASS:DagorWClass]")
$iPID = WinGetProcess($hWnd)
;MsgBox(0,"",$iPID) ; 2088

$mOpen = _MemoryOpen($iPID)
   If @Error Then
      MsgBox(4096, "ERROR", "Ошибка открытия памяти процесса")
      Exit
   EndIf
;_ArrayDisplay($mOpen) ; [0] = 1
					   ; [1] = 0 возвращает

$mRead = (_MemoryRead(0xAD137DC0, $mOpen))
   If @Error Then
	  MsgBox(4096, "ERROR", "Ошибка чтения памяти процесса")
	  Exit
   EndIf
MsgBox(0,"",$mRead)

_MemoryClose($iPID)

Смущает, что _MemoryOpen($iPID) возвращает 0..

----------
UPD

Проверил на ворде, колличество символов нашел через ArtMoney, подставил адрес в скрипт, читается.. то есть это игра не дает? ArtMoney читает значение.. как с этим бороться?
в примере с вордом
Код:
_MemoryOpen($iPID)
  
;_ArrayDisplay($mOpen) ; [0] = 1
				     ; [300] = 300 возвращает
 
Автор
A

alex.n201

Новичок
Сообщения
25
Репутация
1
:(
Может быть из за того, что винда x64, а игра запускается в x32?


Добавлено:
Сообщение автоматически объединено:

С помощью
Код:
_WinAPI_ReadProcessMemory
, читает без проблем.
Пример в справке мудреный, долго не въезжал, особенно если не знал что такое dll, как передавать и получать значения)) разобрался благодаря этому примеру http://autoit-script.ru/index.php?topic=11973.0#msg77880

Оставлю тут, может кому пригодится.
Пример без проверок и прочего
Код:
#include <WinAPI.au3>
$hwnd = WinActivate("War Thunder")
$iPID = WinGetProcess($hWnd) ; pid

$Adress=0xACD16930 ; адрес памяти

$mOpen=_WinAPI_OpenProcess(0x1F0FFF,False,$iPID,1) ; Открывает процесс и предоставляет все возможные права доступа, 0x1F0FFF - полные права
;MsgBox(0,"",$mOpen)

$s=DllStructCreate("int") ; указатель на буфер, который получает содержимое из адресного пространства, int - тип
Local $read
_WinAPI_ReadProcessMemory($mOpen,$Adress,DllStructGetPtr($s),8,$read)

DllStructGetData($s,1) ; прочитанное значение с адреса памяти, возвращается массив, 1 - первый элемент
MsGbox(0,"",DllStructGetData($s,1)) ; прочитанное значение с памяти

_WinAPI_CloseHandle($mOpen) ; закрывает


Теперь нужно разбираться с указателями, так как значение в памяти меняется при перезапусках игры
 
Верх