Что нового

Работа с Cheat Engine, Olly поиск offsets

rybik

Новичок
Сообщения
83
Репутация
0
Всем привет. Я пишу ботов для MMORPG Guild Wars. Занимаюсь этим год - полтора. Все это не слишком сложно, потому что существует такой скрипт как GWA2.au3, данный скрипт был написан не мной, он находится в публичном доступе, каждый может его скачать и заниматься бытописанием для Guild Wars. В данном скрипте прописаны многие пути расположения тех или иных значений, такие как количество здоровья, координаты персонажа, место нахождение и тд, все это можно определить используя ту или иную функцию. Но увы всех функций не достаточно что бы писать новых ботов. Ниже приведу пример, нескольких функций.

Код:
; Пример первой функции
Func GetPartySize()
   Local $lOffset[5] = [0, 0x18, 0x4C, 0x64, 0x24]
   Local $lPartyPtr = MemoryReadPtr($mBasePointer, $lOffset)
   Local $lReturn = MemoryRead($lPartyPtr[0], 'long') ; henchmen   
   Return $lReturn
EndFunc   ;==>GetPartySize

; Пример первой 2 функции
Func GetMissionStartDelay()
	Local $lOffset = [0, 0x18, 0x44, 0x9C, 0]
	Return MemoryReadPtr($mBasePointer, $lOffset)[1]
EndFunc


Первая функция определяет количество персонажей в команде. Второй определяет статус команды (лидер команды, начата ли миссия и тд.)
Ниже MemoryReadPtr и MemoryRead.

Код:
;~ Description: Internal use only.
Func MemoryReadPtr($aAddress, $aOffset, $aType = 'dword')
	Local $lPointerCount = UBound($aOffset) - 2
	Local $lBuffer = DllStructCreate('dword')

	For $i = 0 To $lPointerCount
		$aAddress += $aOffset[$i]
		DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '')
		$aAddress = DllStructGetData($lBuffer, 1)
		If $aAddress == 0 Then
			Local $lData[2] = [0, 0]
			Return $lData
		EndIf
	Next

	$aAddress += $aOffset[$lPointerCount + 1]
	$lBuffer = DllStructCreate($aType)
	DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '')
	Local $lData[2] = [$aAddress, DllStructGetData($lBuffer, 1)]
	Return $lData
EndFunc   ;==>MemoryReadPtr

;~ Description: Internal use only.
Func MemoryRead($aAddress, $aType = 'dword')
	Local $lBuffer = DllStructCreate($aType)
	DllCall($mKernelHandle, 'int', 'ReadProcessMemory', 'int', $mGWProcHandle, 'int', $aAddress, 'ptr', DllStructGetPtr($lBuffer), 'int', DllStructGetSize($lBuffer), 'int', '')
	Return DllStructGetData($lBuffer, 1)
EndFunc   ;==>MemoryRead


Соответственно вопрос таков. Как я могу найти такие значения как $lOffset[5] = [0, 0x18, 0x4C, 0x64, 0x24] (первый пример) и $lOffset = [0, 0x18, 0x44, 0x9C, 0] (второе значение)???
Эти значения уже найдены, но я хочу их найти самостоятельно, что бы потом я так же смог найти другие, которые отсутствуют в скрипте. Я понимаю что для это мне нужно использовать OllyDbg или Cheat Engine. Так же у меня есть инструмент для получения отправленных и полученных пакетов из сервера до шифрования. Фото ниже.

di-N865.png

То есть это ряд мне выдает программа, которая получила пакет от сервера. Вторая функция GetMissionStartDelay() возвращает тоже значение. 0x100 Integer => .....
Я попытался сравнить $lOffset и hex ряд на фото, к сожаления сходств я не нашел. Пытался найти этот hex ряд с помощью OllyDgb и тоже без результатной. Буду рад получить любые советы для решения данного вопроса.
И да, сам GWA2.au3 выложу ниже.
 

Вложения

  • GWA2.au3
    177.7 КБ · Просмотры: 3
Автор
R

rybik

Новичок
Сообщения
83
Репутация
0
Re: Поиск и написание новых функций, по примеру существующих в рабочем боте

sngr сказал(а):
К сожалению в данной теме картинки уже не отображаются, проблематично понять о чем идет речь.


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

В общем изучив просторы интернета, нашел как можно проверить готовый $lOffset. Оказалось довольно просто. Это можно сделать при помощи Cheat Engine. Нажать на кнопку Add Address Manually. Снизу надо ввести базовый адрес в моем случае это A2AF68. Затем при помощи кнопку Add Offset добавить уже готовый offset 0, 0x18, 0x44, 0x9C, 0, который я выложил в персом посте.



Оффсет возвращает значение от 0 до 30000 после нажатия на кнопку "Вступить в бой", затем приходит пакет от сервера, пакет присылает оставшееся время до начала миссии. Все работает. Теперь остается выяснить каким образом был найден данный оффсет.
1. Нажимаю кнопку вступить в бой.
2. Вижу на таймере 28 секунд, значит в строке поиска Cheat Engine ввожу значение 28000. Появилось несколько адресов.



3. Снова нажимаю на кнопку "Вступить в бой" на этот раз пришло время до начала мисси было 15 секунд, соответственно равно 15000. Видим что по адресу 11E6F010 значение изменилось на 15000. Это то что нужно, перепроверил несколько раз, значение меняется относительно таймера.



4. Двойным нажатием ЛКМ добавляю адрес 11E6F010 в нижнее окно.



5. ПКМ по 11E6F010 ---> Find out what writes to this address. Затем опять нажимаю на кнопку "вступить в бой" и в окне The Following opcodes write to 11E6F010 появляется инструкция. ПКМ по инструкции ---> More info. Открывается новое окно Extra Info. Cheat Engine говорит что возможно значение можно найти по адресу 11E6F010.



6. Далее пытаюсь найти значение по адресу, но без результатно. Как можно найти куда передвигается mov [esi], dl?



7. Если разобраться, то значение таймера приходит на 11E6F010, а готовый offset получает значение от 1A16E7E8 (последнее смещение). То есть последнее смещение выглядит следующим образом 1A16E7E8+0 = 1A16E7E8. Предпоследнее смещение выглядит так: [1A16E74C+9С] = 1A16E7E8(См. 1 картинка).

Кто может объяснить как происходит перемещение от 1A16E7E8 до 11E6F010?
 
Верх