 |
Использование функций автопилота. - Разработка ПО для Perfect World - Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World |
27.04.2012, 22:06
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Использование функций автопилота.
Решил вот поделиться с сообществом функциями управления игровым автопилотом.
Он, к сожалению, не настолько хорош как в JD или FW, но тем не менее мне нравится его использовать вместо стандартной функции движения.
Для начала определим необходимые константы :
Код:
Const
PW_BASE_ADDRESS = $00A571E0;
PW_DYNAMIC_BASE_OFFSET = $001c; // [base] + 1c = CECGameRun
PW_ROLE_BASE_OFFSET = $0034; // [base] + 1c + 34
AutoRouteAddr = $00478ED0; //$004551D0; //$00452B60;
и напишем функцию, которую будем инжектить :
Код:
procedure AutoRouteCall(cmd : Pointer); stdcall;
var
addr: Pointer;
begin
addr := Pointer(AutoRouteAddr);
asm
pushad
mov eax, dword ptr [PW_BASE_ADDRESS]
mov eax, dword ptr [eax + PW_DYNAMIC_BASE_OFFSET]
mov ecx, dword ptr [eax + PW_ROLE_BASE_OFFSET]
push cmd
call addr
popad
end;
end;
Это - единственная точка входа для управления всем, что связано с автопилотом в игре.
Управление осуществляется передачей ей массива параметров :
Вот так, для того, чтобы начать движение к точке с координатами (x, y) :
Код:
procedure AutoRouteStart(x, y : integer);
var
buf : array[0..6] of integer;
begin
buf[0] := 330;
buf[1] := 0;
buf[2] := 0;
buf[3] := 0; // Команда на взлёт
buf[4] := x;
buf[5] := y;
buf[6] := 0;
InjectFunc(@AutoRouteCall, @buf, SizeOf(buf));
end;
Вот так, чтобы начать плавный подъём к указанной высоте :
Код:
procedure AutoRouteAltitude(z : integer);
var
buf : array[0..6] of integer;
begin
buf[0] := 330;
buf[1] := 0;
buf[2] := 0;
buf[3] := 1; // Команда сменить высоту
buf[4] := z;
buf[5] := 0; // Хз что, но может быть 0 или 1
buf[6] := 0;
InjectFunc(@AutoRouteCall, @buf, SizeOf(buf));
end;
И вот так, чтобы прекратить движение :
Код:
procedure AutoRouteStop();
var
buf : array[0..6] of integer;
begin
buf[0] := 330;
buf[1] := 0;
buf[2] := 0;
buf[3] := 2; // Команда стоп
buf[4] := 0; buf[5] := 0; buf[6] := 0;
InjectFunc(@AutoRouteCall, @buf, SizeOf(buf));
end;
Использовать это можно вот так :
Код:
AutoRouteStart(1350, 345);
AutoRouteAltitude(75);
Комментируем, задаём вопросы, ставим спасибы...
Последний раз редактировалось vogel; 28.04.2012 в 00:12.
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
28.04.2012, 18:41
|
#2
|
|
|
|
Разведчик
|
 Регистрация: 25.04.2011
 Сообщений: 19
 Популярность: 14
 Сказал(а) спасибо: 10
Поблагодарили 2 раз(а) в 2 сообщениях
|
Re: Использование функций автопилота.
|
|
|
28.04.2012, 21:46
|
#3
|
|
|
|
Разведчик
|
 Регистрация: 10.11.2010
 Сообщений: 4
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 16 раз(а) в 8 сообщениях
|
Re: Использование функций автопилота.
|
|
|
28.04.2012, 22:17
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 25.04.2011
 Сообщений: 19
 Популярность: 14
 Сказал(а) спасибо: 10
Поблагодарили 2 раз(а) в 2 сообщениях
|
Re: Использование функций автопилота.
|
|
|
28.04.2012, 22:39
|
#5
|
|
|
|
Фельдмаршал
|
 Регистрация: 13.08.2009
 Сообщений: 1,004
 Популярность: 25098
 Золото Zhyk.Ru: 350
 Сказал(а) спасибо: 111
