;---------------------------------------------------------------------------------------------------------------#include <NomadMemory.au3>;---------------------------------------------------------------------------------------------------------------$sBaseAdres=0x1E1D40;Базовый адрес$sOffset1=0x4C;Оффсет 1 (смещение)$sProcess="123.exe"$iPID=ProcessExists($sProcess)$sMemory=_MemoryOpen($iPID)$sRBaseAdres=_MemoryModuleGetBaseAddress($iPID,'123.exe');получаем базовый адрес процесса$sBaseA="0x"&Hex($sRBaseAdres+$sBaseAdres);складываем со смещением к базовому адресу$sPar1=_MemoryRead($sBaseA,$sMemory);читаем содержимое базового адреса$sPar2="0x"&Hex($sPar1+$sOffset1);складываем со смещением 1
#include <NomadMemory.au3>$WinHandle="Last Chaos";- Имя окна$pid=WinGetProcess($WinHandle)$info=_MemoryOpen($pid)$plus=0x00788E58$offset="28";1й указатель. Для моей функции "_MemoryOffsetRead" нужно писать без "0x"$base=_MemoryModuleGetBaseAddress($pid,"Engine.dll"); получаем адрес длл библиотеки$base=$base+$plus;- Получаем БА $mem_read=_MemoryOffsetRead($base,$info,$offset);читаем содержимое адресаMsgBox(0,"",$mem_read)
#include <MemoryModuleGetBaseAddress.au3>#include <NomadMemory.au3>$PID="Игра.exe"$plusG=0x001E18D$mof1=0x0;1й указатель$mof2=0x704;2й указатель$mof3=0x0;3й указатель$mof4=0x58;4й указатель$baseGA=_MemoryModuleGetBaseAddress($PID,'123.exe'); получаем базовый адрес процесса$baseG="0x"&Hex($baseGA+$plusG); складываем со смещением к базовому адресу$11=_MemoryRead($baseG,$Mem);читаем содержимое базового адреса$M11="0x"&Hex($1+$mof1);складываем со смещением 1 $22=_MemoryRead($M11,$Mem)$m22="0x"&Hex($22+$mof2)$33=_MemoryRead($m22,$Mem)$m33="0x"&Hex($33+$mof3)$44=_MemoryRead($m33,$Mem)$m44="0x"&Hex($44+$mof4)$mapAd=_MemoryRead($m44,$Mem);Здесь должно быть твое значение
Гдетокактотак
Про стрингсплит не знаю, но там каждый последующий оффсет прибавляется к "Считанному" адресу из предыдущей суммы!
Здравствуйте, дабы не плодить одинаковых тем хочу обновить эту. Топикпастер, как часто это бывает, нашел решение своей проблемы но не поделился с остальными...забил на тему.
Требуется читать данные из памяти, проблема в цепочке смещений.
С помощью cheat engine вычислил статический адрес и всю цепочку смещений
далее столкнулся с такой же проблемой что и у чувака в этой теме, суть в том что имеем скрипт
скрипт всегда возвращает 0, подскажите что делаю не так?
Добавлено:
Сообщение автоматически объединено:
Код:
#RequireAdmin;User Account must have Administrator privlidges #include <MemoryModuleGetBaseAddress.au3>#include <NomadMemory.au3>$plusG=0x082AD1A0$mof1=0x41c;1й указатель$mof2=0x4;2й указатель$mof3=0x0;3й указатель$mof4=0x40;3й указатель$mof5=0x4;3й указатель$baseGA=_MemoryModuleGetBaseAddress($PID,'game.exe'); получаем базовый адрес процесса$baseG="0x"&Hex($baseGA+$plusG); складываем со смещением к базовому адресу$11=_MemoryRead($baseG,$Mem);читаем содержимое базового адреса$M11="0x"&Hex($1+$mof1);складываем со смещением 1 $22=_MemoryRead($M11,$Mem)$m22="0x"&Hex($22+$mof2)$33=_MemoryRead($m22,$Mem)$m33="0x"&Hex($33+$mof3)$44=_MemoryRead($m33,$Mem)$m44="0x"&Hex($44+$mof4)$55=_MemoryRead($m44,$Mem)$m55="0x"&Hex($55+$mof5)$mapAd=_MemoryRead($m55,$Mem);Это итогMsgBox(48,"Результат",$mapAd)
пробую это вариант но он тоже не работает, смущает часть кода
Код:
$baseGA=_MemoryModuleGetBaseAddress($PID,'game.exe'); получаем базовый адрес (ТУТ В ОРИГИНАЛЕ ИСПОЛЬЗУЕТСЯ ДОПОЛНИТЕЛЬНАЯ ДЛЛ, В МОЕМ СЛУЧАЕ ВСЕ В ОДНОМ EXE)
Isn, torrentir, Вы только себя путаете этими преобразованиями.
Пару заметок вам: Данные вида 0x... преобразовываются в DEC после компиляции. Так же функция _MemoryRead возвращает данные в DEC(при чтении поинтера как INT). Какой смысл преобразовывать DEC в HEX, затем все это в строку, а затем обратно?
Есть у меня проект, для которого специально писал функцию для многоуровневого чтения поинтеров, если нужна - скину.
ADDRESSTYPE: Тип адреса
STATIC - Статический адрес.
OFFSET - Как и STATIC, но для удобства именуется оффсетом(если это оффсет).
0x... - Статический адрес первого поинтера.
OFFSET1 - Оффсет следующего поинтера по отношению указателя в предыдущем.
OFFSETN - Оффсет следующего поинтера по отношению указателя в предыдущем.
FINALOFFSET -Оффсет адреса по отношению к указателю финального поинтера.
;Возвращает одномерный массив, каждая ячейка которого соответствует ячейке $_aPoints