Что нового

[Процессы] Как извлечь значение из памяти по указателю и смещению?

BrainOff

Новичок
Сообщения
18
Репутация
0
Имеется:

Код:
#include <nomadmemory.au3>

Global $ProcessName = "Заголовок программы"
Global $ProcessID = WinGetProcess($ProcessName)
Global $Memory
Global $BaseAddress

MsgBox(0,'',$ProcessID)
$Memory = _MemoryOpen($ProcessID)
$BaseAddress = _MemoryGetBaseAddress($Memory)

if @error Then
    MsgBox (0,"Error","Something is wrong with nomade. @Error Returned : " & @error)
Else
    MsgBox (0,"Success",$BaseAddress)
EndIf


_MemoryGetBaseAddress($Memory) Возвращает 2.

Код самой функции:
Код:
;===================================================================================================

; Function........:  _MemoryGetBaseAddress($ah_Handle, $iHD)
;
; Description.....:  Reads the 'Allocation Base' from the open process.
;
; Parameter(s)....:  $ah_Handle - An array containing the Dll handle and the handle of the open
;                               process as returned by _MemoryOpen().
;                    $iHD - Return type:
;                       |0 = Hex (Default)
;                       |1 = Dec
;
; Requirement(s)..:  A valid process ID.
;
; Return Value(s).:  On Success - Returns the 'allocation Base' address and sets @Error to 0.
;                    On Failure - Returns 0 and sets @Error to:
;                  |1 = Invalid $ah_Handle.
;                  |2 = Failed to find correct allocation address.
;                  |3 = Failed to read from the specified process.
;
; Author(s).......:  Nomad. Szhlopp.
; URL.............:  http://www.autoitscript.com/forum/index.php?showtopic=78834
; Note(s).........:  Go to Www.CheatEngine.org for the latest version of CheatEngine.
;===================================================================================================

Func _MemoryGetBaseAddress($ah_Handle, $iHexDec = 0)

    Local $iv_Address = 0x00100000
    Local $v_Buffer = DllStructCreate('dword;dword;dword;dword;dword;dword;dword')
    Local $vData
    Local $vType

    If Not IsArray($ah_Handle) Then
        SetError(1)
        Return 0
    EndIf


    DllCall($ah_Handle[0], 'int', 'VirtualQueryEx', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer))

    If Not @Error Then

        $vData = Hex(DllStructGetData($v_Buffer, 2))
        $vType = Hex(DllStructGetData($v_Buffer, 3))

        While $vType <> "00000080"
            DllCall($ah_Handle[0], 'int', 'VirtualQueryEx', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer))
            $vData = Hex(DllStructGetData($v_Buffer, 2))
            $vType = Hex(DllStructGetData($v_Buffer, 3))
            If Hex($iv_Address) = "01000000" Then ExitLoop
            $iv_Address += 65536

        WEnd

        If $vType = "00000080" Then
            SetError(0)
            If $iHexDec = 1 Then
                Return Dec($vData)
            Else
                Return $vData
            EndIf

        Else
            SetError(2)
            Return 0
        EndIf

    Else
        SetError(3)
        Return 0
    EndIf

EndFunc   ;==>_MemoryGetBaseAddress


Собственно, как извлечь значение адреса памяти, который хранится в указателе?
Пока что беру адрес напрямую из Cheat Engine, но это неудобно - поскольку адрес постоянно меняется. А указатель со смещением - статичны.

Спасибо.
 
Автор
B

BrainOff

Новичок
Сообщения
18
Репутация
0
Видать проблема в NomadMemory.au3, поскольку даже в таком простом коде _MemoryGetBaseAddress возвращает 2 = Failed to find correct allocation address.
Код:
#include <nomadmemory.au3>

Global $ProcessName = "Заголовок программы"
Global $ProcessID = WinGetProcess($ProcessName)
Global $Memory
Global $BaseAddress

MsgBox(0,'',$ProcessID)
$Memory = _MemoryOpen($ProcessID)
$BaseAddress = _MemoryGetBaseAddress($Memory)

if @error Then
    MsgBox (0,"Error","Something is wrong with nomade. @Error Returned : " & @error)
Else
    MsgBox (0,"Success",$BaseAddress)
EndIf


Имеется ли у кого-нибудь последняя версия nomadmemory.au3? Либо же другие, рабочие функции по работе с памятью на последней версии Autoit?
 

MaximK

Знающий
Сообщения
33
Репутация
5
Попробуй _WinAPI_OpenProcess и тд. И запроси администраторские права (#RequireAdmin)
 
Автор
B

BrainOff

Новичок
Сообщения
18
Репутация
0
MaximK сказал(а):
Попробуй _WinAPI_OpenProcess и тд. И запроси администраторские права (#RequireAdmin)
Нет, PID как раз таки возвращается. Функция _MemoryGetBaseAddress не возвращает базовый адрес памяти программы. Поэтому спрашиваю альтернативные средства для работы с памятью, либо рабочий вариант nomadmemory.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
BrainOff
Столько кода, а в итоге
Код:
Global $Key
MsgBox(0,'',$Key)

Переменная $Key после ее объявления (она равна 0) далее нигде не используется :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yuriy [?]
Переменная $Key после ее объявления (она равна 0) далее нигде не используется
smiley.gif
в коде нет такой переменной.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
firex [?]
Имеется ввиду что автор выводит не то. ( пустую переменную )
я посмотрел по ошибке на код во втором сообщении. в первом сообщение действительно выводится пустая переменная.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
:smile:я прекрасно знаю как прочитать данные по указателю и смещению но вот что такое "Базовый адрес процесса" впервые встречаю
 
Автор
B

BrainOff

Новичок
Сообщения
18
Репутация
0
winstan сказал(а):
:smile:я прекрасно знаю как прочитать данные по указателю и смещению но вот что такое "Базовый адрес процесса" впервые встречаю
Я имел ввиду изначальный адрес отсчета области памяти, которую занимает процесс.
fQ1u977.png


Yuriy сказал(а):
BrainOff
Столько кода, а в итоге
Код:
Global $Key
MsgBox(0,'',$Key)

Переменная $Key после ее объявления (она равна 0) далее нигде не используется :smile:

Неудачная попытка замаскировать переменную $Exp под $Key ;D
Но ошибка не из-за этого.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
BrainOff [?]
Но ошибка не из-за этого.
судя по твоему самому первому сообщению - ошибки нет, просто выводится 0. попробуй заменить $Key на $Exp и посмотри что же в конце концов выводится.
 
Автор
B

BrainOff

Новичок
Сообщения
18
Репутация
0
Kaster сказал(а):
BrainOff [?]
Но ошибка не из-за этого.
судя по твоему самому первому сообщению - ошибки нет, просто выводится 0. попробуй заменить $Key на $Exp и посмотри что же в конце концов выводится.
Нет, код я уже изменил на форуме. Обновил шапку - лучше начать сначала разбирать. В данный момент проблема с функцией
Код:
_MemoryGetBaseAddress($Memory)

Не могу получить начальный адрес программы. Посмотрел английские и немецкие форумы - действительно писали про проблему nomadmemory.au3 на 64 битных системах. Попробую KDMemory.au3
 

Shinobi

Новичок
Сообщения
2
Репутация
0
упс, есть новости о чтении памяти с помощью кочевой памяти или другой библиотеки? Я никогда не имел успеха в играх 64b. всегда возвращает 0.
 
Верх