Поблагодарили 830 раз(а) в 395 сообщениях
|
Re: Использование функций автопилота.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Код:
procedure AutoPathCall(aPParams:PParams); stdcall;
var
addr:pointer;
x,y:dword;
begin
x:=aPParams^.param1;
y:=aPParams^.Param2;
z:=aPParams^.Param3;
addr := Pointer($00438770);
asm
pushad
MOV EDI,y
MOV ESI,x
MOV EAX,DWORD PTR DS:[$9C0E6C] // base_addr
PUSH 0 // ; /Arg7 = 00000000
PUSH EDI // ; |Arg6
MOV ECX,DWORD PTR DS:[EAX+$1C] // ; |
PUSH ESI // ; |Arg5
PUSH 0 // ; |Arg4 = 00000000
PUSH 0 // ; |Arg3 = 00000000
PUSH 0 // ; |Arg2 = 00000000
PUSH $14A // ; |Arg1 = 0000014A
call addr // ; \elementc.00438770
MOV EDX,DWORD PTR DS:[$9C0E6C] //; elementc.009C14F8
XOR EAX,EAX
MOV AL,0
PUSH 0 //; /Arg7 = 00000000
MOV ECX,DWORD PTR DS:[EDX+$1C] //; |
MOV EDX,z //; |
PUSH EAX //; |Arg6 = 00000000
PUSH EDX //; |Arg5 = Высота полета
PUSH 1 //; |Arg4 = 00000001
PUSH 0 //; |Arg3 = 00000000
PUSH 0 //; |Arg2 = 00000000
PUSH $14A //; |Arg1 = 0000014A
CALL addr //; \elementc.00438770
popad
end;
end;
procedure AutoPath(realcoord_X,realcoord_Y,realcoord_Z:single);
begin
aParams.Param1:=round(realcoord_X);
aParams.Param2:=round(realcoord_Y);
aParams.Param3:=round(realcoord_Z); // высота полета
InjectFunc(aHandle,@AutoPathCall,@aParams,SizeOf(aParams));
end;
|
|
 |
|
 |
|
Молодец что поделился.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
29.04.2012, 14:05
|
#6
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Re: Использование функций автопилота.
|
|
|
30.04.2012, 14:44
|
#7
|
|
|
|
Разведчик
|
 Регистрация: 23.12.2011
 Сообщений: 42
 Популярность: 192
 Сказал(а) спасибо: 26
Поблагодарили 11 раз(а) в 9 сообщениях
|
Re: Использование функций автопилота.
хм... После инжекта он хрен пойми куда летит... Почему так?
Последний раз редактировалось samosi; 30.04.2012 в 15:40.
|
|
|
02.05.2012, 00:18
|
#8
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Re: Использование функций автопилота.
Он летит туда, куда посылаешь. Ровно в указанные координаты.
|
|
|
02.05.2012, 11:52
|
#9
|
|
|
|
Разведчик
|
 Регистрация: 23.12.2011
 Сообщений: 42
 Популярность: 192
 Сказал(а) спасибо: 26
Поблагодарили 11 раз(а) в 9 сообщениях
|
Re: Использование функций автопилота.
хм не могли бы вы дать мне код? Так как у меня он летит всегда в правый верхний угл за картой.
|
|
|
02.05.2012, 16:24
|
#10
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Re: Использование функций автопилота.
Просьба не путать - куда он летит и куда показывает пунктирная линия.
Летит он куда послал из функции AutoRouteStart(х. у);
А пунктирную линию рисует либо к предыдущей точке, куда ты летел вручную либо в правый верхний угол.
За корректную отрисовку отвечает другая (хз какая) функция - я её пока не нашёл.
|
|
|
Пользователь сказал cпасибо:
|
|
02.05.2012, 17:01
|
#11
|
|
|
|
Разведчик
|
 Регистрация: 23.12.2011
 Сообщений: 42
 Популярность: 192
 Сказал(а) спасибо: 26
