Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot в Lineage II _ Чтение из памяти

Автор: ivanTu 26.2.2015, 11:49

Приветствую всех, подскажите пожалуйста, у меня есть базовый адрес и офсеты, как правильно все написать пробовал вот так :

set #target_hp_base 0x7D47265C
set #offset1 0x72c
set #offset2 0xf8
set #offset3 0x418
set #offset4 0x3a4
set #offset5 0x204

set #target_hp #target_hp_base + #offset1 + #offset2 + #offset3 + #offset4 + #offset5

readmem #hp #target_hp d
hint Жизней мало епт = #hp

ничего не получилось возвращает либо ноль либо не верное число...

Автор: DarkMaster 26.2.2015, 20:16

У вас скорее всего есть цепочка указателей и офсеты от каждого указателя указаны. Т.е. берете адрес + офсет1, считываете значение. В значении у вас будет указатель со следующим адресом, прибавляете к нему второй офсет и т.д.

Автор: ivanTu 27.2.2015, 8:40

Цитата(DarkMaster @ 26.2.2015, 20:16) *

У вас скорее всего есть цепочка указателей и офсеты от каждого указателя указаны. Т.е. берете адрес + офсет1, считываете значение. В значении у вас будет указатель со следующим адресом, прибавляете к нему второй офсет и т.д.


Что то я никак не разберусь в последовательности действий, Уважаемый дарк покажи на пальцах, куда что и с чем, вот что есть.

Изображение


и кстате, тот адрес что выделен (базовый) я его вытащил из .Dll - ки процесса, и через PE tools взял его адрес, я про то что UoPilot читает адреса из dll процесса?

Автор: ivanTu 27.2.2015, 9:00

Пробовал вот так :

set #target_hp_point0 0x7D47265C
set #target_hp_point2 #target_hp_point0 + 72C
set #target_hp_point3 #target_hp_point2 + F8
set #target_hp_point4 #target_hp_point3 + 418
set #target_hp_point5 #target_hp_point4 + 3A4
set #target_hp #target_hp_point5 + 204

readmem #hp #target_hp d
hint Жизней мало епт = #hp

Возвращает 0

Автор: DarkMaster 27.2.2015, 9:07

это печальная история... Мог, но релиз не состоялся т.к. исходники были утеряны... На данный момент пилот не может запросить начальный адрес блока дллки. Вся адресация у него только общая на процесс. С PE tools дело не имел, только с артмани. Надеюсь правильно вас понял, что адресация идет от начала дллки, но что-то больно цифры тогда большие. Если адресация все-таки общая на процесс, а судя по адресам это так, то схему я уже выше описывал. В данном случае это будет выглядеть примерно так:

Код
set #a 0x2B7BAF00 + 0x204
readmem #b #a D
// В #b должен в данном случае упасть адрес 2BF033F70
// от вернувшегося адреса необходимо расчитать смещение
set #b #b + 0x3A4
readmem #c #b D
set #c #c +0x418
readmem #d #c D
и т.д.

Учтите, что значения при выводе в лог для отладки будут десятичными а не хексом. Для удобства можно использовать:
Код
log dec2hex(#b)


// Вообще очень странная лапша из адресов. Обычно вперед-назад указатели не прыгают, а идут только вперед.

Автор: ivanTu 27.2.2015, 14:50

Спасибо уважаемы Дарк , все получилось, но уж больно огромен код получается )))
Можете подсказать как оптимизировать можно, если это возможно?

Код
// Считываем базовый адрес и оффсеты HP выбранной цели
set #point0 0x7D47265C + 0x72C
readmem #point0 #point0 d
set #point1 #point0 + 0xf8
readmem #point1 #point1 d
set #point2 #point1 + 0x418
readmem #point2 #point2 d
set #point3 #point2 + 0x3A4
readmem #point3 #point3 d
set #target_hp #point3 + 0x204 // Получили адрес памяти HP выбранной цели
readmem #target_hp #target_hp d  // Обьявляем переменную для адреса #target_hp
// КОНЕЦ // Считываем базовый адрес и оффсеты HP выбранной цели

:start_script  
hint HP  =  #target_hp
goto start_script

Автор: DarkMaster 27.2.2015, 23:25

Цитата
Можете подсказать как оптимизировать можно, если это возможно?

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

Автор: ivanTu 28.2.2015, 0:37

Теперь другая проблема, тестил скрипт на 64х битной системе, принес домой адреса не читаются на 32х битной такое возможно? Есть ли решение?

включаю этот же скрипт на домашнем компе

Код
// Считываем базовый адрес и оффсеты HP выбранной цели
set #point0 0x7D47265C + 0x72C
readmem #point0 #point0 d
set #point1 #point0 + 0xf8
readmem #point1 #point1 d
set #point2 #point1 + 0x418
readmem #point2 #point2 d
set #point3 #point2 + 0x3A4
readmem #point3 #point3 d
set #target_hp #point3 + 0x204 // Получили адрес памяти HP выбранной цели
readmem #target_hp #target_hp d  // Обьявляем переменную для адреса #target_hp
// КОНЕЦ // Считываем базовый адрес и оффсеты HP выбранной цели

hint #target_hp


выдает вместо того , что нужно -1

