После выполнения кода персонаж стремится улететь ужасно далеко за карту.
На сколько я понял в отличие от WalkCall процедуре AutoPathCall нужны реальные координаты (отображаемые в окне игры).
Код:
procedure WalkCall(aPParams:PParams);Stdcall;
var CallAddress1,CallAddress2,CallAddress3:Pointer;
x,y,z:single;
...
Но на всякий случай я попробовал перевести значения координат из реальных в те, что считываются (Walk1Adress = $00484690 Walk2Adress = $004889B0; Walk3Adress = $00484B00).
x,y,zword; // здесь менял тип данных на single
x:=548; //пробовал передавать вот так StrToFloat(548-400)*10)) все координаты по соответствующим обратным формулам из реальных.
Полевые испытания не позволили найти ответ на вопрос, что не так.
Для текущей версии руоффа адрес AutoPath=$00447A20.
Координаты в таком виде:
Код:
x:=round(x-400)*10;
y:=round(y-550)*10;
z
Последний раз редактировалось =[Rush]=; 08.10.2013 в 18:24.
После выполнения кода персонаж стремится улететь ужасно далеко за карту.
Перс, скорее всего, летит в нужном направлении, но на карте маршрут рисуется не верный, уходит в правый верхний угол. В моем боте пока тоже самое, позже хочу поправить.
Для текущей версии руоффа адрес AutoPath=$00447A20.
Координаты в таком виде:
Код:
x:=round(x-400)*10;
y:=round(y-550)*10;
z
Пробовал так:
Цитата:
Но на всякий случай я попробовал перевести значения координат из реальных в те, что считываются (Walk1Adress = $00484690 Walk2Adress = $004889B0; Walk3Adress = $00484B00).
x,y,zword; // здесь менял тип данных на single
x:=548; //пробовал передавать вот так StrToFloat(548-400)*10)) все координаты по соответствующим обратным формулам из реальных.
Вопрос был, в каком виде передавать кординаты в функцию AutoPath.
Дак вот, так всё верно:
Код:
aParams.Px:=Round((x-400)*10); //реальный округленный "x" из памяти клиента
aParams.Py:=Round((y-550)*10); //реальный округленный "y" из памяти клиента
aParams.Pz:=Round(z); //Округленная высота, в таком виде, в котором её видим на экране
Судя по твоей вырезке из Олли, прописываются Z координаты указанные на экране, при проверке у меня в ECX получилось тоже самое. В общем, данная строка ловится если перетащить ползунок высоты при автопилоте, соответственно далее, скорее всего, данная цифра преобразуется в реальную координату, т.е. умножается на 10. Я же, при написании проги, использую сразу реальные координаты, т.е. Z*10 и все отрабатывает отлично. Фиг знает что там намутили китайцы, но и тот и другой случай приемлемы )))
Доброго времени суток.
Возникло у меня желание заморочиться с инжектом на AutoIT. Собственно, особой разницы нет, так как, что дельфи, что аутоит используют функции WinAPI. В общем, попытался я сделать инжект кода отправки пакета, руководствуясь этой темой. Т.к. аутоит не поддерживает ассемблер в явном виде, сделал вставку опкодом, сгенерированным CE. Сам код взял из первого поста этой темы. А именно
Что характерно, инжект вроде даже рабоатет. Для проверки отправлял пакет, меняющий содержимое двух ячеек инвентаря.
Ячейки меняются, но после этого клиент виснет и вылетает с ошибкой. отсюда вопрос: где могут быть грабли?
И ещё, что нужно пушить в качестве Len - длину пакета или указатель но длину пакета? Пытался и то и другое - выбивает в обоих случаях, но работает только если в пуш явно ставить длину пакета, что странно. По логике там должен быть именно указатель...
В общем, помогите кто чем может
Код инжекта на скрипте выглядит так: <раскрыть>
Упреждая презрительное "с автоитом не работал и знать его не хочу" скажу, что проблема скорее всего не в нём, а либо в ассемблерном коде, либо в вызове API функций. Вообще, первый раз со всем этим сталкиваюсь, так что можно пинать ногами - не обижусь
Upd: да, инжект кода в память происходит нормально. Проверял через CE по адресам, возвращаемым функцией VirtualAllocEx - и код и пакет пишутся по нужным адресам...
Upd2: Инжектируемый пакет даже отлавливается PacketListener'ом. То есть все _почти_ работает, только клиент выбивает почему-то
Последний раз редактировалось iGesha; 18.03.2014 в 10:43.
$PID - айди процесса, в $OPCODE должен лежать опкод (неожиданно?).
Как еще проверить правильность кода? Поставь msgbox после строчки, которая выделяет память для кода, запиши адрес, с помощью любого дебаггера перейди по этому адресу в процессе и перед самим выполнением кода поставь брекпоинт туда. Потом просто пошагово выполняй код (F7) и смотри, куда он тебя забросит. Вполне возможно, что стек сдвигается и ret забрасывает не туда. Стоп! А где вообще ret?! Допиши в конец & "C3". Ret = return = jmp на то место, откуда вызвалась функция изначально. А у тебя твой код считается функцией, которую вызывает другой код, который создаётся в новом потоке.
Цитата:
И ещё, что нужно пушить в качестве Len - длину пакета или указатель но длину пакета? Пытался и то и другое - выбивает в обоих случаях, но работает только если в пуш явно ставить длину пакета, что странно. По логике там должен быть именно указатель...
Правильно, пушится именно длина пакета. Это же обычный int, по адресам обычно пушат то, что нужно изменить внутри функции, или строки/массивы всякие.
Upd: да, инжект кода в память происходит нормально. Проверял через CE по адресам, возвращаемым функцией VirtualAllocEx - и код и пакет пишутся по нужным адресам...
Выше написал про бряк.
Цитата:
Т.к. аутоит не поддерживает ассемблер в явном виде, сделал вставку опкодом, сгенерированным CE.
Ну как тааак.. а библиотеки? Я [Ссылки могут видеть только зарегистрированные пользователи. ] использую.
Код:
$Asm = AsmInit()
AsmAdd($Asm, "mov eax, ebx")
..
..
$OPCODE = AsmGetBinary($Asm) ; возвращает с 0x в начале, поэтому
$OPCODE = StringTrimLeft($OPCODE, 2)
дальше инжектишь
Стоп! А где вообще ret?! Допиши в конец & "C3". Ret = return = jmp на то место, откуда вызвалась функция изначально. А у тебя твой код считается функцией, которую вызывает другой код, который создаётся в новом потоке.
Застрелите меня
Я раз 5 за всё это время ещё подумал, почему это нет ret'а во всех этих инжектах? Именно в нём, родимом, и была загвоздка. Поставил - всё заработало
Вообще, это моё первое знакомство как с AutoIt'ом, так и с WinAPI вообще. Последний раз кодил на 16-битном асме лет 10 назад и то под DOS. После этого имел дело только с низкоуровневым кодингом - контроллеры там всякие и т.п.
А велосипед изобретаю, ибо нужен не только конечный результат, а и полное понимание того, как это всё работает -)
Спасибо за легкие тычки носом в мою кривопись