Что нового

Работа с памятью процесса

ergo

Новичок
Собственно я занимаются этим делом не давно, но уже пришел к выводу, что если хочется написать что, то более разумное, чем клик в пиксель нужно лезть в память процесса. Мой вопрос такой – как с конкретного процесса по заданному адресу ячейки памяти выудить ее содержимое по средствам Autoit, По возможности выложите простой пример. К примеру можно взять процесс любой популярной ММО Eve либо WoW либо вообще notepad...
 

Belfigor

Модератор
Локальный модератор
В еве подключение к памяти процесса затруднительно и немедленно наказуемо. Вот пример для AO сделанный на основе WoW.
Код:
#include <nomadmemory.au3>
#include <GUIConstantsEx.au3> 
#Include <Timers.au3> 
 
 $AllodsProcessName = "MMO A1"

$ProcessID = WinGetProcess($AllodsProcessName,"")
SetPrivilege("SeDebugPrivilege", 1)
If $ProcessID = -1 Then
	MsgBox(4096, "ERROR", "Failed to detect MMO A1 running.")
	Exit
EndIf


$DllInformation = _MemoryOpen($ProcessID)
		If @Error Then
			MsgBox(4096, "ERROR", "Failed to open memory.")
			Exit
		EndIf
		
		
$BotVersion = "0.04" 
Global  $GUITitle = "AO Bot v" & $BotVersion 
Global  $win_main, $mem_label1, $mem_label2 ,$mem_label1_1, $mem_label2_1
 
$i = "1" 
TestGUI() 
 
Func TestGUI() 
    $win_main = GUICreate($GUITitle, 200, 200, -1, -1) 

	$mem_label2_1 = GUICtrlCreateLabel('HP:', 15, 25, 150, 20) 
	$mem_label2 = GUICtrlCreateLabel('11', 40, 25, 150, 20)
	
	$mem_label1_1 = GUICtrlCreateLabel('EN:', 15, 50, 150, 20) 
	$mem_label1 = GUICtrlCreateLabel('11', 40, 50, 150, 20) 
    GUISetState(@SW_SHOW) 
 
    _Timer_SetTimer($win_main, 500, '_Update_mem') 
 
	While 1 
        $msg = GUIGetMsg() 
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop 
    WEnd 
 
    GUIDelete() 
EndFunc 
 
Func _Update_mem($hWnd, $Msg, $iIDTimer, $dwTime) 
_CurrentEN()
_CurrentHP()

GUICtrlSetData($mem_label1, StringFormat($ENdec)) 
GUICtrlSetData($mem_label2, StringFormat($HPdec))
EndFunc

Func  _CurrentEN()
	$CurrentEN = (_MemoryRead(0x08747DEC, $DllInformation, 'ptr'))
	If @Error Then
		MsgBox(4096, "ERROR", "Failed to read memory.")
		Exit
	EndIf
	Global $ENdec = dec(StringTrimLeft($CurrentEN, 2))
EndFunc

Func _CurrentHP()
	$CurrentHP = (_MemoryRead(0x08747DE8, $DllInformation, 'ptr'))
	If @Error Then
		MsgBox(4096, "ERROR", "Failed to read memory.")
		Exit
	EndIf
	Global $HPdec = dec(StringTrimLeft($CurrentHP, 2))
EndFunc
 

El Panda

Продвинутый
Работа с памятью всегда черевата различными сложностями, не стоит забывать, что в случае с онлайн играми кроме клиента имеется сервер :-X
 

Archy26

EVE DEVE eve bot development group
Белфигор и Панда +1

Возьмём к примеру EVE. Подключение к памяти процесса в ней наказуемо немедленным крашем клиента. И, хотя и не немедленным, но неотвратимо последующим баном, если в этот момент был загружен оплаченый аккаунт.

В следствие этого, мы с Белфигором, потратив большое количество времени на тесты, пришли к выводу что в еве выгоднее: либо взламывать клиент по настоящему (а кто такое умеет, ботов для игрушек не пишет :smile: ), либо сразу писать OCR-бота.

Ну и ДА! Есть ещё сервер, который регистрирует правильность запросов и ответов, правильность шифрования, и даже правильную последовательность пакетов, и т.д.

Вот и причина, почему именно OCR-бот, а не что-то умнее.

P.S.: Для тех, кто считает себя умнее других, предлагаю, средствами автоита написать снифер памяти клиента EVE-онлайн, который будет стабильно распознавать хотя бы состояние локала. Сколько там плюсов, сколько там минусов, и сколько там в целом народу.
Сделавшему это публично вынесу поздравления.
 

Belfigor

Модератор
Локальный модератор
Суть не в этом, есть ряд людей котрые больше 4-х лет пытаются взломать пакеты евы, но без особых успехов. Но например на AutoIt был написан снифер пакетов WoW
 

Archy26

