Что нового

[Diablo III] Бот для игры, взлом, слезы о банах евро аккаунтов

Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
maddoc сказал(а):
да но разве не их постоянно выкладывают в теме на овнеде? Я имею ввиду может у этих офсетов есть название иное, чтобы их можно было тягать с тем где выкладывают все оффсеты.
Я пока вообще не понимаю те адреса что они выкладывают и не умею читать структуры памяти. Могу работать лишь с отдельными адресами. Они работают на качественно другом уровне.
 

teges

Знающий
Сообщения
18
Репутация
16
Тоже заинтересовался созданием бота для сабжа. Те, что сейчас есть, ориентированы на поиск пикселей, а оставлять целую машину только для бота не есть очень хорошо :scratch:
Вытянул позицию игрока на плоскости из памяти игры, правда использовал немного другие офсеты.
Код:
#include "NomadMemory.au3"

;~ Opt("TrayAutoPause", 0)
;~ Opt("TrayMenuMode", 1)
Opt("MustDeclareVars", 1)

Global $ghGame 		= 'Diablo III.exe'
Global $ghWnd 		= 'Diablo III'
Global $ghFmodEx 	= 'fmodex.dll'
Global $giWidth 	= 800
Global $giHeight 	= 600

_Game($ghWnd)

Func _Game($hWnd)
	_ClientHook($hWnd, $giWidth, $giHeight)

	WinSetState($hWnd, "", @SW_MINIMIZE)

	SetPrivilege("SeDebugPrivilege", 1)

	Local $iPID	= ProcessExists($ghGame)
	Local $hPID = _MemoryOpen(ProcessExists($ghGame))
	Local $iFmodExAdd = _MemoryModuleGetBaseAddress($iPID, $ghFmodEx)
	Local $iBase =$iFmodExAdd+0xD8CD0

;~ 	Local $aClient = WinGetClientSize($hWnd)
	Local $aCenter[3] = [$giWidth/2, $giHeight/2, 150] ; Центр экрана
;~ 	Local $aCenter[3] = [$aClient[0]/2, $aClient[1]/2, 1$aClient[1]/5] ; Центр экрана

	Local $iCurrentPos ; До 360

	Local $aPos_X_Off[5] = [0x778, 0x800, 0x594, 0x470, 0x74]
	Local $aPos_Y_Off[5] = [0x778, 0x800, 0x594, 0x470, 0x70]

	Local $iPos_X 	=  Round(_MP_Read($iBase, $hPID, $aPos_X_Off))
	Local $iBuff_X 	= $iPos_X

	Local $iPos_Y =  Round(_MP_Read($iBase, $hPID, $aPos_Y_Off))
	Local $iBuff_Y 	= $iPos_Y

	Local $fShiftDown = False

	Local $iIdle = 400 ;Скорость выполнения

	Local $iIdleTime
	Local $iIdleTimer = TimerInit()

	Local $fTurn = True ; поворот
	Local $iRotateTimer = TimerInit()
	Local $iTurnTimer 	= TimerInit()
	Local $iCastTimer 	= TimerInit()
	Local $iGlobalTimer = TimerInit()

	While 1
		$iIdleTimer = TimerInit() ;Проверка времени на весь цикл

		Select
			Case (TimerDiff($iGlobalTimer) > 7*60*1000) ;перезапуск 7мин
				_ControlSend($hWnd, "{ESC}", 1000)
				_ControlSend($hWnd, "{PRINTSCREEN}", 1000)
				_MouseClick($hWnd, 400, 320) ;покинуть
				Sleep(15*1000)
				_MouseClick($hWnd, 125, 230) ;продолжить
				Sleep(5*1000)
				$iGlobalTimer = TimerInit() ;сброс

			Case (TimerDiff($iRotateTimer) > 30 * 1000) ;случайный поворот
				$iCurrentPos = Random(1, 360, 1)
				$iRotateTimer = TimerInit() ;сброс

			Case (TimerDiff($iTurnTimer) > 300) ;поворот
				If 	($iBuff_X = $iPos_X) And _
					($iBuff_Y = $iPos_Y) Then

					If $fTurn Then
						$iCurrentPos += 30
					Else
						$iCurrentPos -= 30
					EndIf

					Select
						Case ($iCurrentPos > 360)
							$iCurrentPos = 360
							$fTurn = Not $fTurn
						Case ($iCurrentPos < 0)
							$iCurrentPos = 0
							$fTurn = Not $fTurn
					EndSelect
				EndIf
				$iBuff_X = $iPos_X
				$iBuff_Y = $iPos_Y
				$iTurnTimer = TimerInit() ;сброс
		EndSelect

		$iPos_X =  Round(_MP_Read($iBase, $hPID, $aPos_X_Off))
		$iPos_Y =  Round(_MP_Read($iBase, $hPID, $aPos_Y_Off))

		If (TimerDiff($iCastTimer) > 5 * 1000) Then
			_ControlSend($hWnd, "{w}", 50)
			$iCastTimer = TimerInit()
		EndIf

		_MouseClick($hWnd, $aCenter[0] + $aCenter[2] * Cos($iCurrentPos*3.14/180), $aCenter[1] + $aCenter[2] * Sin($iCurrentPos*3.14/180))

		$iIdleTime = TimerDiff($iIdleTimer)
		If ($iIdleTime < $iIdle) Then Sleep($iIdle - $iIdleTime) ;"заторможенность"

	WEnd