беда.... (

Автор: DarkMaster 28.2.2015, 1:14

Цитата
Теперь другая проблема, тестил скрипт на 64х битной системе, принес домой адреса не читаются на 32х битной такое возможно? Есть ли решение?

изменилась цепочка указателей. ищите новую для 64 бит.

тут кстати возможна большая трагедия. Если будет приложение 64 битным с 64 битной адресацией, то пилот ее не поймет - данный апдейт был потерян вместе с теми же исходниками на адресацию по длл.

Автор: ivanTu 1.3.2015, 12:24

Уважаемый Дарк, а возможно как то проверить в начале скрипта битность системы, а затем запускать требуемые куски скрипта?
про запуск нужного куска я так понимаю gosub мне поможет, а вот как проверить битность? Через реестр есть мысль, но тут опять вопрос на разных типах систем XP Vista и т.д адрес так же разный наверное... может есть какое то универсальное решение...

Автор: DarkMaster 1.3.2015, 13:46

Самый тупой способ - проверить существование папок. Например, wow64. Вообще в пилоте прямого вытягивания битности и работы с реестром нет. Данная методика из костылей батников. Там проверяют зарезервированную системную переменную.

Автор: ivanTu 5.3.2015, 9:54

Уважаемый Дарк подскажите , как можно работать с значением в формате Float выдает 0 всегда, если можите с примером пожалуйста.

Автор: DarkMaster 5.3.2015, 10:34

используйте строковую переменную, а не числовую. В числовую не может быть помещено значение с точкой.

Цитата
добавил в команды 'readmem' и 'writemem' операции с числами с плавающей запятой
B:byte = 1b; W:word = 2b; D:dWord = 4b; C:char = 1b; S:String = 1-255b;
DO:double = 8b; F:float = 4b; R:real = 6b;


Либо вот так:
https://forum.uokit.com/index.php?s=&showtopic=22710&view=findpost&p=161352 (шутка)
Я кстати минут на 15 опоздал(( писал тот же самый функционал...

Автор: ivanTu 5.3.2015, 10:38

Если ставлю строку "S" то выдает так же 0 не понимаю в чем дело

readmem #a 0x0F2999BC s 10
hint #a

хотя на тот момент я точно знаю, что значение 9.024896622

Автор: DarkMaster 5.3.2015, 11:27

Цитата
Если ставлю строку "S" то выдает так же 0 не понимаю в чем дело

Ну причем тут S? Откуда она вообще взялась?
Цитата
используйте строковую переменную, а не числовую.

Цитата
добавил в команды 'readmem' и 'writemem' операции с числами с плавающей запятой

Цитата
F:float = 4b

Автор: ivanTu 5.3.2015, 11:45

S это string тобиш строка, яподумал что про строковую переменную вы имели ввиду это, просто F ноль возвращает, покажите пожалуйста пример кода, не могу никак понять что да как...

Все разобрался )

теперь я знаю что переменная с $ - это строковая )))

Даже в последующем найденом значении делаю проверку на целое число все работает.

$a 8.98880291

If $a > 6
hint
end_if

короче говоря все получилось! Спасибо большое Дарк! )


то есть я так понимаю число проверяется до точки?

Автор: DarkMaster 5.3.2015, 13:03

Не совсем так. Если я правильно понимаю логику пилота, а здесь она не совсем адекватная, то все сравнение идет посимвольно кодами символов.
Т.е. берем строку, лезем в ascii таблицу, переводим все символы в коды. http://www.cdrummond.qc.ca/cegep/informat/Professeurs/Alain/images/ASCII1.GIF

Т.е. у нас получится вместо:
8.98880291
56 46 56 56 56 48 50 57 49
Далее из этого числа по одной цифре идет сравнение. Символ точки меньше значения цифры и это видимо как-то обрабатывается. Вообще трогать страшно.

В общем и целом делать так крайне не рекомендую, это ну уж очень не корректно. Используйте trunc или round для приведения к целочисленному типу.

Код
if 9.0 > 9
    log +
else
    log -
end_if

Уже косяк.

Автор: ivanTu 5.3.2015, 13:20

я считываю значение из памяти оно идет 9.00000хххх и сравниваю его с целым числом все сравнивается правильно, фиг знает, числа с точкой сравниваются как целое число до точки, все что после точки, не берет пилот в сравнение.

set $a 5.98880291
set $b 6
if a < b
hint // В данном случае хинт выведется
end_if

Автор: cirus 5.3.2015, 13:40

Может так: if $a < $b

Автор: DarkMaster 5.3.2015, 14:12

Цитата
все сравнивается правильно

Цитата
Код

if 9.0 > 9
log +
else
log -
end_if


Уже косяк.

Не может 9.0 быть больше, чем 9. Это ошибка.

Автор: cirus 5.3.2015, 14:29

Сравнение работает если сравнивать целые числа с целыми и нецелые с нецелыми.
Т. е. если надо сравнивать нецелое число, скажем 5.98880291, то и сравнивать его надо не с 6, а с 6.0.

Автор: WKnight 6.3.2015, 4:42

if strtoint() then f:= a < b
else CompareStr ()

Автор: DarkMaster 6.3.2015, 6:04

Как именно работает сравнение строк? Все что я понял, то вернет 0, если они равны. Точнее я не понял, что есть "строка больше/меньше". По Ascii, как я и написал?

Цитата
Т. е. если надо сравнивать нецелое число, скажем 5.98880291, то и сравнивать его надо не с 6, а с 6.0.

Код
if 9.80 > 9.8
    log +
else
    log -
end_if
stop_script

Автор: cirus 6.3.2015, 7:50

Видимо все-таки не работает.

Автор: DarkMaster 6.3.2015, 7:58

Если по порядку по ascii сравнивает, то все логично. Код символа '0' будет больше, чем код окончания строки.

Автор: cirus 6.3.2015, 8:27

А где-то вообще пишется 9.80 или везде 9.8? Если не пишется то смысл что-то выдумывать.

Автор: DarkMaster 6.3.2015, 10:12

А эти десятые вообще нужны? почему не делать trunc или round?

Автор: ivanTu 9.3.2015, 22:17

я сейчас подбираю, нужную ячейку памяти, не могу подобрать дистанцию до моба в La2 геморрой сплошной, нашел вроде бы float , но улетаю в другую локацию, значение принимает отрицательный вид... тобиш с минусом впереди... пока кароче ничего не получается с дистанцией...

Автор: DarkMaster 10.3.2015, 7:58

минус можно убрать через

Код
set #var abs(значение)

Как с флоатом работать будет не уверен, возможно сначала необходимо будет отбросить дробную чать или округлить.

А как дистанцию до моба нашел?

Автор: ivanTu 10.3.2015, 8:41

брал в цель мобов, НПС, отбегал, подбегал, и искал соответственно что уменьшилось или увеличилось значение, (Cheat Engine)
P/S Искал по всем значениям кроме строк от байта до Double , вроде второе правильно написал.

Автор: DarkMaster 10.3.2015, 9:01

какой диапазон значений? Скажем при ренче 600 и 900 какие значения будут?
При каких ситуациях значение становится отрицательным?

Автор: ivanTu 10.3.2015, 10:23

рейндж не могу проверить, а в минус уходят не понятно по каким причинам, сам пока не пойму.

Автор: DarkMaster 10.3.2015, 10:40

если несложно, уточните ренч и значения, когда сможете. Есть кстати подозрение, что там используется unsigned (безнаковая) перемененная, а пилот вроде считывает их как знаковые. Но тут опять же должны быть очень большие значения, чтобы знак менялся.

Поискал диапазоны значений... А походу не существует беззанокового float...

Автор: ivanTu 10.3.2015, 11:01

Т.Е. нет возможности вычеслить дистанцию до моба?

Автор: DarkMaster 10.3.2015, 11:52

Т.е. моя догадка про появление минуса ошибочна.