Поблагодарили 11 раз(а) в 9 сообщениях
|
Re: Использование функций автопилота.
Спс все пашет. Но линию надо доделать.
P.S. Dinmaite твоя функу почему то не пашет...(Офсеты были поменяны.)
Последний раз редактировалось samosi; 02.05.2012 в 17:42.
|
|
|
02.05.2012, 17:39
|
#12
|
|
|
|
Сержант
|
 Регистрация: 11.12.2010
 Сообщений: 110
 Популярность: 541
 Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
|
Re: Использование функций автопилота.
samosi, он привёл старый пример со старыми оффсетами.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
|
|
|
06.05.2012, 22:34
|
#13
|
|
|
|
Разведчик
|
 Регистрация: 25.04.2011
 Сообщений: 19
 Популярность: 14
 Сказал(а) спасибо: 10
Поблагодарили 2 раз(а) в 2 сообщениях
|
Re: Использование функций автопилота.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
KlientWindow:HWND; //Handle клиента
ProcessId:Integer;
hProcess:Integer;
implementation
{$R *.dfm}
Const
PW_BASE_ADDRESS = $00A571E0;
PW_DYNAMIC_BASE_OFFSET = $001c; // [base] + 1c = CECGameRun
PW_ROLE_BASE_OFFSET = $0034; // [base] + 1c + 34
AutoRouteAddr = $00478ED0; //$004551D0; //$00452B60;
procedure TForm1.Button1Click(Sender: TObject);
begin
ProcessId:= FindWindow(nil, PChar('Perfect World')); //Находим Handle окна
GetWindowThreadProcessId(KlientWindow,@ProcessId); //Получаем Ид.П.
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,KlientWindow);
end;
procedure InjectFunc(Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessId<>0 then
begin
// ---- Выделим место в памяти процесса и запишем туда нашу функцию
ThreadAddr := VirtualAllocEx(ProcessId, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessId, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Также запишем параметры к ней
ParamAddr := VirtualAllocEx(ProcessId, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessId, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Создадим поток, в котором это всё будет выполняться
hThread := CreateRemoteThread(ProcessId, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Ожидаем, пока функция отработает
WaitForSingleObject(hThread, INFINITE);
// ---- Подчищаем за собой
CloseHandle(hThread);
VirtualFreeEx(ProcessId, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessId, ThreadAddr, 0, MEM_RELEASE);
end
end;
procedure AutoRouteCall(cmd : Pointer); stdcall;
var
addr: Pointer;
begin
addr := Pointer(AutoRouteAddr);
asm
pushad
mov eax, dword ptr [PW_BASE_ADDRESS]
mov eax, dword ptr [eax + PW_DYNAMIC_BASE_OFFSET]
mov ecx, dword ptr [eax + PW_ROLE_BASE_OFFSET]
push cmd
call addr
popad
end;
end;
procedure AutoRouteStart(x, y : integer);
var
buf : array[0..6] of integer;
begin
buf[0] := 330;
buf[1] := 0;
buf[2] := 0;
buf[3] := 0; // Команда на взлёт
buf[4] := x;
buf[5] := y;
buf[6] := 0;
InjectFunc(@AutoRouteCall, @buf, SizeOf(buf));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
AutoRouteStart(1350, 345);
end;
Что не так в моем бреде?
|
|
|
07.05.2012, 00:33
|
#14
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Re: Использование функций автопилота.
А что не работает-то ?
|
|
|
13.05.2012, 20:29
|
#15
|
|
|
|
Разведчик
|
 Регистрация: 25.04.2011
 Сообщений: 19
 Популярность: 14
 Сказал(а) спасибо: 10
Поблагодарили 2 раз(а) в 2 сообщениях
|
Re: Использование функций автопилота.
Как заставить программу лететь по координатам указанных в, допустим, Edit1 и Edit2?
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 05:34.
|
 |