EndFunc


;~ Захват окна клиента, изменение размеров
;==================================================================================
Func _ClientHook($hWnd, $iWidth = 800, $iHeight = 600)
	Local $aTheme[2]
	Local $aClient = WinGetClientSize($hWnd)
	Local $aWindow = WinGetPos($hWnd)

	$aTheme[0] = $aWindow[2]-$aClient[0]+$iWidth
	$aTheme[1] = $aWindow[3]-$aClient[1]+$iHeight

	$hWnd = WinGetHandle($ghWnd)
	_WinMove($hWnd, $aTheme)
EndFunc

;~ Изменение размеров окна
;==================================================================================
Func _WinMove($hWnd, $iPos)
	WinMove($hWnd, "", 0, 0, $iPos[0], $iPos[1])
EndFunc

;~ Отправка клавиши и ожидание
;==================================================================================
Func _ControlSend($hWnd, $sMsg, $iIdle = 0)
	ControlSend($hWnd, "", "", $sMsg)
	If $iIdle Then Sleep($iIdle)
EndFunc

;~ Клик мышкой в окне
;==================================================================================
Func _MouseClick($hWnd, $iPosX, $iPosY, $sMode = "left", $iClicks = 1)
	ControlClick($hWnd, "", "", $sMode, $iClicks, $iPosX, $iPosY)
EndFunc


;~ Дебаг
;==================================================================================
Func _DEB($sMsg)
	If IsArray($sMsg) Then
		For $i = 0 To UBound($sMsg)-1
			ConsoleWrite("["&$i&"] = "&$sMsg[$i]&" ")
		Next
	Else
		ConsoleWrite($sMsg)
	EndIf
	ConsoleWrite(@CRLF)
EndFunc

;~ Чтение офсетов
;==================================================================================
Func _MP_Read($iBase, $hPID, $aOffsets, $sMode = 'float')
	Local $iRes = _MemoryRead($iBase, $hPID, 'ptr')
	For $i = 0 To UBound($aOffsets)-2
;~ 		_DEB($iRes+$aOffsets[$i])
		$iRes = _MemoryRead($iRes + $aOffsets[$i], $hPID, 'ptr')
		If Not $iRes Then Return 0
	Next
;~ 	_DEB("$iRes = " &$iRes)
	$iRes = _MemoryRead($iRes + $aOffsets[UBound($aOffsets)-1], $hPID, $sMode) ; последний офсет
;~ 	_DEB("$iRes = " &$iRes)
	Return $iRes
EndFunc