При минусе само число по модулю остается корректным? Если да, то можно просто использовать abs, как я писал выше.

Автор: ivanTu 10.3.2015, 13:24

Цитата(DarkMaster @ 10.3.2015, 11:52) *

Т.е. моя догадка про появление минуса ошибочна.

При минусе само число по модулю остается корректным? Если да, то можно просто использовать abs, как я писал выше.


Оно то верно, то нет.

Автор: DarkMaster 10.3.2015, 14:05

возможно адрес смещен на 1 байт.

Автор: DarkMaster 10.3.2015, 14:26

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

Автор: ivanTu 10.3.2015, 14:54

сейчас папробую
ОТкрыл, и Заморгал, ничего не понимаю только это понял )))

Автор: ivanTu 10.3.2015, 22:42

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

Изображение

Автор: cirus 11.3.2015, 2:18

Цитата
вот скрин с значениями может яснее будет.

Нет скрина. Прикрепите к форуму его.

Автор: ivanTu 11.3.2015, 8:31

вот скрин еще разок.
и Еще я хоть и обозначил числа не измененными но это немного не так, дело в том что при близком расстоянии к мобу 16 меняется на 15 896 к примеру, а 49 на 48 954 к примеру.

Теперь понятно мне что Float (значение с точкой) менялся на отрицательное значение так же из за положения персонажа относительно моба в мире и имело значение то положительное то отрицательное.

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


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: DarkMaster 11.3.2015, 8:57

Можно поискать какие-нибудь флаги. Посмотри память - оно может быть рядом. Не знаю как в чит инжи, но в артмани это достаточно удобно делать: открываешь область памяти и у тебя все значения на глазах в виде таблицы.

Вообще можно пойти еще и сложным путем. Можно вытащить координаты чара и координаты цели. Координаты чара точно вытаскиваются. С координатами цели сложнее - их может не существовать. Т.е. есть просто некая таблица(далеко не факт, что таблица, возможно список разбросанный по памяти) мобов с координатами, именами т.д. Когда ты берешь моба в цель, то есть неплохая вероятность, что некоторый набор значений моба копируется в структуру цели. Если так происходит, то может получится вытащить координаты цели. Если вытащишь, то найти дистанцию проблемой не будет.

Автор: ivanTu 11.3.2015, 9:12

А можно по подробнее что такое флаги , как искать , и что с ними делать?

Автор: DarkMaster 11.3.2015, 11:22

Обычные переменные, принимающие значения 1 или 0. Пример:
https://forum.uokit.com/index.php?s=&showtopic=28316&view=findpost&p=209321

Искать соответственно 1 и 0 при изменении отсчета.

Цитата
15 896 к примеру, а 49 на 48 954

16к ну очень сильно смущают. Прямо-таки на разряды похоже. Открой память, посмотри, что происходит при перемещении. Мне все чутье кричит, что неправильный адрес на 1-2 байта и/или тип данных. Может и ошибаюсь, но прямо покоя не дает.

Автор: ivanTu 12.3.2015, 9:36

Нашел я байт , который скачет,
вот скрин наглядный, что можно имея эти данные с этим сделать?


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: DarkMaster 12.3.2015, 9:45

этот байт, надеюсь не является частью того float'а? От него можно отталкиваться и проводить коррекцию значения.

А вообще значения до и после скачка хоть как-то пересекаются? Может проще вообще просто сделать некоторый алгоритм коррекции основываясь только на изначальном значении?

Автор: ivanTu 12.3.2015, 9:54

Это не тот Float, это уже я нашел значение (2b) ,
P/S Для меня все не просто )))
а вопрос про пересечение, есть кое какие цифры но я в них не уверен на 100% не получается точно найти
примерно 15700 - 48700

Автор: DarkMaster 12.3.2015, 11:03

А число изменяется при удалении линейно на отрезаках 0-15700 и 48700-много?
Идентично ли изменение значений на этих отрезках при идентичном изменении реального ренча?

Т.е. я хочу все это дело подвести примерно под такой код:

Код
set #rangeMultipler // Некоторый множитель для приведения ренча к стандарту л2
if  #memRange < 15700
    set #range #memRange / #rangeMultipler
else
    set #range (#memRange - ( 48700 - ( 48700 - 15700 ) ) )/ #rangeMultipler
end_if
log #range

( 48700 - ( 48700 - 15700 ) - естественно превратить в константу. Написано таким образом, чтобы было понятно, что это за занчение.

Автор: ivanTu 12.3.2015, 11:21

Блин не совсем понял про что ты спрашиваешь...

Цитата
А число изменяется при удалении линейно на отрезаках 0-15700 и 48700-много?
Идентично ли изменение значений на этих отрезках при идентичном изменении реального ренча?


Я выделяю моба к примеру значение 15700, если моб дальше 16000 если еще дальше 16300 и т.д, забегаю за моба с другой стороны с противо положной, значение 48700 если выделяю моба дальше этого 48900 и т.д

Значения 15700 (не может быть меньше) как и значение 48700 это так сказать старт значений

Про идентичность, сейчас проверю
Проверил разные разные, не идентичные.

Автор: ivanTu 12.3.2015, 11:45

Сравнивал через некст тарег в одном случае ловит в таргет при дистанции 49300 а в другом при дистанции 16500, т.е дистанция не идентична. в 200 единиц, но это не критично. наверное.

Это обусловлено я думаю тем, что смещение байта не идентично, я выше скрин присылал там было 3D,3E,3F а другое по логике тоже с D должно но нет там BC,BD,BE, и т.д

Автор: DarkMaster 12.3.2015, 12:37

Цитата
49300 а в другом при дистанции 16500

От чего значение зависит? От положения чара или от дистанции? Я имею ввиду именно перескок.

Накидай по обоим вариантам приблизительные соответствия дистанции и значения в памяти с шагом 100-200 ренча по шкале л2.

Автор: ivanTu 12.3.2015, 12:43

Перескок зависит от положения чара относительно цели к примеру чар на юге а цель на севере 49 если на оборот то 16 а значения я прислал некст таргет, это рандж 400 памоему в интерлюде.
вот они 49300 (400 рендж) а в другом 16500 (400 рендж)

Но опять же я мог подбежать чуть ближе или дальше, возможно они идентичны даже.
я имею идентичность трех последних чисел. (300 и 500)

Автор: DarkMaster 12.3.2015, 12:49

Какие значения будут при ренче:
0
200
400(ну уже есть в принципе)
600
800
1000

Автор: ivanTu 12.3.2015, 12:51

Цитата(DarkMaster @ 12.3.2015, 12:49) *

Какие значения будут при ренче:
0
200
400(ну уже есть в принципе)
600
800
1000


при 0 будет 0 (проверил выделив себя в цель)

а как остальные вычеслить я не знаю.

Автор: Destruction 12.3.2015, 12:54

Цитата(ivanTu @ 12.3.2015, 12:51) *

при 0 будет 0 (проверил выделив себя в цель)

а как остальные вычеслить я не знаю.

В линейке есть скиллы которые начинают кастоваться на разной ренже.

Отходишь от цели подальше, тыкаешь скилл с ренжой 400, - чар подбегает на нужную и начинает кастовать (каст можно отменить).

Конкретные названные цифры - не критичны, нужны просто примеры для разной дистанции.

Автор: DarkMaster 12.3.2015, 12:55

Побегай) На глаз примерно. У магов виндстрайк на 400 бьет, на 600 почти у любого чара есть скилы, лук на 600 бьет без скилов. Маги на хай левелах 900. Открой скилы, посмотри ренч, примерно на глаз все это промерь. Надо понять точность значений и как они изменяются.

