Что нового

Отображение(HP,MP и т.д.) с 2+ оффсетами. Можно примеры?

scanfail

Знающий
Сообщения
244
Репутация
17
Хотелось бы обычный пример работы с 2+ оффсетами, простенький примерчик пойдет(желательно с отображением считываемого), заранее благодарен!
:IL_AutoIt_1:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Re: Работа с 2+ оффсетами. Можно примеры?

scanfail
Все экстрасенсы на выезде.
И убедись в том, что твои 2+ оффсета нельзя назвать /базовым адресом/смещением/оффсетом.
У каждого человека так сказать свой 'жаргон', поэтому напиши популярнее.
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Re: Работа с 2+ оффсетами. Можно примеры?

Например:
Поинтер: 0x00A6386C
Оф1: 0x8
Оф2: 0x4
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Продолжу предугадывание:
Код:
#include <NomadMemory.au3>

Local $eOffset = 0x00A6386C
Local $eShift = 0x00000004;На сколько смещаемся от $eOffset.
Local $eLengh = 1;Сколько считать байтов начиная с $eOffset + $eLengh

$ePID = ProcessExists("process.exe")
If Not $ePID Then
    MsgBox(0,0,"Процесс не найден!")
    Exit 1337
EndIf

$eMemory = _MemoryOpen($ePID)
$eRead = _MemoryRead(String($eOffset + $eShift), $eMemory, "byte[" & $eLengh & "])"
MsgBox(0,0,BinaryToString($eRead) & @CRLF & $eRead)
Exit
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Спасибо, но хотелось бы еще примеров.

Вот у меня есть такой скрипт от winstan-a, но он работает только с 1 оффсетом, как его переделать на работу с 2+ оффсетами?

Скрипт:
Код:
#include <nomadmemory.au3> ;подключаем необходимую библиотеку
GUICreate("Хп",220,50) ;создаем интерфейс
$gui_ph=GUICtrlCreateLabel("",10,10,200,20) ;создаём элемент интерфейса
GUISetState() ;показываем интерфейс
$proces_name="nksp.exe" ;задаём имя процесса
$adres_base=0x10722f08 ;задаём базовый адрес
$adres_ofset=0x109688 ;задаём офсет (смещение)

$PID=ProcessExists($proces_name) ;получаем PID по имяни процесса
$proces_memory = _MemoryOpen($PID) ;открываем память
While 1 ;создаём бесконечный цикл
$base=_MemoryRead($adres_base, $proces_memory) ;читаем значение базового адреса
$hp=_MemoryRead($base+$adres_ofset, $proces_memory) ;читаем значение конечного адреса которое получили суммируя значение базового адреса и офсета
GUICtrlSetData($gui_ph,$hp) ;записываем в элемент интерфейса значение
$msg=GUIGetMsg()
if $msg=-3 Then Exit
WEnd
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
А куда в этом скрипте вводить оффсеты(у меня слабые знания в asm-е)?
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Увы, но опять не то...
А нельзя переделать скрипт winstan-a и добавить к нему еще 1 offset?

Типа этого:
Код:
#include <nomadmemory.au3> ;подключаем необходимую библиотеку
GUICreate("Хп",220,50) ;создаем интерфейс
$gui_ph=GUICtrlCreateLabel("",10,10,200,20) ;создаём элемент интерфейса
GUISetState() ;показываем интерфейс
$proces_name="nksp.exe" ;задаём имя процесса
$adres_base=0x10722f08 ;задаём базовый адрес
$adres_ofset1=0x4 ;задаём офсет (смещение)
$adres_ofset2=0x4
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
#include <nomadmemory.au3> ;подключаем необходимую библиотеку
GUICreate("Хп",220,50) ;создаем интерфейс
$gui_ph=GUICtrlCreateLabel("",10,10,200,20) ;создаём элемент интерфейса
$gui_ph2=GUICtrlCreateLabel("",10,30,200,20) ;создаём элемент интерфейса
GUISetState() ;показываем интерфейс
$proces_name="nksp.exe" ;задаём имя процесса
$adres_base=0x10722f08 ;задаём базовый адрес
$adres_ofset=0x109688 ;задаём офсет (смещение)
$adres_ofset2=0x109888 ;задаём офсет (смещение)

$PID=ProcessExists($proces_name) ;получаем PID по имяни процесса
$proces_memory = _MemoryOpen($PID) ;открываем память
While 1 ;создаём бесконечный цикл
$base=_MemoryRead($adres_base, $proces_memory) ;читаем значение базового адреса
$hp=_MemoryRead($base+$adres_ofset, $proces_memory) ;читаем значение конечного адреса которое получили суммируя значение базового адреса и офсета
$hp2=_MemoryRead($base+$adres_ofset2, $proces_memory) ;читаем значение конечного адреса которое получили суммируя значение базового адреса и офсета2
GUICtrlSetData($gui_ph,$hp) ;записываем в элемент интерфейса значение
GUICtrlSetData($gui_ph2,$hp2) ;записываем в элемент интерфейса значение
$msg=GUIGetMsg()
if $msg=-3 Then Exit
WEnd
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Опять не то... Ну в смысле: Pointer:0x1 & Off1: 0x2 & Off2: 0x3 = HP. Как-то так. Они мне вместе нужны, а не по отдельности.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Насколько я понял тебе нужно сложить поинтер с двумя оффсетами?
А что мешает открыть калькулятор, выбрать инженерный вид/HEX/8 байт/ и сложить два оффсета?
Вот полностью рабочий пример, в шапке поправишь все, что не устраивает.
Код:
#include <NomadMemory.au3>

Local $eLengh = 1 ;Длинна считываемого значения(в байтах)
Local $ePoint = 0x00A6386C ;Поинт
Local $eOffset1 = 0x00000008 ;На сколько смещаемся от поинта (1)
Local $eOffset2 = 0x00000004 ;На сколько смещаемся от поинта (2)

GUICreate("GUI",200,110,-1,-1)
$tHP = GUICtrlCreateLabel("HP(off1): ",10,10,180,20)
$tHP2 = GUICtrlCreateLabel("HP(off2): ",10,35,180,20)
$tHP3 = GUICtrlCreateLabel("HP(off1 + off2): ",10,60,180,20)
$tRead = GUICtrlCreateButton("Read",10,85,180,20)
GUISetState()

$ePID = ProcessExists("process.exe")
If Not $ePID Then
    MsgBox(0,0,"Процесс не найден!")
    Exit 1337
EndIf
$eMemory = _MemoryOpen($ePID)

While 1
    $GUI_msg = GUIGetMsg()
    If $GUI_msg = -3 Then
        Exit
    ElseIf $GUI_msg = $Button Then
        $eOffset = GUICtrlRead($Edit)
        If $eOffset = "" Then ExitLoop

        GUICtrlSetData($tHP,"HP(off1): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset1), $eMemory, "byte[" & $eLengh & "]")))
        GUICtrlSetData($tHP2,"HP(off2): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset2), $eMemory, "byte[" & $eLengh & "]")))
        GUICtrlSetData($tHP3,"HP(off1 + off2): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset1 + $eOffset2), $eMemory, "byte[" & $eLengh & "]")))
    EndIf
WEnd
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Странно, если Point+Of1+Of2 дает правильный результат, то почему он тут дает не то значение?

Код:
#include <nomadmemory.au3> ;подключаем необходимую библиотеку
GUICreate("Хп",220,50) ;создаем интерфейс
$gui_ph=GUICtrlCreateLabel("",10,10,200,20) ;создаём элемент интерфейса
GUISetState() ;показываем интерфейс
$proces_name="R2Client.exe.exe" ;задаём имя процесса
$adres_base=0x1186884 ;задаём базовый адрес
$adres_ofset1=0x40 ;задаём офсет (смещение)
$adres_ofset2=0x40 ;задаём офсет (смещение)

$PID=ProcessExists($proces_name) ;получаем PID по имяни процесса
$proces_memory = _MemoryOpen($PID) ;открываем память
While 1 ;создаём бесконечный цикл
$base=_MemoryRead($adres_base, $proces_memory) ;читаем значение базового адреса
$hp=_MemoryRead($base+$adres_ofset1+$adres_ofset2, $proces_memory) ;читаем значение конечного адреса которое получили суммируя значение базового адреса и офсета
GUICtrlSetData($gui_ph,$hp) ;записываем в элемент интерфейса значение
$msg=GUIGetMsg()
if $msg=-3 Then Exit
WEnd
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
$base=_MemoryRead($adres_base, $proces_memory) ;читаем значение базового адреса
$hp=_MemoryRead($base+$adres_ofset1+$adres_ofset2, $proces_memory) ;читаем значение конечного адреса которое получили суммируя значение базового адреса и офсета

Я немного не понимаю этот кусок кода. В особенности первой строчки. Что из себя должна представлять переменная $base? А $adres_base тогда что? Лишняя каша, да и оформление желает быть лучшим.

Воспользуйся H:rofl:,(открой процесс(Extras/Open RAM),глянь базовый адрес(первая строка)).
Перепиши ее в точности в мой последний пример в переменную $ePoint.
И перепроверь смещения. Запомни, если в смещении первые цифры равны 0, то их нельзя упускать. К примеру, если у тебя смещение(оффсет) от базового адреса равно 0x00068700, то запись в виде 0x68700 недопустима.
Не путай себя поинтами и прочим бредом.

Тебе нужен базовый адрес процесса и оффсет. Остальное выкинь, руководствуйся поим последним примером.
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Чуть-чуть переделал твой скрипт:
Код:
#include <NomadMemory.au3>

Local $eLengh = 1 ;Длинна считываемого значения(в байтах)
Local $ePoint = 0x0063A834 ;Поинт
Local $eOffset1 = 0x00000079 ;На сколько смещаемся от поинта (1)
Local $eOffset2 = 0x000000e8 ;На сколько смещаемся от поинта (2)
Local $eOffset3 = 0x00000118 ;На сколько смещаемся от поинта (3)

GUICreate("GUI",200,140,-1,-1)
$tHP = GUICtrlCreateLabel("HP(off1): ",10,10,180,20)
$tHP2 = GUICtrlCreateLabel("HP(off2): ",10,35,180,20)
$tHP2 = GUICtrlCreateLabel("HP(off3): ",10,60,180,20)
$tHP3 = GUICtrlCreateLabel("HP(off1 + off2 + off3): ",10,85,180,20)
$tRead = GUICtrlCreateButton("Read",10,110,180,20)
GUISetState()

$ePID = ProcessExists("Divina.bin")
If Not $ePID Then
    MsgBox(0,0,"Процесс не найден!")
    Exit 1337
EndIf
$eMemory = _MemoryOpen($ePID)

While 1
    $GUI_msg = GUIGetMsg()
    If $GUI_msg = -3 Then
        Exit
    ElseIf $GUI_msg = $tRead Then
        $eOffset = GUICtrlRead($Edit)
        If $eOffset = "" Then ExitLoop

        GUICtrlSetData($tHP,"HP(off1): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset1), $eMemory, "byte[" & $eLengh & "]")))
        GUICtrlSetData($tHP2,"HP(off2): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset2), $eMemory, "byte[" & $eLengh & "]")))
		GUICtrlSetData($tHP3,"HP(off3): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset3), $eMemory, "byte[" & $eLengh & "]")))
        GUICtrlSetData($tHP4,"HP(off1 + off3 + off4): " & BinaryToString(_MemoryRead(String($ePoint + $eOffset1 + $eOffset2 + $eOffset3), $eMemory, "byte[" & $eLengh & "]")))
    EndIf
WEnd

Вот такая ошибка:
Код:
(29) : ==> Variable used without being declared.:
$eOffset = GUICtrlRead($Edit)
$eOffset = GUICtrlRead(^ ERROR


Да и еще, вместо адреса в байтах, у меня адрес string(text), этот код работает со string-ом?
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Вот ответ на твой вопрос http://autoit-script.ru/index.php/topic,10385.msg68938.html#msg68938
 

br2

Новичок
Сообщения
12
Репутация
2
Например:
Поинтер: 0x00A6386C
Оф1: 0x8
Оф2: 0x4
:scratch:
Код:
$pid = WinGetProcess("TitleProc")
$MO = _MemoryOpen($pid)

Func mempoint($Mem, $Offset1, $Offset2, $Offset3, $Offset4, $Offset5)
	$MemOffset = (_MemoryRead($Mem, $MO, 'ptr'))
	$Mem = $MemOffset + Dec($Offset1)

   If $Offset2 <> "false" Then
	  $MemOffset = (_MemoryRead($Mem, $MO, 'ptr'))
	  $Mem = $MemOffset + Dec($Offset2)
   EndIf

   If $Offset3 <> "false" Then
	  $MemOffset = (_MemoryRead($Mem, $MO, 'ptr'))
	  $Mem = $MemOffset + Dec($Offset3)
   EndIf

   If $Offset4 <> "false" Then
	  $MemOffset = (_MemoryRead($Mem, $MO, 'ptr'))
	  $Mem = $MemOffset + Dec($Offset4)
   EndIf

   If $Offset5 <> "false" Then
	  $MemOffset = (_MemoryRead($Mem, $MO, 'ptr'))
	  $Mem = $MemOffset + Dec($Offset5)
   EndIf

	Return $Mem
EndFunc

$dynamicadr = mempoint("0x00A6386C", "0x8", "0x4", "false", "false", "false")
 

Shaman

Знающий
Сообщения
33
Репутация
5
Не велосипедим, а просто используем функцию
Код:
_MemoryPointerRead
из того же NomadMemory

Код:
$PROCESS_ID = WinGetProcess($TITLE)
$PROCESS_INFO = _MemoryOpen($PROCESS_ID)

Dim $OFFSETS[3]
$OFFSETS[1] = 8
$OFFSETS[2] = 4

$VALUE = _MemoryPointerRead("0x00A6386C", $PROCESS_INFO, $OFFSETS)

MsgBox(0,"Value", $VALUE)
 
Верх