Смысл в том, что текущая версия подключается к игре, сравнивает позицию с той, что в буфере(буфер на 300 мс, можно сделать и просто проходной) и передвигается 8-кой. Таким образом, бот проходит по карте, жмет на определенную клавишу, после 7 мин переподключается.
Для дальнейшей работы нужен как минимум буфер здоровья (при его уменьшении будет атака).
+можно сделать карту путей из стоп-точек, но такой бот все-равно не будет способен переходить по локациям и собирать лут, кроме золота, если конечно не использовать запись в память
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Если научиться работать со структурами, из памяти можно получать имена мобов, лута на полу валяющего и его координаты. Для перемещения исключительно мышкой можно пересчитывать координаты карты к разрешению монитора.
 

nowost

Знающий
Сообщения
178
Репутация
17
на овнеде выложили UDF по перемещению

афтор UnknOwned

In short it contains a few usefull function such as:

GetCurrentPos()
MoveToPos($_x,$_y,$_z)
InteractGUID($_guid,$_snoPower)
IterateObjectList($_displayINFO)


Код:
;;================================================================================
;;================================================================================
;;	Diablo 3 Movement and Interaction UDF 
;;  For personal study purposes only.
;;
;;  By UnknOwned 2012
;;================================================================================
;;================================================================================

;;================================================================================
;; PRE FUNCTIONS
;;================================================================================
;;--------------------------------------------------------------------------------
;;	Make sure you are running as admin
;;--------------------------------------------------------------------------------
$_debug = 1
#RequireAdmin
$Admin = IsAdmin() 
if $Admin <> 1 Then
	MsgBox(0x30,"ERROR","This program require administrative rights you fool!")
	Exit
EndIf

;;--------------------------------------------------------------------------------
;;	Includes
;;--------------------------------------------------------------------------------
#include <NomadMemory.au3> ;THIS IS EXTERNAL, GET IT AT THE AUTOIT WEBSITE
#Include <math.au3>
#Include <String.au3>
#Include <Array.au3>

;;--------------------------------------------------------------------------------
;;	Open the process
;;--------------------------------------------------------------------------------
Opt("WinTitleMatchMode", -1)
SetPrivilege("SeDebugPrivilege", 1)
Global $ProcessID = WinGetProcess("Diablo III","")
Local $d3 = _MemoryOpen($ProcessID)
If @Error Then
	MsgBox(4096, "ERROR", "Failed to open memory for process;" & $ProcessID)
    Exit
EndIf

;;--------------------------------------------------------------------------------
;;	Initialize the offsets
;;--------------------------------------------------------------------------------
Offsetlist()


;;================================================================================
;; SAMPLE CODE
;;================================================================================


;//The following will display a list of all actors in the console
IterateObjectList(1)

;//The following will loot everything on the ground near you, including gold.
while 1
	$OBject = IterateObjectList(0)
	$foundobject = 0	
	for  $i = 0 to UBound ( $OBject ,1 )-1
		_ArraySort($OBject, 0 , 0 , 0 ,8)
		if $OBject[$i][6] = 2 and $OBject[$i][7] = -1 and $OBject[$i][1] <> 0xFFFFFFFF or StringInStr($OBject[$i][2],"GoldCoins") Then 
			InteractGUID($OBject[$i][1],0x7545)
			ConsoleWrite("GO")
			$foundobject = 1
			ExitLoop
		EndIf
	Next
	if $foundobject = 0 then ExitLoop
wend

;//The following will move your toon from where ever you are towards the priest.
;//This part will only work in tristram, if you are at the inn. 
;//This won't work if you have not moved in this session (do a click anywhere in the world to fix)
MoveToPos(2945,2809,24.04)
MoveToPos(2904,2803,24.04)

;//The following part will make you interact with the priest
;//Note that you can only interact with NPC's while the game window is active. (unless you spam the interact function once you are at the NPC)
$OBject = IterateObjectList(0)
$PriestIndex = _ArraySearch($OBject,"Priest_Male", 0 , 0 , 0 , 1 , 1 , 2)
InteractGUID($OBject[$PriestIndex][1],0x7546)
sleep(1000)
InteractGUID($OBject[$PriestIndex][1],0x7546)
Exit