Автор: ivanTu 12.3.2015, 13:23

Что то разброс идет проверял на рендж 600 бить начинает от 16000 до 16700
а другое значение с рейнджем 600 48700 - 49500


Рейндж 400

Начинает бить от 15840 до 16666
Другое значение 48700 до 49434

(400 рейндж проверил более точно побега вокруг гуарда и бафал его шитом баф шита имеет дистанцию 400)

Автор: DarkMaster 12.3.2015, 13:43

А это точно значение ренча?

Цитата
600 бить начинает от 16300 до 16750

Цитата
Рейндж 400

Начинает бить от 15840 до 16666

Они перекрываются и сильно. С такими погрешностями я не особо представляю, как этим пользоваться. Т.е. у нас может быть ренч 300, а может быть 600 при одинаковом значении... Не должно быть такого дикого рандома.

Попробуй вытащить координаты цели. Если выдернешь, то про эти извраты можно забыть.

Автор: ivanTu 12.3.2015, 13:53

Ок, папробую поискать координаты

Автор: ivanTu 12.3.2015, 14:31

Координаты цели нашел по X и по Z высота я думаю не нужна? что дальше?

Автор: DarkMaster 12.3.2015, 14:48

Ну дальше найти бы еще по Y =)
Найди свои координаты.
Потом:

Код
set #distance point_distance (x1 y1 x2 y2)


В каком типа данных хранится дистанция?

Автор: ivanTu 12.3.2015, 14:52

координаты Вы имели ввиду? Если да то Float

Автор: DarkMaster 12.3.2015, 14:53

Цитата
координаты Вы имели ввиду? Если да то Float

Будет небольшой доп гемор, но это уже мелочи.

Автор: DarkMaster 12.3.2015, 15:13

Код
set $zero 0
set $x1 258910,46875
set $y1 -71314,3125
set $x2 258906,15625
set $y2 -71314,234375

set $x1Frac frac ($x1)
while size ($x1Frac) < 3
    set $x1Frac $x1Frac$zero
end_while
set #x1Int trunc ($x1) copy ( $x1Frac 1 3)

set $y1Frac frac ($y1)
while size ($y1Frac) < 3
    set $y1Frac $y1Frac$zero
end_while
set #y1Int trunc ($y1) copy ( $y1Frac 1 3)

set $x2Frac frac ($x2)
while size ($x2Frac) < 3
    set $x2Frac $x2Frac$zero
end_while
set #x2Int trunc ($x2) copy ( $x2Frac 1 3)

set $y2Frac frac ($y2)
while size ($y2Frac) < 3
    set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) copy ( $y2Frac 1 3)

set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
log #distance

stop_script

Это под вычисление координат. К сожалению красиво точности добиться не получилось, пришлось немного нулей рисовать.

Автор: ivanTu 12.3.2015, 15:28

Высота смотрю не нужна для вычислений?

Значение иногда принимает отрицательное значение, это не критично?
И поясните пожалуйста где чьи координаты в коде ?

set $x1 10,06
set $y1 1,21
set $x2 20,2468
set $y2 11

Автор: DarkMaster 12.3.2015, 15:44

x1 y1 - первый объект.
x2 y2 - второй объект.
Что цель, а что вы - без разницы. Z можно прилепить, но оно надо?

Координаты возвращаются аналогичные тем, то по .loc?

Автор: ivanTu 12.3.2015, 15:47

Не понял про

Цитата
Координаты возвращаются аналогичные тем, то по .loc?

А про Z вы наверное правы, смысла особого нет, по горам не бегать. )))

Автор: DarkMaster 12.3.2015, 15:50

В чате л2 напишите .loc или /loc (зависит от сервера). Значение будет аналогичным вытянутому из памяти? В памяти координаты хранятся такие же как на карте?

Автор: ivanTu 12.3.2015, 15:56

Значения немного разные к примеру 258129.3125 а на сервере 258136.

но это мой косяк не точно нашел значение в памяти сейчас папробовал найти то что выдает сервер, все совпадает

Автор: DarkMaster 12.3.2015, 16:09

хм. Обычно зачения схожи с координатной сеткой на карте. Т.е., например 62,34 на 30,42. Если значения всегда так велики и все, что после точки можно просто отбросить, то код можно очень сильно сократить. Все, что нужно будет оставить:

Код
set #y2Int trunc ($y2)

Для всех 4 координат.

не факт, что второе значение будет корректнее работать, чем первое.

Автор: ivanTu 12.3.2015, 16:10

Код
set #distance point_distance (x1 y1 x2 y2)

readmem $x1_target 0x1605ABF8 F
readmem $y1_target 0x1605ABF4 F
readmem $x2_target 0x068780D8 F
readmem $y2_target 0x068780D4 F


set $zero 0
set $x1 $x1_target //25
set $y1 $y1_target //-
set $x2 $x2_target
set $y2 $y2_target

set $x1Frac frac ($x1)
while size ($x1Frac) < 3
    set $x1Frac $x1Frac$zero
end_while
set #x1Int trunc ($x1) * 1000 + $x1Frac

set $y1Frac frac ($y1)
while size ($y1Frac) < 3
    set $y1Frac $y1Frac$zero
end_while
set #y1Int trunc ($y1) * 1000 + $y1Frac

set $x2Frac frac ($x2)
while size ($x2Frac) < 3
    set $x2Frac $x2Frac$zero