EVE DEVE eve bot development group
Belfigor сказал(а):
Суть не в этом, есть ряд людей котрые больше 4-х лет пытаются взломать пакеты евы, но без особых успехов. Но например на AutoIt был написан снифер пакетов WoW
А зачем ты мне про колбасу, когда я про корову??? :smile:
Я ведь говорю конкретно про EVE-online
 

serivanov

Новичок
Belfigor сказал(а):
В еве подключение к памяти процесса затруднительно и немедленно наказуемо. Вот пример для AO сделанный на основе WoW.
Что делает данный скрипт в WoW?
В Perfect World вроде как нет нормальной защитой от этого (пока).
Интересует, как подключиться к процессу, отвечающему за движение персонажа, чтоб передвигаться не эмулируя клики мышкой, а посылая значения координат в память клиента.
 

Belfigor

Модератор
Локальный модератор
в WoW этот скрипт ищет указанные ячейки памяти и тягает из них данные чтобы отобразить в своей форме.
чтобы подключиться к "процессу, отвечающему за движение персонажа" надо сперва хотябы погуглить чтобы иметь представление о том куда лезть пытаешься
 

killbond

Осваивающий
выудить ее содержимое по средствам Autoit
Как выудить разобрались...
А как узнать что мы ищем? :smile: В смысле, например, в игре по какой-то локации бродят мобы, как узнать их координаты, и вообще, как все это ищется? Неужели ArtMoney или Cheat Engine? И потом, как посредством памяти выполнять определенные действия чаром? Для этого нужен, наверное, дебаггер и знание Assembler? Предположим, это есть и что вот так скролить тысячи строчек кода в поисках нужной?
 

Belfigor

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

killbond

Осваивающий
ищешь где в памяти хранится инфа относительно ротиции
А вот про это место можно поподробнее? Чем искать? (нее, я то знаю - Cheat Engine или ArtMoney, но хотелось бы знать, чем настоящие профи пользуются :smile:) Что значит ротация? или "ротиция"? (я так понял, кусок памяти, где сгруппированы значения для одного класса)
 

Belfigor

Модератор
Локальный модератор
Я пробовал аллоды и искал с помощью Детектив стори искал обычными методами, подвигался - посмотрел что изменилось, не подвигался, отсек все ячейки что за время неподвижного состояние притерпели изменения, снова подвигался, снова посмотрел что изменилось, подвигался по плоскости, посмотрел что изменилось и тд и тп. Но координаты найти не так уж просто и найти на них оффсеты мне так и не удалось, с хп, мп и тд и тп проще, ищится за 3-4 проверки. Ротация - от слова Rotation, в данном контексте - угол поворота
 

maddoc

Новичок
Archy26 сказал(а):
Белфигор и Панда +1

Возьмём к примеру EVE. Подключение к памяти процесса в ней наказуемо немедленным крашем клиента. И, хотя и не немедленным, но неотвратимо последующим баном, если в этот момент был загружен оплаченый аккаунт.

В следствие этого, мы с Белфигором, потратив большое количество времени на тесты, пришли к выводу что в еве выгоднее: либо взламывать клиент по настоящему (а кто такое умеет, ботов для игрушек не пишет :smile: ), либо сразу писать OCR-бота.

Ну и ДА! Есть ещё сервер, который регистрирует правильность запросов и ответов, правильность шифрования, и даже правильную последовательность пакетов, и т.д.

Вот и причина, почему именно OCR-бот, а не что-то умнее.

P.S.: Для тех, кто считает себя умнее других, предлагаю, средствами автоита написать снифер памяти клиента EVE-онлайн, который будет стабильно распознавать хотя бы состояние локала. Сколько там плюсов, сколько там минусов, и сколько там в целом народу.
Сделавшему это публично вынесу поздравления.
Что прям так тупа ничего нельзя читать из памяти? Непойму, куча программ читает память (атнивирусы, и прочая лабуда) без каких либо последствий. В чем еве особенный? В конечном итоге каким тех образом они могут отследить что я читаю память ?
 

Belfigor

Модератор
Локальный модератор
структура хранения инфы в еве не позволяет читать. Поставь и попробуй. мб с доминионом что изменилось
 

JimmyN

Новичок
можешь для ВоВ скрипт сниффера выложить, буду очень признателен)
 

lirikmel

Продвинутый
вот неужели так трудно тему ниже почитать ....где все разжеванно и с картинками
что касается сниффера вот-
Allows very simply from an Autoit script to access the main functionalities offered by the WinPcap driver: capture, filter, save/read and send data packets on a network interface.
 

JimmyN

Новичок
Вопрос был глупым) Написал не разобравшись бывает, теперь по существу, как получить числовое значение я понял а как быть с текстом, если он русский и в кодировке UNICOD? Адрес в ячейке я нашел с помощью артмани вроде бы тот. Но вот как при обращении к нему получить текст а не набор циферок?
 
Верх