;;================================================================================
;; FUNCTIONS
;;================================================================================
;;--------------------------------------------------------------------------------
;;	LocateMyToon()
;;--------------------------------------------------------------------------------
func LocateMyToon()
	if $_debug then ConsoleWrite("-----Looking for local player------" &@crlf)
	$_CurOffset = $_itrObjectManagerD
	$_Count = _MemoryRead($_itrObjectManagerCount, $d3, 'int')
	for $i = 0 to $_Count step +1 
		$_GUID = _MemoryRead($_CurOffset+0x4, $d3, 'ptr')
		$_NAME = _MemoryRead($_CurOffset+0x8, $d3, 'char[64]')
		if $_GUID = 0x77BC0000 Then
			global $_Myoffset = $_CurOffset
			if $_debug then ConsoleWrite("My toon located at: " &$_Myoffset & ", GUID: " & $_GUID & ", NAME: " & $_NAME &@CRLF)
			ExitLoop
		EndIf
		$_CurOffset = $_CurOffset + $_ObjmanagerStrucSize
	Next
EndFunc	

;;--------------------------------------------------------------------------------
;;	OffsetList()
;;--------------------------------------------------------------------------------
func offsetlist()
	global $ofs_ObjectManager = 				0x01580A2C
	global $ofs__ObjmanagerActorOffsetA = 		0x8b0
	global $ofs__ObjmanagerActorCount = 		0x108
	global $ofs__ObjmanagerActorOffsetB = 		0x148
	global $ofs__ObjmanagerActorLinkToCTM = 	0x380
	global $_ObjmanagerStrucSize = 	0x428	
	
	global $_itrObjectManagerA  = _MemoryRead($ofs_ObjectManager, $d3, 'ptr')		
	global $_itrObjectManagerB  = _MemoryRead($_itrObjectManagerA+$ofs__ObjmanagerActorOffsetA, $d3, 'ptr')	
	global $_itrObjectManagerCount  = $_itrObjectManagerB+$ofs__ObjmanagerActorCount
	global $_itrObjectManagerC  = _MemoryRead($_itrObjectManagerB+$ofs__ObjmanagerActorOffsetB, $d3, 'ptr')	
	global $_itrObjectManagerD  = _MemoryRead($_itrObjectManagerC, $d3, 'ptr')	
	global $_itrObjectManagerE  = _MemoryRead($_itrObjectManagerD, $d3, 'ptr')	


	
	global $ofs_Interact = 					0x01580A14
	global $ofs__InteractOffsetA = 			0xA8
	global $ofs__InteractOffsetB = 			0x58
	global $ofs__InteractOffsetUNK1 = 			0x7F20 ;Set to 777c
	global $ofs__InteractOffsetUNK2 = 			0x7F44 ;Set to 1 for NPC interaction
	global $ofs__InteractOffsetUNK3 = 			0x7F7C ;Set to 7546 for NPC interaction, 7545 for loot interaction
	global $ofs__InteractOffsetUNK4 = 			0x7F80 ;Set to 7546 for NPC interaction, 7545 for loot interaction
	global $ofs__InteractOffsetMousestate = 	0x7F84 ;Mouse state 1 = clicked, 2 = mouse down
	global $ofs__InteractOffsetGUID = 			0x7F88 ;Set to the GUID of the actor you want to interact with
	
	
	global $_itrInteractA  = _MemoryRead($ofs_Interact, $d3, 'ptr')	
	global $_itrInteractB  = _MemoryRead($_itrInteractA, $d3, 'ptr')	
	global $_itrInteractC  = _MemoryRead($_itrInteractB, $d3, 'ptr')	
	global $_itrInteractD  = _MemoryRead($_itrInteractC+$ofs__InteractOffsetA, $d3, 'ptr')	
	global $_itrInteractE  = $_itrInteractD+$ofs__InteractOffsetB

	$FixSpeed = 0x20 ;69736
	$ToggleMove = 0x34
	$MoveToXoffset = 0x3c
	$MoveToYoffset = 0x40
	$MoveToZoffset = 0x44
	$CurrentX = 0xA4
	$CurrentY = 0xA8
	$CurrentZ = 0xAc
	$RotationOffset = 0x170
	
	LocateMyToon()
	global $ClickToMoveMain = _MemoryRead($_Myoffset + $ofs__ObjmanagerActorLinkToCTM, $d3, 'ptr')
	global $ClickToMoveRotation = $ClickToMoveMain + $RotationOffset
	global $ClickToMoveCurX = $ClickToMoveMain + $CurrentX
	global $ClickToMoveCurY = $ClickToMoveMain + $CurrentY
	global $ClickToMoveCurZ = $ClickToMoveMain + $CurrentZ
	global $ClickToMoveToX = $ClickToMoveMain + $MoveToXoffset
	global $ClickToMoveToY = $ClickToMoveMain + $MoveToYoffset
	global $ClickToMoveToZ = $ClickToMoveMain + $MoveToZoffset
	global $ClickToMoveToggle = $ClickToMoveMain + $ToggleMove
	global $ClickToMoveFix= $ClickToMoveMain + $FixSpeed
	
	
	