end_while
set #x2Int trunc ($x2) * 1000 + $x2Frac

set $y2Frac frac ($y2)
while size ($y2Frac) < 3
    set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) * 1000 + $y2Frac


set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))
log #distance

stop_script


Возвращает (40)-1 в логе

Может это из за минуса в одном из координат?



Код содержит ошибки. Исправленная версия https://forum.uokit.com/index.php?s=&showtopic=28537&view=findpost&p=211572

Автор: DarkMaster 12.3.2015, 16:15

Минуса??? В л2 не должно быть минуса координат. Либо какой-то совсем чудесный сервер. Значения координат очень странные. Добавь вывод в лог:

Код
log $x1 $y1 $x2 $y2
log #x1Int #y1Int #x2Int #y2Int
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))

Автор: ivanTu 12.3.2015, 16:19

обычный фри интерлюд сервер
16:17:25 4 (, 42): 258243 -71456 258304 -71384
16:17:25 4 (, 43): 258243000 -71456000 258304000 -71384000

И кстате в игровом /loc так же минуса присутствуют

Автор: DarkMaster 12.3.2015, 16:20

Дистанция возвращалась с точкой. Поправил код.

Автор: ivanTu 12.3.2015, 16:31

если подойти близко к мобу цыфры выростают а не наоборот, хм странно

вот лог к примеру подхожу к мобу все норм уменьшается но если совсем близко то:

6:26:26 4 (, 39): 26249
16:26:26 4 (, 39): 26249
16:26:27 4 (, 39): 26249
16:26:28 4 (, 39): 22023
16:26:29 4 (, 39): 22023
16:26:29 4 (, 39): 258101001

Значение скачет видимо из за не стабильной информации из памяти, папробую подобрать что то поточнее.

Автор: Destruction 12.3.2015, 16:54

Цитата(DarkMaster @ 12.3.2015, 16:15) *

Минуса??? В л2 не должно быть минуса координат. Либо какой-то совсем чудесный сервер. Значения координат очень странные. Добавь вывод в лог:
Код
log $x1 $y1 $x2 $y2
log #x1Int #y1Int #x2Int #y2Int
set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))


Отрицательные координаты в л2 - совершенно нормальное явление (точка 0;0 находится где-то по центру карты, если мне память не изменяет, то где-то возле островка олимпиады). Дробные координаты - явление странное, но вероятно связанное с движением персонажа, в стоячем положении число должно быть скорее целым, чем дробным.

Такая фишка с координатами в л2 была всегда, начиная с С1 и заканчивая HF5 (в более поздние хроники не играл).

Касаемо преобразования страшных координат в нестрашные, очень хорошо написано тут (особенно пост от xkor):
http://coderx.ru/showthread.php?t=5545

Автор: DarkMaster 12.3.2015, 16:57

С логами координат и int значений приводите. Для отладки они очень полезны.

Автор: ivanTu 13.3.2015, 8:52

Что то значение скачет... ничего не понимаю, адреса нашел стабильные...
Я выделил цель и подбегаю к ней постепенно вот что выходит.
вот лог:

Код
8:50:36 1 (, 40): 716867
8:50:37 1 (, 40): 334937
8:50:37 1 (, 40): 211837
8:50:38 1 (, 40): 170695
8:50:38 1 (, 40): 95742
8:50:39 1 (, 40): 95742
8:50:39 1 (, 40): 777597
8:50:40 1 (, 40): 777597
8:50:41 1 (, 40): 722105
8:50:41 1 (, 40): 722105

Автор: DarkMaster 13.3.2015, 9:02

Цитата
С логами координат и int значений приводите. Для отладки они очень полезны.

Автор: ivanTu 13.3.2015, 9:06

То же самое вот :

Код
9:06:10 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:10 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:10 1 (, 40): 1561717
9:06:10 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:10 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:11 1 (, 40): 1561717
9:06:11 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:11 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:11 1 (, 40): 1561717
9:06:12 1 (, 41): 258110 -71040 258852,796875 -71308,1875
9:06:12 1 (, 42): 258110000 -71040000 259648875 -71306125
9:06:12 1 (, 40): 725027
9:06:12 1 (, 41): 258110 -71040 258824,0625 -71303,140625
9:06:12 1 (, 42): 258110000 -71040000 258824625 -71162375
9:06:13 1 (, 40): 1411175
9:06:13 1 (, 41): 258110 -71040 258741,765625 -71289,46875
9:06:13 1 (, 42): 258110000 -71040000 259506625 -71242125
9:06:13 1 (, 40): 670899
9:06:13 1 (, 41): 258110 -71040 258709,71875 -71280,0234375
9:06:13 1 (, 42): 258110000 -71040000 258780875 -71045625
9:06:14 1 (, 40): 655258
9:06:14 1 (, 41): 258110 -71040 258630,25 -71251,609375
9:06:14 1 (, 42): 258110000 -71040000 258630250 -70641625
9:06:15 1 (, 40): 8849580
9:06:15 1 (, 41): 258110 -71040 258530,390625 -71212,8984375
9:06:15 1 (, 42): 258110000 -71040000 258920625 -62227625
9:06:15 1 (, 40): 2808937
9:06:15 1 (, 41): 258110 -71040 258445,234375 -71180,2890625
9:06:15 1 (, 42): 258110000 -71040000 258679375 -68289375
9:06:16 1 (, 40): 262689
9:06:16 1 (, 41): 258110 -71040 258353,875 -71142,4375
9:06:16 1 (, 42): 258110000 -71040000 258353875 -71137625
9:06:16 1 (, 40): 886794
9:06:16 1 (, 41): 258110 -71040 258263,390625 -71105,765625
9:06:16 1 (, 42): 258110000 -71040000 258653625 -70339375
9:06:17 1 (, 40): 92639
9:06:17 1 (, 41): 258110 -71040 258188,6875 -71078,875
9:06:17 1 (, 42): 258110000 -71040000 258194875 -71077125

Автор: DarkMaster 13.3.2015, 9:39

В во 1 почему различаются координаты int и считанные? Считывается разный набор адресов?
-71308,1875
-71306125
так не бывает.

Автор: ivanTu 13.3.2015, 9:44

Все с запятыми должны быть?

Автор: DarkMaster 13.3.2015, 9:57

запятая должна выкидываться и браться первые 3 числа после запятой и прлепляться к целой части числа. Вот только не совпадают тут числа.

Код
-71308,1875
-71308187       // должно быть так
-71306125       // а как это получилось?

Автор: ivanTu 13.3.2015, 10:24

