Что нового

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

Автор
B

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 мин переподключается.
Для дальнейшей работы нужен как минимум буфер здоровья (при его уменьшении будет атака).
+можно сделать карту путей из стоп-точек, но такой бот все-равно не будет способен переходить по локациям и собирать лут, кроме золота, если конечно не использовать запись в память
 
Автор
B

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
 
Автор
B

Belfigor

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

lirikmel

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

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'ов...
 
Автор
B

Belfigor

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

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

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

qqww22

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

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:
 
Верх