EndFunc

;;--------------------------------------------------------------------------------
;;	GetCurrentPos()
;;--------------------------------------------------------------------------------
Func GetCurrentPos()
	dim $return[3]
	$return[0] = _MemoryRead($ClickToMoveCurX, $d3, 'float')
	$return[1] = _MemoryRead($ClickToMoveCurY, $d3, 'float')
	$return[2] = _MemoryRead($ClickToMoveCurZ, $d3, 'float')
	return $return
EndFunc

;;--------------------------------------------------------------------------------
;;	MoveToPos()
;;--------------------------------------------------------------------------------
func MoveToPos($_x,$_y,$_z)
	_MemoryWrite($ClickToMoveToX , $d3,$_x, 'float')
	_MemoryWrite($ClickToMoveToY , $d3,$_y, 'float')
	_MemoryWrite($ClickToMoveToZ , $d3,$_z, 'float')
	_MemoryWrite($ClickToMoveToggle , $d3,1, 'int')
	_MemoryWrite($ClickToMoveFix , $d3,69736, 'int')

	while 1
		$CurrentLoc = GetCurrentPos()
		$xd = $_x-$CurrentLoc[0]
		$yd = $_y-$CurrentLoc[1]
		$zd = $_z-$CurrentLoc[2]
		$Distance = Sqrt($xd*$xd + $yd*$yd + $zd*$zd)	
		if $Distance < 2 then ExitLoop
		if _MemoryRead($ClickToMoveToggle, $d3, 'float') = 0 then ExitLoop
		sleep(10)
	WEnd
EndFunc						
		
;;--------------------------------------------------------------------------------
;;	InteractGUID()
;;--------------------------------------------------------------------------------
func InteractGUID($_guid,$_snoPower)
	$FixSpeed = 0x20 ;69736
	$ToggleMove = 0x34
	$MoveToXoffset = 0x3c
	$MoveToYoffset = 0x40
	$MoveToZoffset = 0x44
	$CurrentX = 0xA4
	$CurrentY = 0xA8
	$CurrentZ = 0xAc
	$RotationOffset = 0x170
	global $ClickToMoveRotation = $ClickToMoveMain + $RotationOffset
	global $ClickToMoveCurX = $ClickToMoveMain + $CurrentX
	global $ClickToMoveCurY = $ClickToMoveMain + $CurrentY
	global $ClickToMoveCurZ = $ClickToMoveMain + $CurrentZ
	global $ClickToMoveToX = $ClickToMoveMain + $MoveToXoffset
	global $ClickToMoveToY = $ClickToMoveMain + $MoveToYoffset
	global $ClickToMoveToZ = $ClickToMoveMain + $MoveToZoffset
	global $ClickToMoveToggle = $ClickToMoveMain + $ToggleMove
	global $ClickToMoveFix= $ClickToMoveMain + $FixSpeed	
		$CurrentLocX = _MemoryRead($ClickToMoveCurX, $d3, 'float')
		$CurrentLocY = _MemoryRead($ClickToMoveCurY, $d3, 'float')
		$CurrentLocZ = _MemoryRead($ClickToMoveCurZ, $d3, 'float')
	_MemoryWrite($_itrInteractE+$ofs__InteractOffsetUNK1 , $d3, 0x777C, 'ptr')
	_MemoryWrite($_itrInteractE+$ofs__InteractOffsetUNK2 , $d3, 0x1, 'ptr')
	_MemoryWrite($_itrInteractE+$ofs__InteractOffsetUNK3 , $d3, $_snoPower, 'ptr')
	_MemoryWrite($_itrInteractE+$ofs__InteractOffsetUNK4 , $d3, $_snoPower, 'ptr')
	_MemoryWrite($_itrInteractE+$ofs__InteractOffsetMousestate , $d3, 0x1, 'ptr')
	_MemoryWrite($_itrInteractE+$ofs__InteractOffsetGUID , $d3, $_guid, 'ptr')	
		_MemoryWrite($ClickToMoveToX , $d3,$CurrentLocX+1, 'float')
		_MemoryWrite($ClickToMoveToY , $d3,$CurrentLocY, 'float')
		_MemoryWrite($ClickToMoveToZ , $d3,$CurrentLocZ, 'float')
		_MemoryWrite($ClickToMoveToggle , $d3,1, 'int')
		_MemoryWrite($ClickToMoveFix , $d3,69736, 'int')	

	$tempvalue = _MemoryRead($_itrInteractE+$ofs__InteractOffsetUNK2, $d3, 'int')
	while $tempvalue = 1
		$tempvalue = _MemoryRead($_itrInteractE+$ofs__InteractOffsetUNK2, $d3, 'int')
		sleep(10)
	WEnd