Сам не понимаю, все как бы правильно, может скрипт что то не так вычисляет?

Код
set $zero 0
set $x1 258910,46875
set $y1 -71314,3125
set $x2 258906,15625
set $y2 -71314,234375

set $x1Frac frac ($x1)
while size ($x1Frac) < 3
    set $x1Frac $x1Frac$zero
end_while
set #x1Int trunc ($x1) copy ( $x1Frac 1 3)

set $y1Frac frac ($y1)
while size ($y1Frac) < 3
    set $y1Frac $y1Frac$zero
end_while
set #y1Int trunc ($y1) copy ( $y1Frac 1 3)

set $x2Frac frac ($x2)
while size ($x2Frac) < 3
    set $x2Frac $x2Frac$zero
end_while
set #x2Int trunc ($x2) copy ( $x2Frac 1 3)

set $y2Frac frac ($y2)
while size ($y2Frac) < 3
    set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) copy ( $y2Frac 1 3)

set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))

log $x1 $y1 $x2 $y2
log #x1Int #y1Int #x2Int #y2Int
log #distance


Вот скрин из Cheat Engine когда выделяю себя и цель, а так же игровые координаты персонажа:


Может задержку выполнения не нужно ставить слишком маленькую, я 5 поставил, хотя при 50 мс так же не верные значения... уповаю на вашу мудрость уважаемый ДАрк

Код содержит ошибки. Исправленная версия https://forum.uokit.com/index.php?s=&showtopic=28537&view=findpost&p=211572



Эскизы прикрепленных изображений
Прикрепленное изображение Прикрепленное изображение Прикрепленное изображение

Автор: DarkMaster 13.3.2015, 10:24

Это весь код? Это бред.

Автор: ivanTu 13.3.2015, 10:25

И еще я заметил что значение не всегда с запятой, может это как то влияет?

Автор: DarkMaster 13.3.2015, 10:25

Задержки там вообще не при чем. Можно ставить смело 0.

Автор: ivanTu 13.3.2015, 10:26

а Что с кодом не так, подскажите?

Автор: DarkMaster 13.3.2015, 10:28

Цитата
И еще я заметил что значение не всегда с запятой, может это как то влияет?

Это компенсируется в блоке:
while size ($x1Frac) < 3

Цитата
а Что с кодом не так, подскажите?

Вы ВЕСЬ код сюда из вкладки скрипта постите? Исходя из кода:
set $a 10
set $b $a
но при этом $a не равно $b.

Автор: ivanTu 13.3.2015, 10:31

А как же нужно?
что то я запутался...

Автор: DarkMaster 13.3.2015, 11:06

вы ВЕСЬ код из вкладки сюда копируете? Он в неизмененном виде относительно вашей вкладки?

Автор: ivanTu 13.3.2015, 11:06

да весь код

Автор: DarkMaster 13.3.2015, 11:12

В шапку скрипта:

Код
log clear
log mode commands
:start

В самый низ скритпа:
Код
goto start

Результат лога сюда под спойлер или в виде тхт файла. Буду сидеть и втыкать в этот бред. По времени скорее всего часа через 4-5 отпишусь.

Автор: ivanTu 13.3.2015, 11:18

В логе иногда появляется ноль, это значит, что я выделил в цель себя, затем я менял цель и начинал движение к ней


Прикрепленные файлы
Прикрепленный файл  log.txt ( 9,96 килобайт ) Кол-во скачиваний: 119
Прикрепленный файл  script.txt ( 965 байт ) Кол-во скачиваний: 71

Автор: DarkMaster 13.3.2015, 14:59

Цитата
log mode commands

он оказывается без mode пишется. Привык уже к галке.
Код
log commands

Поправь и еще раз лог сюда.

Автор: ivanTu 13.3.2015, 15:40

вот еще раз )


Прикрепленные файлы
Прикрепленный файл  log.txt ( 40,78 килобайт ) Кол-во скачиваний: 91

Автор: DarkMaster 13.3.2015, 16:11

set #distance point_distance (x1 y1 x2 y2) - удалить строку в начале скрипта.

Так же я не увидел ни одного дробного значения либо искаженного значения. Все отработало точно так, как и должно было. Ну разве что результат я проверял ибо желания строить координатную сетку, считать на калькуляторе и сличать с сеткой у меня желания не много)
Что изменяли? Признавайтесь =)

// Если проблема останется, то лог с проблемой сюда. Т.е. лог нужно снять, когда проблема будет, а не в идеальных условиях.

Поднял старый лог, подставил значение, нашел косяк =)

Автор: DarkMaster 13.3.2015, 16:31

https://forum.uokit.com/index.php?showtopic=28537&st=60&p=211572&#entry211572
исправил. Если в 2 словах, то так увлекся компенсацией излишнего обрезания дробной части, что забыл ее обрезать =)

Автор: ivanTu 14.3.2015, 10:36

Спасибо Уважаемый Дарк, пока нет возможности проверить, как появится, сразу отпишусь о работоспособности!
Спасибо еще раз огромное!

Автор: ivanTu 15.3.2015, 11:15

Руку Мастера, сразу видно, все работает как часы!!!
Единственно неудобно, и я не знаю как это реализовать, когда цели нет он все ровно выдает дистанцию, и это немного сбивает, эту проблему можно как то обойти? Помогите пожалуйста!

Автор: DarkMaster 15.3.2015, 11:21

А вот это дожен быть где-то флаг в чистом виде.
Ищите 1 когда цель есть и 0, когда цели нет.
Ну либо обычный if на панельку с целью.

Автор: ivanTu 15.3.2015, 11:41

Такой флаг у меня найден уже на проверку цели, а как и в какое место кода вставить его чтоб подружить с предыдущем скриптом, где и как проверку сделать, подскажите пожалуйста

Автор: DarkMaster 15.3.2015, 12:07

Дык а чего вы хотите добиться? У вас есть флаг проверки существования цели - от этого и отталкивайтесь выстраивая логику скрипта. Сейчас у вас в случае отсутствия цели возвращает фантомную дистанцию, а что должно возвращать?

Автор: ivanTu 15.3.2015, 12:12

я так понимаю 0 ?

Автор: DarkMaster 15.3.2015, 12:15

Цитата
я так понимаю 0 ?

Дык тут нет "понимаю", что хотите, то и вернет. Вставляйте иф, присваивайте 0.

Автор: ivanTu 15.3.2015, 12:18

Я в начало просто добавил проверку вот такого вида:

if #target = 0 // Проверяем есть ли цель?
goto main
end_if

