global $sModule = "Diablo III.exe"
global $ProcessID = WinGetProcess(" Diablo(не помню точно название окна на бетке другое было ;D) ")
_GetPrivilege_SEDEBUG()
global $DllInformation = _MemoryOpen($ProcessID)
global $baseADDR = _MemoryModuleGetBaseAddress($ProcessID, $sModule)
;оффсеты ниже думаю у тя есть :-\ а то это с RQ
Func DataOp($Param1, $Param2="no param", $Param3="no param", $ToDo="Read", $Data=0)
Global $Base, $Temp, $MemTemp, $DataType, $Offset[5]=["nop", "nop", "nop", "nop", "nop"]
If $ToDo <> "Read" And $ToDo <> "Write" Then MsgBox(0,"ошибка","неправельный параметр")
;Определяем массив в который можно записать до 4 массивов. Сразу же присваиваем всем ячейкам какое-нибудь значение отличное от офсета.
;$Base - сюда скрипт записывает необходимый базовый адрес для текущего запроса
;$MemTemp - тут скрипт обрабатывает данные получаемые из памяти необходимые для текущего запроса
;$DataType - сюда скрипт записывает тип данных необходимый для текущего запроса
;$ToDo - что мы хотим делать по данному адресу
;$Data - если мы хотим произвести запись по адресу, мы должны указать что мы хоти туда записать.
;При обращении в эту функцию, она сперва переопределяет все значения на необходимые скрипту в данный момент и далее отправляет эти данные на обработку
Select
Case $Param1 = "Char" ;наша структура работы с персонажем Обращение: DataOp("Char", ...
$DataType = "dword" ;тип данных
$Base =$baseADDR+0x005D4B64
Select
Case $Param2 = "Cur HP" ;жизни персонажа. Обращение: DataOp("Char", "Cur HP")
$Offset[1] = '4'
$Offset[2] = '1BC'
Case $Param2 = "Max MP" ;макс жизни персонажа. Обращение: DataOp("Char", "Max HP")
$Offset[1] = '4'
$Offset[2] = '494'
$Offset[3] = '324'
Case $Param2 = "Cur MP" ;мана персонажа. Обращение: DataOp("Char", "Cur MP")
$Offset[1] = '4'
$Offset[2] = '494'
$Offset[3] = '320'
Case $Param2 = "Max HP" ;мана персонажа. Обращение: DataOp("Char", "Max MP")
$Offset[1] = '4'
$Offset[2] = '174'
Case $Param2 = "Pos" ;Обращение: DataOp("Char", "Pos", ...
$Base =$baseADDR+0x005D4B64
$DataType = "float"
Select
Case $Param3 = "X" ;Обращение: DataOp("Char", "Pos", "X")
$Offset[1] = '1B8'
$Offset[2] = '34'
Case $Param3 = "Y" ;Обращение: DataOp("Char", "Pos", "Y")
$Offset[1] = '1B8'
$Offset[2] = '38'
Case $Param3 = "Z" ;Обращение: DataOp("Char", "Pos", "Z")
$Offset[1] = '1B8'
$Offset[2] = '3c'
;~
Case $Param3 = "R" ;Обращение: DataOp("Char", "Pos", "R Base") Работаем с ячейкой отвечающей за ротацию чара
$Offset[1] = '1B8'
$Offset[2] = '24'
Case $Param3 = "All" ;Обращение: DataOp("Char", "Pos", "All")
Local $rScan[4] = ["X", "Y", "Z", "R"] ;Создаем временный массив в который заносим то что будет сканироваться и в каком порядке оно будет сканироваться
Local $rTemp[4] ;Создаем временный массив в который будем записывать результаты сканов
For $i = 0 To UBound($rTemp, 1)-1 Step 1
$rTemp[$i] = DataOp("Char", "Pos", $rScan[$i]) ;Сканируем
Next
Return $rTemp ;Возвращаем массив
Case Else
SetError(3)
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
;~ ErrorMsg('DataOp("'&$Param1&'", "'&$Param2&'", WTF?...', 'Ошибка вызова: команды DataOp("'&$Param1&'", "'&$Param2&'", "'&$Param3&'") не существует.')
EndSelect
Case Else
SetError(2)
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
;~ ErrorMsg('DataOp("'&$Param1&'", WTF?...', 'Ошибка вызова: команды DataOp("'&$Param1&'", "'&$Param2&'") не существует.')
EndSelect
Case $Param1 = "Target"
$DataType = "dword" ;тип данных
Select
Case $Param2 = "CursorInfo" ;ж Обращение: DataOp("Target", "CursorInfo")
$Base = $baseADDR+0x004BCD74
$MemTemp =_MemoryRead($Base, $DllInformation)
Return $MemTemp
Case $Param2 = "targetCheck" ;ж Обращение: DataOp("Target", "targetCheck")
$Base =$baseADDR+0x005D4B64
$Offset[1] = '4'
$Offset[2] = '190'
$Offset[3] = 'E4'
Case Else
SetError(2)
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
;~ ErrorMsg('DataOp("'&$Param1&'", WTF?...', 'Ошибка вызова: команды DataOp("'&$Param1&'", "'&$Param2&'") не существует.')
EndSelect
Case Else
SetError(1)
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
;~ ErrorMsg('DataOp(WTF?...', 'Ошибка вызова: команды DataOp("'&$Param1&'") не существует.')
EndSelect
;Тут происходит обработка данных пришедших сверхку
$MemTemp = (_MemoryRead($Base, $DllInformation)) ;первый запрос в память, полученный результат уже будет обрабатываться в цикле
For $i = 2 To UBound($Offset, 1)-1 Step 1 ;i начинается с двух потому что было решено оставить [0] ячейку пустой, мб в будущем пригодится. В обращениях же к памяти обращения идут в ячейку [$i-1]
If String($Offset[$i]) = "nop" Then ;Смотрим значение текущей ячейки. Если оно не содержит в себе оффсет
If $ToDo = "Read" Then $MemTemp = _MemoryRead($MemTemp+Dec($Offset[$i-1]), $DllInformation, $DataType) ;Если $ToDo = Read - читаем память. Значит нам пора формировать последний запрос используя данные хранящиеся в пред идущей ячейке [$i-1], на этом этапе нам необходимо указать тип данных которые мы желаем получить. Задаются в переменной $DataType
If $ToDo = "Write" Then $MemTemp = _MemoryWrite($MemTemp+Dec($Offset[$i-1]), $DllInformation, $Data, $DataType) ;Если $ToDo = Write - пишем память. Значит нам пора формировать последний запрос используя данные хранящиеся в пред идущей ячейке [$i-1], на этом этапе нам необходимо указать тип данных которые мы желаем записать. Задаются в переменной $DataType
ExitLoop ;Отправив последний запрос, выходим из цикла. Нам больше нечего искать.
Else ;Если значение в текущей ячейке содержит в себе оффсет, значит и пред идущая ячейка содержит в себе оффсет.
$MemTemp =(_MemoryRead($MemTemp+Dec($Offset[$i-1]), $DllInformation)) ;Формируем запрос используя оффсет хранящийся в пред идущей от текущей ячейке [$i-1], чтобы попасть на следующий уровень памяти.
EndIf
Next
Return $MemTemp ;Возвращаем полученные данные.
EndFunc
Func _MemoryModuleGetBaseAddress($iPID, $sModule)
If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)
If Not IsString($sModule) Then Return SetError(2, 0, 0)
Local $PSAPI = DllOpen("psapi.dll")
;Get Process Handle
Local $hProcess
Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE
If $iPID > 0 Then
Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
If $hProcess[0] Then
$hProcess = $hProcess[0]
EndIf
EndIf
;EnumProcessModules
Local $Modules = DllStructCreate("ptr[1024]")
Local $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
If $aCall[4] > 0 Then
Local $iModnum = $aCall[4] / 4
Local $aTemp
For $i = 1 To $iModnum
$aTemp = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
If $aTemp[3] = $sModule Then
DllClose($PSAPI)
Return Ptr(DllStructGetData($Modules, 1, $i))
EndIf
Next
EndIf
DllClose($PSAPI)
Return SetError(-1, 0, 0)
EndFunc