EndFunc
	
;;--------------------------------------------------------------------------------
;;	IterateObjectList()
;;--------------------------------------------------------------------------------
func IterateObjectList($_displayINFO)
	if $_displayINFO = 1 then ConsoleWrite("-----Iterating through Actors------" &@crlf)
	if $_displayINFO = 1 then ConsoleWrite("First Actor located at: "&$_itrObjectManagerD &@crlf)
	$_CurOffset = $_itrObjectManagerD
	$_Count = _MemoryRead($_itrObjectManagerCount, $d3, 'int')
	dim $OBJ[$_Count+1][9]
	if $_displayINFO = 1 then ConsoleWrite("Number of Actors : " & $_Count &@crlf)
	for $i = 0 to $_Count step +1 
		$_GUID = _MemoryRead($_CurOffset+0x4, $d3, 'ptr')
		$_NAME = _MemoryRead($_CurOffset+0x8, $d3, 'char[64]')
		$_POS_X = _MemoryRead($_CurOffset+0xB0, $d3, 'float')	
		$_POS_Y = _MemoryRead($_CurOffset+0xB4, $d3, 'float')	
		$_POS_Z = _MemoryRead($_CurOffset+0xB8, $d3, 'float')	
		$_DATA = _MemoryRead($_CurOffset+0x1FC, $d3, 'int')
		$_DATA2 = _MemoryRead($_CurOffset+0x1Cc, $d3, 'int')		
		$_DATA3 = _MemoryRead($_CurOffset+0x1C0, $d3, 'int')		
		
		$CurrentLoc = GetCurrentPos()
		$xd = $_POS_X-$CurrentLoc[0]
		$yd = $_POS_Y-$CurrentLoc[1]
		$zd = $_POS_Z-$CurrentLoc[2]
		$Distance = Sqrt($xd*$xd + $yd*$yd + $zd*$zd)
			$OBJ[$i][0] = $i
			$OBJ[$i][1] = $_GUID
			$OBJ[$i][2] = $_NAME
			$OBJ[$i][3] = $_POS_X
			$OBJ[$i][4] = $_POS_Y
			$OBJ[$i][5] = $_POS_Z
			$OBJ[$i][6] = $_DATA
			$OBJ[$i][7] = $_DATA2
			$OBJ[$i][8] = $Distance
		
		if $_displayINFO = 1 then ConsoleWrite($i & @TAB&" : " & $_CurOffset & " " & $_GUID & " : " & $_DATA & " "& $_DATA2 & " " & @TAB& $_POS_X &" "& $_POS_Y&" "& $_POS_Z & @TAB& $_NAME &@crlf)
		$_CurOffset = $_CurOffset + $_ObjmanagerStrucSize
	Next
	return $OBJ