Проверка синтаксически верна?

Автор: DarkMaster 15.3.2015, 12:29

Цитата
if #target = 0 // Проверяем есть ли цель?
goto main
end_if

А где считывание то само наличие цели? #target не задан.
Цитата
Проверка синтаксически верна?

Если флаг равен 0, то да. Но при этом вы не делаете никакого присваивания. Т.е. у вас сохранится предыдущее значение дистанции, как следствие вам необходимо будет в основном коде дополнительно проверять #target либо все-таки изменять значение дистанции.
Цитата
goto main

Не используйте goto. Это великое зло.

// Я бы, наверное, все-таки использовал -1, а не 0, если бы присваивал дистанцию при отсутствии цели.

Автор: ivanTu 15.3.2015, 12:33

Ок, спасибо буду разбираться, единственно хотел еще уточнить вы упомянули про goto - не использовать, gosub - нужно?
и значение 0 чем хуже -1 ?

Автор: DarkMaster 15.3.2015, 12:45

gosub - правильное решение.

0 - теоретически корректное значение. Нам же фактически нужно вернуть ошибку определения дистанции. Ну и есть общее негласное правило - возвращать отрицательное значение при ошибках.

Автор: ivanTu 15.3.2015, 12:45

Все Ясно! Спасибо!

Автор: DarkMaster 15.3.2015, 13:15

Я надеюсь конструкция не превратилась в gosub main?

Автор: ivanTu 15.3.2015, 13:17

Нет я поступил по другому в конец скрипта проверку добавил с присваиванием значения, вот кусок концовки кода:

set $y2Frac frac ($y2)
while size ($y2Frac) < 3
set $y2Frac $y2Frac$zero
end_while
set #y2Int trunc ($y2) copy ( $y2Frac 1 3)

set #distance round (point_distance (#x1Int #y1Int #x2Int #y2Int))

if $x2 = 0 // Проверяем есть ли цель?
set #distance -1
end_if

log #distance // Выводим в переменную #distance дистанцию до цели

// Памятка соотношение дистанции скрипта и игрового RANGE
// Range 400 I 413000
// Range 600 I 613000

Автор: DarkMaster 15.3.2015, 13:21

Цитата
Нет я поступил по другому в конец скрипта проверку добавил с присваиванием значения

Логичнее вставить в начало и не обрабатывать все вычисления, если цели нет.

Автор: ivanTu 15.3.2015, 13:22

Спасибо, действительно так будет правильно!

Автор: ivanTu 17.3.2015, 11:09

Уважаемый драк подскажи как работать с строковыми перемеными, никак не могу оффсеты прибавить в формате 0x260 к примеру результат -1 всегда
вот мой код:

while 1
// Считываем базовый адрес и оффсеты HP положение цели по X
set $offset1 0x670
set $offset2 0x708
set $offset3 0x298

set $target_pos_point_x 0x0693AC00 + $offset1
readmem $target_pos_point_x $target_pos_point_x f
set $target_pos_point_x1 $target_pos_point_x + $offset2
readmem $target_pos_point_x1 $target_pos_point_x1 f
set $target_pos_point_x2 $target_pos_point_x1 + $offset3
readmem $target_pos_x $target_pos_point_x2 f
hint $target_pos_x
end_while

Автор: DarkMaster 17.3.2015, 15:23

потому что они должны быть не строковыми а числовыми.

0xчисло - это не строковые, а числовые значения. Просто они представлены в шестнадцатиричной системе счисления.

Автор: ivanTu 17.3.2015, 15:27

а значение Float записывается в строковую?, как объединить?

Автор: DarkMaster 17.3.2015, 15:59

а зачем? вы в данном примере вычисляете адреса по указателям. При этом точно вам не придется складывать дробные значения. В пилоте нет нецелочисленной математики на данный момент. Если в этом есть необходимость, то могу написать функцию.

Автор: ivanTu 17.3.2015, 16:36

Не могу понять как это сделать, значение все ровно -1
оставил строковую переменную при чтении памяти,
в при сложении изменил на решетку,
подскажите пожалуйста:


while 1
// Считываем базовый адрес и оффсеты положение цели по X
set #offset1 0x6C
set #offset2 0x18
set #offset3 0x5A4

set #target_pos_point_x 0x0693AC00 + #offset1
readmem $target_pos_point_x #target_pos_point_x f
set #target_pos_point_x1 $target_pos_point_x + #offset2
readmem $target_pos_point_x1 #target_pos_point_x1 f
set #target_pos_point_x2 $target_pos_point_x1 + #offset3
readmem $target_pos_x #target_pos_point_x2 f
hint $target_pos_x
end_while

Автор: DarkMaster 17.3.2015, 17:04

А адрес то получается точно нужный вам? Для меня вообще не очень понятен смысл каждый раз складывать две константы.
0x0693AC00 + 0x6C - результат всегда будет одинаковый. В чем смысл сего действа? Скорее всего необходимо было считать адрес 0x0693AC00, получить из него указатель и к значению этого указателя прибавить 0x6C.

Цитата
readmem $target_pos_point_x #target_pos_point_x f

Вы считываете флоат.
Цитата
set #target_pos_point_x1 $target_pos_point_x + #offset2

Тут вы считываете адрес, который указываете флоатом. Адрес не может быть числом с плавающей точкой. Адрес всегда только int и никак иначе. Если быть точнее, то беззнаковый инт, т.е. число положительное и целое. Учитывая, что у вас набор указателей, то вы ошибочно задали тип считываемого значения. Указатель не имеет ничего общего с итоговым вашим типом значения, у указателя всегда тип беззнакового int, он же dword.

Вообще используйте для отладки вывод в лог получившихся значений. Чтобы перевести значения в шестнадцатиричный вид, используйте:
log dec2hex(переменная)

Автор: ivanTu 17.3.2015, 18:07

Спасибо огромгое за подсказку. Буду работать дальше.

Автор: ivanTu 18.3.2015, 9:10

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

Автор: ivanTu 18.3.2015, 10:16

Что то я вообще запутался ))
То выдает значение, то нет, подскажите куда ковырять, в первом варианте выдает - 1

во втором все работает, что я не так делаю?

Код
While 1
//Позиция ЦЕЛИ по X
set #base_target_x 0x0692B000      
set #offcet1 0x270
set #offcet2 0x708
set #offcet3 0x298

readmem #base_target_x #base_target_x d
set #point1 #base_target_x + #offcet1
readmem #point1 #point1 d
set #point2 #point1 + #offcet2
readmem #point2 #point2 d
set #point3 #point2 + #offcet3
readmem $target_x #point3 F
hint $target_x
end_while
// КОНЕЦ //





