Что нового

[World of Warcraft] Поиск адреса памяти

humerhead

Новичок
Сообщения
11
Репутация
0
Здравствуй, формучане! Хотел бы попросить вас помочь с решением вопроса. Суть такова:
Собрал по частям код
Код:
#include <GUIConstants.au3>
#include <nomadmemory.au3>
Global $ProcessName = "World of Warcraft"
Global $ProcessID = WinGetProcess($ProcessName,"")
SetPrivilege("SeDebugPrivilege", 1)
Global $x = 0x15542A68 ; каждый раз адрес другой 
Global $DllInformation = _MemoryOpen($ProcessID)

While 1
$y = (_MemoryRead($x, $DllInformation, 'char[16]'))
If $y == "swd" Then
Send("{PGUP 10}")
EndIf
WEnd


После запуска скрипта, когда в окне ввода сообщения появляется текст "swd", автоматически происходит нажатие кнопки "PGUP". Проблема заключается в том, что после каждого релога/запуска игры приходится искать адрес $x заново вручную.
Я это делаю с помощью Cheat Engine.
Ввожу любой текст в окно ввода сообщения в игре.


Нахожу несколько соответствующих адресов в Cheat Engine


Ввожу любой другой текст


Нахожу необходимый и адрес и вставляю в свой autoit скрипт


Вопрос заключается в том, как можно произвести все эти действия по поиску адреса с помощью autoit или подскажите другой способ поиска, но тоже с помощью autoit.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
humerhead
В теорию вдаваться не стану, это слишком долго. Belfigor, если не ошибаюсь, раньше расписывал более-менее детально.

(я слишком ленив)
1) Выделите ваш найденный адрес, в контекстном меню выберите пункт "Pointer scan for this address".
2) В настройки, опять же, вдаваться не стану, их не меняем. Начинаем поиск.
3) Сохраняем все/красивые (указатели/цепочки указателей), перезапускаем игру.
4) Проверяем, корректно ли отображается на них значение.

http://autoit-script.ru/index.php?topic=4334.0
 
Автор
H

humerhead

Новичок
Сообщения
11
Репутация
0
Огромное спасибо, разобрался :D




--------------------------------------------------------------------------


Еще один вопрос. Как посчитать это в autoit: [["Wow.exe"+009CE474]+2B4]=Нужный адрес
Базовый адрес "Wow.exe" я, вроде, смог найти

Код:
#include <nomadmemory.au3>
#include <MemoryModuleGetBaseAddress.au3>

Global $ProcessName = "World of Warcraft"
Global $ProcessID = WinGetProcess($ProcessName,"")
if $ProcessID <> -1 Then
    SetPrivilege("SeDebugPrivilege", 1)
    $sModule = "Wow.exe"
  Global  $baseADDR = _MemoryModuleGetBaseAddress($ProcessID, $sModule)
 EndIf
$x=0x009CE474
$offset=0x2B4
$offset2=0
283a206d2bd4.png

А само действие квадратных скобок и как его осуществить я не понял.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
В nomadmemmory была функция getbaseaddress или что-то типа этого.
 
Автор
H

humerhead

Новичок
Сообщения
11
Репутация
0
У Wow.exe адрес все время один тот же = 0x00400000, так же как и оффсеты. Я не могу понять другое.
283a206d2bd4.png

На скрине CE показаны вычисления [Wow.exe+0x009CE474]->"Адрес1", [Адрес1+2B4]->"Нужный адрес". Но после каждого релога "Адрес1" и соответственно "Нужный адрес" меняется, при том, что, как я уже говорил, адреса Wow.exe и оффсетов остаются неизменными.
То есть [Wow.exe+0x009CE474]->"Динамический адрес", Wow.exe+0x009CE474->"Статические адрес"(00DCE474). Я не знаю как вычислить значение "Динамического адреса" в autoit.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Прочитай то что находится по адресу 0x009CE474. Там будет динамический адрес.
 
Автор
H

humerhead

Новичок
Сообщения
11
Репутация
0
Как в итоге все будет выглядеть в autoit?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Писал по памяти, мог где-то и ошибиться. Но примерно так
Код:
#include <NomadMemory.au3>

$sProcess = "Wow.exe"
$pid = ProcessExists ($sProcess)
If Not $pid Then Exit
$BaseAdr = 0x00400000
$Offset_1 = 0x009CE474
$Offset_2 = 0x02B4
$Offset_3 = 0x0
$hWow = _MemoryOpen($pid)
$Address_1 = _MemoryRead($BaseAdr + $Offset_1, $hWow)	; Читаем из базового адреса + смещение
$Address_2 = _MemoryRead($Address_1 + $Offset_2, $hWow)
$Data = _MemoryRead($Address_2 + $Offset_3, $hWow)		; Должны получить свои данные
_MemoryClose($hWow)
 
Автор
H

humerhead

Новичок
Сообщения
11
Репутация
0
edyapd сказал(а):
Писал по памяти, мог где-то и ошибиться. Но примерно так
Код:
#include <NomadMemory.au3>

$sProcess = "Wow.exe"
$pid = ProcessExists ($sProcess)
If Not $pid Then Exit
$BaseAdr = 0x00400000
$Offset_1 = 0x009CE474
$Offset_2 = 0x02B4
$Offset_3 = 0x0
$hWow = _MemoryOpen($pid)
$Address_1 = _MemoryRead($BaseAdr + $Offset_1, $hWow)	; Читаем из базового адреса + смещение
$Address_2 = _MemoryRead($Address_1 + $Offset_2, $hWow)
$Data = _MemoryRead($Address_2 + $Offset_3, $hWow)		; Должны получить свои данные
_MemoryClose($hWow)
Огромное спасибо, ты меня выручил :smile:
 
Верх