EndFunc
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Прекрасная UDF, только у меня уже неделю не получается в ней разобраться и воспроизвести всю цепочку оффсетов в CE
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
да видел это раньше , но не забываем что варден карает за изменение памяти клиента , так что осторожнее. :beer:
PS но просто к чтению , относится лояльно ;D
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
lirikmel сказал(а):
да видел это раньше , но не забываем что варден карает за изменение памяти клиента , так что осторожнее. :beer:
PS но просто к чтению , относится лояльно ;D
Я вообще кусок с записью вырезал. Это можно делать просто мышью.
 

Violence

violet lady
Сообщения
8
Репутация
0
Здравствуйте.
По Вашему методу решила почитать оффсеты Теры.
Пробую вот так (в примере, допустим, считать должно ник персонажа)
Код:
Global $Char_name_cur_offset[7] = [0, 0x14, 0x40, 0x10, 0xC8, 0, 0]
$test = _MemoryPointerRead($Base, $DllInformation,  $Char_name_cur_offset, 'char[22]')
ConsoleWrite(@error & @crlf)
ConsoleWrite($test[1] & @crlf)

Итого: ошибок нет, но считывается только первая буква имени персонажа. Подозреваю, что:
а) ReadProcessMemory, использующийся в _MemoryPointerRead, умудряется считать только один символ (хотя, ему передается корректное количество байт для считывания)
б) там нет целого никнейма, а только одна буква?!
Пробовала всякий тип данных у него просить, и просто char, и массив char'ов (22 символа - в данном случае, максимальная длина никнейма).
Проверяла на числовых значениях (HP, MP, экспа и т.п.) - читает всё корректно.
Буду благодарна, ежели поможете с остальными буквами :smile:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Violence
Попробуйте заменить char[22] на wchar[22].

P.S. Вы уверены в корректности конечного адреса? Посмотрите на его содержимое в CE(к примеру).
 

Violence

violet lady
Сообщения
8
Репутация
0
firex сказал(а):
Попробуйте заменить char[22] на wchar[22]
О да, благодарствую, заработало :smile: что это за тип данных такой? В описании функций, касающихся чтения из памяти, его не было, а для данной задачи предлагалось как раз использовать массив char'ов...
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Скажу сразу, для того чтобы написать для TERA аналог тех ботов, которые порабощают всё живое на респах мобов, работать надо не с конкретной ячейкой, а с целыми таблицами памяти. Грубо говоря та ячейка с никнеймом которую ты нешл, является частью таблицы персонажа, где хранится вся инфа, начиная от имени, лвла, х, у, ротации камеры, заканчивая скиллами и их уровнями (мб у теры это и не так, но суть одна и та же).

Цель - найти начало таблицы, далее все данные в ней располагаются на одинаковых отступах друг от друга. Например относительно таблицы мобов, если информация о мобе занимает например 10 ячеек в памяти (хп, имя, координаты, уровень, еще чонить), то если таблица находится по адресу Х, то первый моб будет по адресу Х+10*0, второй на Х+10*1, третий на Х+10*2, и так относительно всех мобов которые собрались вокруг персонажа.

Так что в идеале, для написания сложного бота, нужны не конкретные адреса, а обработка всех необходимых массивов памяти. Таким образом и мини карту можно будет сделать, и лут видеть весь который вокруг есть и мобов и НПЦ и квесты. Короче сделать полный аналог L2Walker, правда с необходимостью запускать клиент игры. А L2Walker - был самым лучшим ботом из всех что я видел. Правда работал он с трафиком. В трафик лучше не лезть без глубоких познаний в реверс инжиниренге. Там динамичное шифрование, в отличие от ладвы, каждый новый логин в игру - новые ключи.
 

qqww22

Новичок
Сообщения
115
Репутация
4
Belfigor сказал(а):
Там динамичное шифрование, в отличие от ладвы, каждый новый логин в игру - новые ключи.
Чуток не так :smile:,но в целом прав. В памяти клиента есть место где он обрабатывает пакет в расшифрованном виде,что бы найти это место нужно изучать Ольку:smile: и Основы ассемблера на уровне передачи оп кодов в память процесса без потери целостности .Но можно работать и просто с памятью,но обновлять оффсеты при обновах это псдц.
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Кстати, кто-нибудь что-нибудь делал? Я просто на д3хцс3 играю, сам писать боюсь, жирно слишком свой акк под бан подставлять. Мб, есть какие ассисты? Типа альтернативного ГУИ?
 