While 1
//log dec2hex (#baseadr)      
set linedelay 50 //Для забывчивых
set #off1 0x4
set #baseadr 0x00179424
// Считываем базовый адрес и оффсеты HP выбранной цели
readmem #baseadr #baseadr d
set #point1 #baseadr + #off1
readmem $am_Y #point1 F
hint $am_Y
end_while
// КОНЕЦ //

Автор: DarkMaster 18.3.2015, 10:38

вообще визуально косяков не вижу. Либо цепочка кривая либо при переносе из чит инжи в скрипт где-то ошибка. А чит инжи эту цепочку нормально считывает? Адреса совападют с тем, что пилот делает?

Цитата
#offcet1

offset
Цитата
#baseadr

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

// HP цели - это float? О.о

Автор: ivanTu 18.3.2015, 10:50

HP не float просто кусок кода скопировал )

Подскажите как прапвильно пользоваться log dec2hex (#baseadr) у меня так не выдает в лог в HEX

Все разобрался, спасибо. ) С адресами начудил

Автор: DarkMaster 18.3.2015, 11:01

Цитата
Подскажите как прапвильно пользоваться log dec2hex (#baseadr) у меня так не выдает в лог в HEX

Если напрямую не получается, то можно попробовать так:
Код
set $tmp dec2hex (#baseadr) 
log $tmp

Автор: ivanTu 18.3.2015, 14:01

Столкнулся с другой проблемой,
вот код лога:

как правильно присвоить значение переменным, а то получается -1

readmem $x1(-1) $target_pos_x(0) F
readmem $y1(-1) $target_pos_y(0) F
readmem $x2(-1) $player_pos_x(244630,171875) F
readmem $y2(-1) $player_pos_y(-94823,984375) F
set $zero(0) 0

Автор: DarkMaster 18.3.2015, 15:12

Цитата
readmem $x1(-1) $target_pos_x(0) F
readmem $y1(-1) $target_pos_y(0) F

Переменная с адресом не задана либо задана ошибочно. Адрес не может быть равен нулю. Соответственно при считывании возвращается ошибка "-1".
Цитата
readmem $x2(-1) $player_pos_x(244630,171875) F
readmem $y2(-1) $player_pos_y(-94823,984375) F

Адрес опять задан флоатом.

Автор: ivanTu 19.3.2015, 13:21

У меня вопрос к знатокам )
Есть мысль заставить бота подбирать не все подрят, а только предметы из списка, так вот вопрос, как то можно прочитать память в момент поднятия нужного предмета и в последующем поднимать уже используя write memory а не макрос pickup?

Автор: DarkMaster 19.3.2015, 13:42

Я не представляю, как с помощью writemem можно инициоравать поднятие предмета. Ну очень глубоко теоретически догадываюсь, но как это применить к реалиям не знаю.

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

Автор: ivanTu 19.3.2015, 13:47

понятно, ладно спасибо, понял лиш, что это очень трудно реализовать )

Автор: DarkMaster 19.3.2015, 14:36

проще фиш билетов купить)

Автор: ivanTu 19.3.2015, 15:05

всмысле? )))

Автор: cirus 19.3.2015, 15:08

Цитата
всмысле? )))

Купить рыбных билетов для расширения инвентаря и собирать всё подряд smile.gif

Автор: ivanTu 20.3.2015, 8:37

Понятно! )) Умно ))
У меня сейчас проблема очередная, память читается из Dll процесса ,
К примеру : "Engine.dll"+00ADD81C получаем адрес на указатель , к которому прибавляем оффсет, который выведет нас на нужное значение, через PE tools можно расковырять* l2.bin и увидеть все Dll'ки процесса и их HEX адреса памяти, что нам позволяет в начале не использовать "Engine.dll"+00ADD81C а сразу приплюсовать два hex'a и получаем стартовый указатель, НО ловушка в чем, при перезагрузки (не всегда) hex адрес памяти Dll'ки может измениться, что уже обрывает правильность цепочки, но если б вы научили меня читать значение непосредственно из engine.dll к примеру эта проблема превратиться в Пух.

Автор: DarkMaster 20.3.2015, 9:43

Я очень активно пинаю кнайта по этому поводу. Пока никак. Только отключать модульную адресацию и искать километровую цепочку указателей.

Если адреса длл имеют ограниченный набор, скажем 5 вариантов, то можно перебрать все 5 вариантов и найти рабочий на данный момент. Для этого необходимо будет найти некоторую последовательность в памяти, которая никогда не меняется в этой длл. Я бы посмотрел на самое начало дллки - вряд ли там что-то будет менятся. Сейчас еще раз чиркну кнайту.

Автор: ivanTu 20.3.2015, 10:36

Я нашел значение которое идет от другой DLL , она статична ) проблема устранена!
Но Кнайту лучше чернуть )))

Автор: ivanTu 6.4.2015, 16:27

Уважаемый Дарк, вопросик появился, нашел бота, который использует вот такие значения памяти:
Как, что это, и куда это?


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: DarkMaster 6.4.2015, 20:48

Это не значения адресов памяти, которые использует чит, а просто память процесса в чистом виде. Слева идут адреса начиная с первого байта и по порядку.

Автор: ivanTu 6.4.2015, 22:05

А как бот этим пользуется? И для чего это было сделано.

Автор: DarkMaster 6.4.2015, 22:10

Откуда для начала вы это взяли?
Вы можете взять любой процесс, открыть память и увидеть примерно тоже самое.
Это не имеет ничего общего со списком адресов с какими-то данными. Это просто память процесса. Если хотите, то вы сейчас взяли книжку на неизвестном вам языке и читаете ее предисловие, а на какой-нибудь странице возможно есть и необходимая информация.

Автор: ivanTu 9.1.2017, 22:45

Друзья созрел вопрос, как можно получить статический адрес в игре на андроид эмуляторе, NoxAppPlayer или Bluestack к примеру, весь интернет перелопатил, стандартные методы не работают, может кто то направит на путь истенный, вопрос очень острый на мой взгляд, и многим будет интересно это, выручайте гуру!

Автор: Cockney 9.1.2017, 23:02

Имхо, нереально.

Автор: ivanTu 12.1.2017, 11:10

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

Автор: DarkMaster 14.1.2017, 4:32

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

Автор: ivanTu 14.1.2017, 22:58

в смысле в самом Андроиде?

Автор: DarkMaster 14.1.2017, 23:22

Да.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)