Что нового

ASMinject. Помогите разобраться как работает библиотека .

Disketka

Знающий
Сообщения
8
Репутация
6
Доброго времени суток .
Бороздя по просторам гугля и не найдя нужных результатов решил обратиться за помощью.
Разыскиваю либо гид либо готовую библиотеку которая поможет решить мне небольшую задачку в решении которой в данный момент я нахожусь в тупике .
А именно я разыскиваю способ как средствами AutoIt осуществить запись асемблеровского кода в заданный процесс. либо как осуществить вызов функций клиента ММОРПГ игры. Предположим что у нас уже имеется код ассемблера похожий на вот этот

Код:
004619D6  |.  81C1 EC000000 ADD ECX,0EC                              ; |
004619DC  |.  E8 8F501A00   CALL elementc.00606A70
который вызывает определённую функцию в клиенте
Каким образом осуществить вызов данной функции с помощью AutoIt ?

Заранее благодарен за любую помощь.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Re: Поиск гайда или готовой библиотеки .

Присоединяюсь :scratch:
 
Автор
D

Disketka

Знающий
Сообщения
8
Репутация
6
Re: Поиск гайда или готовой библиотеки .

Библиотеку нашол .....осталось теперь разобраться как работает.
 

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Хм...очень интересно, может вызывается адресс "004619DC" по которому находится функция, но пока в ASMInjection.au3 ничего не нашёл подходящего
 

nonenicks

Новичок
Сообщения
18
Репутация
3
http://www.wasm.ru/series.php?sid=17

А так вам надо из клиента вызвать эту функцию, иначе стек проца нагнется и врятле потом программа будет работать коректно.
Есть тема http://autoit-script.ru/index.php/topic,5864.0.html
Мысль там вроде как верная - запустить еще один поток в клиенте и уже там крутить ваш код.

Если по существу то вам надо изменить значение регистра EIP - он указывает где следующая команда для выполнения, повторю это может привести к ппцу стека процессора
 
Автор
D

Disketka

Знающий
Сообщения
8
Репутация
6
Есть тема [Процессы] Ввод данных в процесс PerfectWorld
Да я видел данную тему . но там автор темы пытается разобрать мне кажется тотже самый вопрос ...в оригинальной теме из которой он приводит пример вызов функции процесса написан на Delphi .

Библиотека ASMinjection и есть ответ на ево и мой вопрос ....только вот моя проблемка в том что я только начинающий "манипулятьр процессов" и поэтому я какбы толком не пойму что нужно вызвать и в какой последовательности чтобы записать мой код в процесс . В самой библиотеке не приведено комментариев в чём её огромный минус .
 
Автор
D

Disketka

Знающий
Сообщения
8
Репутация
6
Доброго времени суток. После многократных безуспешных поисков и попыток разобраться как работает библиотека ASMinjrction так как её большой минус в том что для начинающего в манипуляции процессами она оказалась сложноватой и в самой библиотеке отсутствуют комментарии и описание параметров.
Я всётаки наткнулся на один пример (найденный в интернете) поэтому хочю поделиться этим примером .
По сути данная библиотека не является чемто новым только что открытым но позволю себе заметить что она может быть очень полезна на этом самом форуме и именно в разделе разработок ботов .
Так как перепотрошив много тем размещённых в этом параграфе я ненашол ничего более подходящего что могло бы помочь мне реализации бота методами AutoIt который сможет работать на неактивное окно "атакуемого клиента" или даже на несколько окон одного клиента.
Конечноже для реализации и использования данной библиотеки нужны некоторые знания асемблера.
(Гайды по использованию олидебагера можно найти в интернете )

Вот и сам пример использования библиотеки на примере Toxic-Fog-Trainera :
Код:
#include "ASM.au3"
#include "NomadMemory.au3"

; Address obtained from cheat engine
Global Const $X_COORDINATE_ADDRESS = 0x005DAE2C
Global Const $Y_COORDINATE_ADDRESS = 0x005DAE30

