Что нового

[Легенда наследие драконов]Как получить точное количество хп в браузерной игре?

mysres

Новичок
Сообщения
6
Репутация
0
Добрый день, есть игра http://w1.dwar.ru , написал простенького бота, но при проверке количества жизни в бою (пробовал "PixelSearch" и "ImageSearch") часто сбивается, пришла в голову идея получить данные из флеш, но как это сделать ума не приложу.:stars: Заранее спасибо за любую помощь и подсказки.
98a09195f7a9.jpg
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Как получить данные из flash?

Шейд у PixelSearch ставь больше. В память лезть к флеш играм бесполезно. Можешь научиься перехватывать пакеты, но для флеш игр оно того не стоит.


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

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Как получить данные из flash?" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 
Автор
M

mysres

Новичок
Сообщения
6
Репутация
0
Re: Как получить точное количество хп в браузерной игре "Легенда наследие драконов"?

Belfigor [?]
Можешь научиься перехватывать пакеты

Пробовал через Сharles отловить запросы, но к сожалению во время боя перехватить ничего не удалось, возвращается только конец боя (победа - поражение).
 

teges

Знающий
Сообщения
18
Репутация
16
Можно отвечу? :smile: почему в память к флеш нельзя лезть? По сути это скрипт со своими тегами, значениями и тп. Только тут нет фиксированного место под значения.

Мое решение:

Берем dll из http://autoit-script.ru/index.php/topic,8421.0.html или пишем свою на поиск строки в памяти, прикручиваем ее к скрипту, задаем значение для поиска (в случае легенды это "&hp="), выполняем поиск до 1 значения, читаем значение памяти от знака "=" до & или сразу читаем строкой, а потом работаем с ней. В итоге у нас значение здоровья.

Например:
Код:
#include <_NomadMemory.au3>

Global Const $MEM_ASCII   = 0x08
Global Const $MEM_UNICODE = 0x09

;~ Local $sProcess = "opera.exe"
Local $sProcess = "IEXPLORE.EXE"
Local $sDll  	= "Memory.dll"

Local $iID = ProcessExists($sProcess)
If (Not $iID) Then Exit ; Процесс не найден

_SetPrivilege("SeDebugPrivilege", 1)

Local $hProc = _MemoryOpen($iID)
Local $hWnd  = _ProcessGetWindow($iID)

Local $sStr 		= "&hp="	;искомая строка
Local $sDelim		= "&"		;разделитель

Local $iTimer 	= TimerInit()
Local $sRes 	= _GetString($sDll, $hWnd, $hProc, $sStr, $sDelim)
ConsoleWrite(TimerDiff($iTimer)&@CRLF)

ConsoleWrite($sStr&$sRes&@CRLF) ;строка=

_MemoryClose($hProc)

;~ Чтение значения с использованием поиска
;==================================================================================
Func _GetString($sDll, $hWnd, $hProc, $sStr, $sDelim = "")

;~ 	Local $iStrLen 	= StringLen($sStr)		;Opera
	Local $iStrLen 	= StringLen($sStr)*2	;IE


	Local $aRes = _ScanMemory($sDll, $hWnd, $sStr, $MEM_UNICODE) 	;IE
;~ 	Local $aRes = _ScanMemory($sDll, $hWnd, $sStr, $MEM_ASCII)		;Opera
	If ($aRes[1] = 0x00000000) Then Return 0 ;не найдено

	Local $sRes, $sString
	If $sDelim Then
		Local $i
		Do
			$sString 	&= $sRes ; все равно значение еще не задано
			$sRes 		=  _MemoryRead($aRes[1]+$iStrLen+$i, $hProc, 'char[1]')
			$i +=1
		Until $sRes = $sDelim
	Else
		$sString =  _MemoryRead($aRes[1], $hProc, 'char['&$iStrLen&']') ; Только по 1 адресу. Уточнять в CE(или править функцию поиска)
	EndIf

	Return $sString
EndFunc

;~  Получение данных окна приложения
;==================================================================================
Func _ProcessGetWindow($iPID, $iRet=1)
    Local $aWinList = WinList()
    Local $aRet[2]
    If IsString($iPID) Then $iPID = ProcessExists($iPID)
    For $i = 1 To UBound($aWinList)-1
        If WinGetProcess($aWinList[$i][1]) = $iPID Then
            $aRet[0] = $aWinList[$i][0] ;Title
            $aRet[1] = $aWinList[$i][1] ;WinHandle
            If $iRet = 0 Then Return $aRet[0]
            If $iRet = 1 Then Return $aRet[1]
            Return $aRet
        EndIf
    Next
    Return SetError(1, 0, $aRet)
EndFunc

;~  Сканирование памяти
;==================================================================================
Func _ScanMemory($sDll, $hWnd, $sStr, $iMode, $iMinAddr = 0, $iMaxAddr = 0x7FFFFFFF)

	$hDll = DllOpen($sDll)

	Dim $aArray[2]

	Local $aRes = DllCall($hDll, 'str', 'ScanMemory', 'hwnd', $hWnd, 'str', $sStr, 'int', $iMode, 'int', $iMinAddr, 'int', $iMaxAddr)
	If Not IsArray($aRes) Then Return 0 ;Ошибка при открытии DLL

	Local $aSplit = StringSplit($aRes[0], "|")

	$aArray[0] = $aSplit[0]

	For $i = 1 To $aSplit[0]
        ReDim $aArray[$aArray[0] + 1]
	    $aArray[$i] = '0x' & Hex($aSplit[$i], 8)
	Next

	DllClose($hDll)

	Return $aArray
EndFunc


Сам пользуюсь немного другой функцией. Понимаю, долго, но всегда стараюсь избавиться от пиксельного поиска, если есть альтернативный способ, кроме того нужная строка обычно содержит всю необходимую информацию
Чуть не забыл - функция поиска не доработана (не было времени)
 

bistriy

Новичок
Сообщения
22
Репутация
0
Автор, помогите найти Memory.dll , в той теме нет.
 
Верх