Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Без описания
grBIN
Отправлено: 20 Марта, 2018 - 14:36:18
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017  
Откуда: Псков
Репутация: 2




Всем привет, кто может помочь с поиском значения в памяти, вообщем хотелось бы to do лист с подробными обьяснениями что и зачем жмакать, что искать в CE.
Как лучше искать статический базовый адрес, и оффсеты нужных значений. Как найти сигнатуры, что бы после патча не пришлось искать все по новой и т.д.
Вообщем огромное спасибо, тому кто возьметься за такой гайд)
P.S. Около года назад пытался разбираться, но в большинстве гайдов было написано просто куда жмакать, и ничего особо не обьясняеться.
 
 Top
Kibor
Отправлено: 20 Марта, 2018 - 14:51:32
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




Не в тему..
Я в Бот для Warspear ищу по маске структуры. Делал бот для RF Online по такому же принципу.
Работает нормально и не зависит от апов.
По крайне мере бот для варспы за 3 года ни разу не перестал работать, а апов была куча.
Ну а так, то пусть делятся кто что умеет.
 
 Top
grBIN
Отправлено: 23 Марта, 2018 - 16:37:33
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017  
Откуда: Псков
Репутация: 2




В принципе немного разобрался, со структурами и поиском по маске.
Написал Скрипт который берет нужные данные, затем переводит их в маску для CE,
Затем вручную искал байт код в CE, его записывал в файл настроек, и уже по нему искал адрес нужного значения.
Уже было начал думать нехорошие вещи про разработчика который сказал что codhex переводит int и дробные до 4 байт. в массив байт, а сам с флоат этого не делает.
Начал писать этот текст и понял что сам дебил и то что:
codhex(450, #char[0]); выводит 194 1 0 0 , а не: 0 0 225 67
Потому что для флоат писать нужно так: codhex(450.0, #char[0]);

P.S. Добавьте этот пункт в справку, вдруг я не один такой T___T
P.S. Пол дня убил из-за невнимательности.
 
 Top
Kibor
Отправлено: 23 Марта, 2018 - 16:47:39
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




Добавил.
 
 Top
grBIN
Отправлено: 24 Марта, 2018 - 23:35:14
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017  
Откуда: Псков
Репутация: 2




Продолжаем эту тему T_T:
при вызове функции

int amount_adr[7];
amount_adr[0]=amount_addr("AC43 Rapier", 0);
amount_adr[1]=amount_addr("Growl", 0);

messagebox(format(amount_adr[0]));
messagebox(format(readmem4(amount_adr[0])));

messagebox(format(amount_adr[1]));
messagebox(format(readmem4(amount_adr[1])));

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

P.S. Только что еще раз проверил все. поставил проверку на входе и выходе из функции findmemorymask
При первом вызове функции amount_addr("AC43 Rapier", 0); значения в result[0] нет (выводится очень большое отрицательное число), после выполнения функции findmemorymask, в result[0] валидное значение адреса все нормально.
А вот когда 2 раз вызываю amount_addr("Growl", 0); но с другим условием, значение в result[0] уже равно тому что было в 1 раз, и так как findmemorymask ничего не находит, соотв значение не меняет.
P.S.S. Это баг или я зря раньше думал что за переменными внутри функции можно особо не следить. и они влияют только сейчас, во время отработки функции.
функция (Отобразить)


P.S.S. есть 2 функции:
findmemory (-1, #poisk[0], 8, #adr[0], 25567892, prc);
findmemorymask (-1, #poisk[0], 46, #adr[0], 0, #poiskmask[0], 100, prc);
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.

(Отредактировано автором: 24 Марта, 2018 - 23:41:47)

 
 Top
Kibor
Отправлено: 24 Марта, 2018 - 23:54:51
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




 grBIN пишет:
Если 1 предмет есть в памяти, а второго нет, возвращает в итоге адрес и значение 1 предмета оба раза, вместо того что бы на втором предмете выдать ошибку, или пустое значение например. странно.

Странно то что у вас необычный способ определения, нашел что то findmemorymask или не нашел.
findmemorymask не находит второй раз. В result ничего не записывается. В нем остается значение которое было раньше.
Вообще то для контроля нашел findmemorymask или нет, как и для контроля выполнения другой любой функции есть возвращаемое значение функции.
findmemorymask возвращает количество найденных объектов.
CODE:
if (findmemorymask (1, #char64[0], 28, #result[0], sadr, #mask64[0], 100, prc)==1)
{
messagebox("нашел "+NAME+format(result[0]));
return result[0]+8;
}
else
{
messagebox("НЕ нашел "+NAME+format(result[0]));
return 0;
}
 
 Top
Zireael
Отправлено: 24 Марта, 2018 - 23:59:56
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017  
Репутация: 585




 Цитата:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.

Первый параметр: количество искомых адресов. при -1 искать все адреса.
Если ищите один адрес, так и указывайте 1, а не все -1.
 
 Top
Kibor
Отправлено: 25 Марта, 2018 - 00:07:11
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




 grBIN пишет:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.

Нет никакой ошибки.
Если используете массив, даете указатель на него так:
CODE:
int adr[55];
в функции
#adr[0]

если просто переменная
CODE:
int adr;
в функции
#adr


Работает одинаково в findmemory и findmemorymask
 
 Top
grBIN
Отправлено: 25 Марта, 2018 - 00:17:16
Post Id



Пользователь
Наблюдатель


Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017  
Откуда: Псков
Репутация: 2




 Kibor пишет:
Странно то что у вас необычный способ определения, нашел что то findmemorymask или не нашел.

Я просто знаю, что findmemorymask сейчас не найдет потому что нет предмета на складе, а так же предварительно проверил в CE. И решил проверить что будет если предмета нет, а он проверит =)

 Цитата:
findmemorymask не находит второй раз. В result ничего не записывается. В нем остается значение которое было раньше.

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

 Цитата:
Вообще то для контроля нашел findmemorymask или нет, как и для контроля выполнения другой любой функции есть возвращаемое значение функции.
findmemorymask возвращает количество найденных объектов.


Ок, буду знать, просто вот тут этого нигде не указано, а вы обычно пишите что возвращает =) не проверил T_T
(Добавление)
 Zireael пишет:
Цитата:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.

Первый параметр: количество искомых адресов. при -1 искать все адреса.
Если ищите один адрес, так и указывайте 1, а не все -1.


Я в курсе, просто для примера скопировал примеры функции из справки.

 Kibor пишет:

Нет никакой ошибки.
Если используете массив, даете указатель на него так:
CODE:
int adr[55];
в функции
#adr[0]

если просто переменная
CODE:
int adr;
в функции
#adr


Работает одинаково в findmemory и findmemorymask


Сорян, сейчас еще раз проверил все работает, видимо в прошлый раз когда баг у себя в скрипте ловил, что то не заметил и запомнил этот момент
 
 Top
Kibor
Отправлено: 25 Марта, 2018 - 00:40:25
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




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

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

 grBIN пишет:
Сорян, сейчас еще раз проверил все работает, видимо в прошлый раз когда баг у себя в скрипте ловил, что то не заметил и запомнил этот момент

Это было. Объявление простой переменной и указанием в функции указателя на массив.
Ошибка.
CODE:
char char64[28];
char mask64[28];
int prc;
int adr;



if (findmemory (-1, #char64[0], 8, #adr[0], 25567892, prc)==1)
{
messagebox("нашел ");
}
else
{
messagebox("НЕ нашел ");
}
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 4 (гостей: 4, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by