; Skill IDs
Global Const $TOXIC_FOG = 0x1771
Global Const $SCATTER   = 0x1F41

; Action IDs
Global Const $SIT = 0xFA

Global $PID, $MemID

; Find the first running conquer process
$PID = ProcessExists("Conquer.exe")
If $PID == 0 Then
	MsgBox(0, "Error", "Conquer must be running first.")
	Exit
EndIf
$MemID = _MemoryOpen($PID)

; Read current map coordinates
$x = _MemoryRead($X_COORDINATE_ADDRESS, $MemID)
$y = _MemoryRead($Y_COORDINATE_ADDRESS, $MemID)

; Add some offset for the spot to cast Toxit Fog
$castX = $x + 4
$castY = $y + 4

; Add some for jumping
$jump1X = $x
$jump1Y = $y
$jump2X = $x + 2
$jump2Y = $y

HotKeySet("!1", "ExitProg")

While 1
	ToolTip("Running. Alt+1 to exit. Cast coords (" & $x & "," & $y & ")" , 20, 20)
	PerformSkill($TOXIC_FOG, $castX, $castY)
	Sleep(700)
	PerformAction($SIT)
	Sleep(6000)
	PerformJump($jump1X, $jump1Y)
	$tmp = $jump1X
	$jump1X = $jump2X
	$jump2X = $tmp
	$tmp = $jump1Y
	$jump1Y = $jump2Y
	$jump2Y = $tmp
	Sleep(700)
WEnd

Func PerformSkill($SkillID, $x, $y)
	Pushad()
	Push_DWORD($y)
	Push_DWORD($x)
	Push_DWORD($SkillID)
	Mov_ECX(0x5DABB8)
	Mov_EAX(0x4EA8DB)
	Call_EAX()
	Popad()
	Ret()
	Return RunAsm($PID)
EndFunc

Func PerformAction($ActionID)
	Pushad()
	Push_DWORD(0)
	Push_DWORD(0)
	Push_DWORD($ActionID)
	Mov_ECX(0x5DABB8)
	Mov_EAX(0x4C78FF)
	Call_EAX()	
	Popad()
	Ret()
	Return RunAsm($PID)
EndFunc

Func PerformJump($x, $y)
	Pushad()
	Push_DWORD($y)
	Push_DWORD($x)
	Mov_ECX(0x5DABB8)
	Mov_EAX(0x4C5F99)
	Call_EAX()	
	Popad()
	Ret()
	Return RunAsm($PID)
EndFunc

Func ExitProg()
	_MemoryClose($MemID)
	Exit(0)
EndFunc

ToxicFogTrainer+source
 

anonymous7

Знающий
Сообщения
40
Репутация
8
Ещё бы описание всех команд, которые использовались. :scratch:
 
Автор
D

Disketka

Знающий
Сообщения
8
Репутация
6
Описание каких комманд именно вас интересует ? Комманд AutoIt или комманд Ассемблера которые были использованны именно в данном примере ?

Если вы о коммандах ассемблера то сразу отмечю что сто процентное знание ассемблера это высший пилотаж програмирования а так как мой уровень програмиста соответствует моему статусу здесь на форуме ( Новичёк ) то естественно точного описания я вам дать несмогу . Но если предположительно рассмотреть :

На примере функции PerformSkill заданной в самом тренере то похоже что

Pushad() ; записывает в регистр общие значения
Push_DWORD($y) ; записывает в регистр значение адреса
Push_DWORD($x) ; записывает в регистр значение адреса
Push_DWORD($SkillID) ; записывает в регистр значение адреса
Mov_ECX(0x5DABB8) ; регистр ECX содержит указатель на переменную
Mov_EAX(0x4C78FF) ;EAX содержит возращенное значение
Call_EAX() ; похоже что вызывает функцию
Popad() ; восстанавливает регистры после вызова функции
Ret() ; возврат управления из процедуры вызывающей программе


Это только мои предположения .
 
Верх