Что нового

Бот, работающий с памятью игры

Ilyialat

Новичок
Сообщения
54
Репутация
2
Всем привет =)
Я добился неплохих результатов в пиксельных ботах, которые имитируют нажатия...
Но недавно наткнулся на очень классный бот, написанный на AutoIt... 5000 строк кода...
Работает без всяких там пикселей и нажатий. Ради интереса я решил посмотреть исходники, но ничерта не понял... И появилась у меня мысль - попробовать создать что-то подобное, но.... У меня очень мало знаний, максимум, что я делал с памятью игры, так это нашёл оффсет хп цели в линейке... Кто шарит в памяти, помогите, пожалуйста! Киньте ссылку хоть, я не знаю с чего начать...
 

scanfail

Знающий
Сообщения
244
Репутация
17
Тоже когда-то знаний было очень мало, но к счастью, сейчас довел свои знания до хорошего уровня в работе с автоит и памятью. Советую научиться работать с Pointer Scan-ом в Cheat Engine, ибо знание работы с ним очень сильно тебе поможет и облегчит твое дело. Сначала можно просто начать с автопот ботом, чтобы пил банки ХП и МП(и т.д.), если ХП\МП чара ниже ...%.
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Это у меня получилось уже =)


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

Кажется мне, вызов функций игры через память связан с ассемблером... Что бы найти функцию саму, надо юзать дизасемблер, но он для меня, как Эверест :D
 

scanfail

Знающий
Сообщения
244
Репутация
17
Так... Я не совсем понял, что именно тебе нужно? Запись в память игры какого нибудь значения?(читтинг?)
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Мне нужно как-то через память управлять игрой.. Ты нажимаешь W, выполняется функция и игрок идет вперед. В исходнике эта функция найдена и используется, и эмулировать W не надо, как-то так =)
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Можно...)
Пока что мыло [email protected], ок?)


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

Но этот бот пакетов не использует)
Пакеты вещь ужасная, эти ключи, эта криптография...
 

scanfail

Знающий
Сообщения
244
Репутация
17
Пролистав код, таки нашел пакеты в коде, вот например функция "sellItem":
Код:
Func sellItem($itemTypeId,$invIndex,$amount)
	;Sell $amount of items of type itemTypeId, located at invIndex
	;This function could be expanded to include selling multiple items
	;simultaneously. This would require setting nBytes equal to 
	;4 + 12 * nDifferent items. Add the extra items on the same way
	;as the first item.
	local $packet, $packetSize

	$packet = '2500'
	$packet &= '02000000'
	$packet &= '10000000' ;nBytes following
	$packet &= '01000000' ;nDifferent items being sold
	$packet &= _hex($itemTypeId)
	$packet &= _hex($invIndex)
	$packet &= _hex($amount)

	$packetSize = 26
	
	sendPacket($packet, $packetSize, $PROCESS_ID)
EndFunc

Говорю же, без пакетов тут не обошлось :D
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Код:
Func sendPacket($packet, $packetSize, $PROCESS_ID)
	;Declare local variables
	Local $pRemoteThread, $vBuffer, $loop, $result, $OPcode, $processHandle, $packetAddress
	
	;Open process for given processId
	$processHandle = $PROCESS_INFORMATION[1]
	
	;Allocate memory for the OpCode and retrieve address for this
	$functionAddress = DllCall($KERNEL32, 'int', 'VirtualAllocEx', 'int', $processHandle, 'ptr', 0, 'int', 0x46, 'int', 0x1000, 'int', 0x40)
	
	;Allocate memory for the packet to be sent and retrieve the address for this
	$packetAddress = DllCall($KERNEL32, 'int', 'VirtualAllocEx', 'int', $processHandle, 'ptr', 0, 'int', $packetSize, 'int', 0x1000, 'int', 0x40)
	
	;Construct the OpCode for calling the 'SendPacket' function
	$OPcode &= '60'								;PUSHAD
	$OPcode &= 'B8'&_hex($SENDPACKETADDRESS)	;MOV	 EAX, sendPacketAddress
	$OPcode &= '8B0D'&_hex($REALBASEADDRESS)	;MOV     ECX, DWORD PTR [revBaseAddress]
	$OPcode &= '8B4920'							;MOV     ECX, DWORD PTR [ECX+20]
	$OPcode &= 'BF'&_hex($packetAddress[0])		;MOV     EDI, packetAddress	//src pointer
	$OPcode &= '6A'&_hex($packetSize,2)			;PUSH    packetSize		//size
	$OPcode &= '57'								;PUSH    EDI
	$OPcode &= 'FFD0'							;CALL    EAX
	$OPcode &= '61'								;POPAD
	$OPcode &= 'C3'								;RET		
	
	;Put the OpCode into a struct for later memory writing
	$vBuffer = DllStructCreate('byte[' & StringLen($OPcode) / 2 & ']')
	For $loop = 1 To DllStructGetSize($vBuffer)
		DllStructSetData($vBuffer, 1, Dec(StringMid($OPcode, ($loop - 1) * 2 + 1, 2)), $loop)
	Next
	
	;Write the OpCode to previously allocated memory
	DllCall($KERNEL32, 'int', 'WriteProcessMemory', 'int', $processHandle, 'int', $functionAddress[0], 'int', DllStructGetPtr($vBuffer), 'int', DllStructGetSize($vBuffer), 'int', 0)
		
	;Put the packet into a struct for later memory writing
	$vBuffer = DllStructCreate('byte[' & StringLen($packet) / 2 & ']')
	For $loop = 1 To DllStructGetSize($vBuffer)
		DllStructSetData($vBuffer, 1, Dec(StringMid($packet, ($loop - 1) * 2 + 1, 2)), $loop)
	Next
	
	;Write the packet to previously allocated memory
	DllCall($KERNEL32, 'int', 'WriteProcessMemory', 'int', $processHandle, 'int', $packetAddress[0], 'int', DllStructGetPtr($vBuffer), 'int', DllStructGetSize($vBuffer), 'int', 0)
		
	;Create a remote thread in order to run the OpCode
	$hRemoteThread = DllCall($KERNEL32, 'int', 'CreateRemoteThread', 'int', $processHandle, 'int', 0, 'int', 0, 'int', $functionAddress[0], 'ptr', 0, 'int', 0, 'int', 0)
	
	;Wait for the remote thread to finish
	Do
		$result = DllCall('kernel32.dll', 'int', 'WaitForSingleObject', 'int', $hRemoteThread[0], 'int', 50)
	Until $result[0] <> 258
	
	;Close the handle to the previously created remote thread
	DllCall($KERNEL32, 'int', 'CloseHandle', 'int', $hRemoteThread[0])
	
	;Free the previously allocated memory
	DllCall($KERNEL32, 'ptr', 'VirtualFreeEx', 'hwnd', $processHandle, 'int', $functionAddress[0], 'int', 0, 'int', 0x8000)
	DllCall($KERNEL32, 'ptr', 'VirtualFreeEx', 'hwnd', $processHandle, 'int', $packetAddress[0], 'int', 0, 'int', 0x8000)
	
	;Close the Process
	;memclose($processHandle)
	
	Return True
EndFunc		;==>
Тут работа с памятью, я тоже это видел, и тоже сначала подумал, что пакеты =)
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Нашёл топик) Мне нужно учить инжект =)
 
Верх