Violence

violet lady
Сообщения
8
Репутация
0
Belfigor сказал(а):
Код:
...
global $baseADDR = _MemoryModuleGetBaseAddress($ProcessID, $sModule)
$Base =$baseADDR+0x00E40D94
...

Подскажите, плз, откуда берется смещение 0x00E40D94 в данном случае?
Нашла офсеты для Теры Онлайн, там оно иное (просто нашла на форуме), потом решила с помощью СЕ поискать те офсеты, которых в инете не нашла (кол-во голды у чара, допустим), в итоге получила пачку офсетов на одну и ту же ячейку памяти (штук 50), при том, указанное смещение у них отличалось. Т.е. если б я не знала изначально это значение - непонятно, к чему следовало бы обращаться. Перебор потоков и модулей в ProcessExplorer'e не дал результата - там было всё что угодно, кроме этого числа. После долгих тестов с разными персонажами и аккаунтами выяснила, что, в принципе, скорее всего, можно использовать любой из этих офсетов. Но откуда-то же берется это значение и его в итоге используют для получения различных данных персонажа...


Добавлено:
Сообщение автоматически объединено:

Belfigor сказал(а):
Скажу сразу, для того чтобы написать для TERA аналог тех ботов, которые порабощают всё живое на респах мобов, работать надо не с конкретной ячейкой, а с целыми таблицами памяти. Грубо говоря та ячейка с никнеймом которую ты нешл, является частью таблицы персонажа, где хранится вся инфа, начиная от имени, лвла, х, у, ротации камеры, заканчивая скиллами и их уровнями (мб у теры это и не так, но суть одна и та же).

Цель - найти начало таблицы, далее все данные в ней располагаются на одинаковых отступах друг от друга. Например относительно таблицы мобов, если информация о мобе занимает например 10 ячеек в памяти (хп, имя, координаты, уровень, еще чонить), то если таблица находится по адресу Х, то первый моб будет по адресу Х+10*0, второй на Х+10*1, третий на Х+10*2, и так относительно всех мобов которые собрались вокруг персонажа.

Так что в идеале, для написания сложного бота, нужны не конкретные адреса, а обработка всех необходимых массивов памяти. Таким образом и мини карту можно будет сделать, и лут видеть весь который вокруг есть и мобов и НПЦ и квесты. Короче сделать полный аналог L2Walker, правда с необходимостью запускать клиент игры. А L2Walker - был самым лучшим ботом из всех что я видел. Правда работал он с трафиком. В трафик лучше не лезть без глубоких познаний в реверс инжиниренге. Там динамичное шифрование, в отличие от ладвы, каждый новый логин в игру - новые ключи.
Ну, я не пыталась написать бота под Теру ;D под неё есть косой-кривой бот, который не умеет элементарных вещей, особенно - клик в неактивное окно. Хотела сделать автоит-скрипт для некоторых вещей, ну и, в качестве проверки, считывать данные из памяти, чтоб понимать, получилось произвести действие, или нет.

Кстати, таблицы офсетов находила под неё, там и брала офсет для никнейма. А вот офсета кол-ва голды не было в той таблице, искала сама - нашла в совершенно неожиданном месте. Но спс за совет, полажу рядышком, может быть, извлеку ещё что-нибудь полезное. Так, для интереса :whistle:

По поводу l2walker - с ним не случилось знакомиться в живую (только рассказывали), линейка прошла мимо меня, но с работами pcoder'а сталкивалась ) хороший дядя. Но теру обошел стороной, к сожалению. Меня же из всех ботов больше всего поразил Jungler под ArcheAge. Поддерживал C#, можно было что угодно на нем вытворять. Справка была качественная и писать на нём даже мне - человеку, у которого знания в шарпе (равно как и в остальных языках программирования) стремились к нулю, было легко и приятно. Но его прикрыли быстро. После этого работала с AsiWin. Тоже круть, но пришлось забыть шарп и учить паскаль. :rofl:
 
Верх