Всем привет, кто может помочь с поиском значения в памяти, вообщем хотелось бы to do лист с подробными обьяснениями что и зачем жмакать, что искать в CE.
Как лучше искать статический базовый адрес, и оффсеты нужных значений. Как найти сигнатуры, что бы после патча не пришлось искать все по новой и т.д.
Вообщем огромное спасибо, тому кто возьметься за такой гайд)
P.S. Около года назад пытался разбираться, но в большинстве гайдов было написано просто куда жмакать, и ничего особо не обьясняеться.
1. grBIN - 20 Марта, 2018 - 07:36:18 - перейти к сообщению
2. Kibor - 20 Марта, 2018 - 07:51:32 - перейти к сообщению
Не в тему..
Я в Бот для Warspear ищу по маске структуры. Делал бот для RF Online по такому же принципу.
Работает нормально и не зависит от апов.
По крайне мере бот для варспы за 3 года ни разу не перестал работать, а апов была куча.
Ну а так, то пусть делятся кто что умеет.
Я в Бот для Warspear ищу по маске структуры. Делал бот для RF Online по такому же принципу.
Работает нормально и не зависит от апов.
По крайне мере бот для варспы за 3 года ни разу не перестал работать, а апов была куча.
Ну а так, то пусть делятся кто что умеет.
3. grBIN - 23 Марта, 2018 - 09:37:33 - перейти к сообщению
В принципе немного разобрался, со структурами и поиском по маске.
Написал Скрипт который берет нужные данные, затем переводит их в маску для 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. Пол дня убил из-за невнимательности.
Написал Скрипт который берет нужные данные, затем переводит их в маску для 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. Пол дня убил из-за невнимательности.
4. Kibor - 23 Марта, 2018 - 09:47:39 - перейти к сообщению
Добавил.
5. grBIN - 24 Марта, 2018 - 16:35:14 - перейти к сообщению
Продолжаем эту тему 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 обязательно использовать массив иначе ошибка.
при вызове функции
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 обязательно использовать массив иначе ошибка.
6. Kibor - 24 Марта, 2018 - 16:54:51 - перейти к сообщению
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;
}
{
messagebox("нашел "+NAME+format(result[0]));
return result[0]+8;
}
else
{
messagebox("НЕ нашел "+NAME+format(result[0]));
return 0;
}
7. Zireael - 24 Марта, 2018 - 16:59:56 - перейти к сообщению
Цитата:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.
Первый параметр: количество искомых адресов. при -1 искать все адреса.
Если ищите один адрес, так и указывайте 1, а не все -1.
8. Kibor - 24 Марта, 2018 - 17:07:11 - перейти к сообщению
grBIN пишет:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.
Нет никакой ошибки.
Если используете массив, даете указатель на него так:
CODE:
int adr[55];
в функции
#adr[0]
в функции
#adr[0]
если просто переменная
CODE:
int adr;
в функции
#adr
в функции
#adr
Работает одинаково в findmemory и findmemorymask
9. grBIN - 24 Марта, 2018 - 17:17:16 - перейти к сообщению
Kibor пишет:
Странно то что у вас необычный способ определения, нашел что то findmemorymask или не нашел.
Я просто знаю, что findmemorymask сейчас не найдет потому что нет предмета на складе, а так же предварительно проверил в CE. И решил проверить что будет если предмета нет, а он проверит =)
Цитата:
findmemorymask не находит второй раз. В result ничего не записывается. В нем остается значение которое было раньше.
Всегда считал, что переменная объявленная внутри функции "существует" только во время ее отработки, то есть например вызываешь функцию, она берет заявленные в вызове переменные, создает свои необходимые для отработки, отрабатывает, затем возвращает необходимый результат(или не возвращает). Ну и в конце концов, "Убивает" все создаваемые переменные со всеми значениями. А в следующем вызове она всегда начинает "с чистого листа"
Цитата:
Вообще то для контроля нашел findmemorymask или нет, как и для контроля выполнения другой любой функции есть возвращаемое значение функции.
findmemorymask возвращает количество найденных объектов.
findmemorymask возвращает количество найденных объектов.
Ок, буду знать, просто вот тут этого нигде не указано, а вы обычно пишите что возвращает =) не проверил T_T
(Добавление)
Zireael пишет:
Цитата:
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.
Первый параметр: количество искомых адресов. при -1 искать все адреса.
Если ищите один адрес, так и указывайте 1, а не все -1.
если тебе нужен только 1 адрес то в findmemory можно использовать int adr; вместо массива, а в случае с findmemorymask обязательно использовать массив иначе ошибка.
Первый параметр: количество искомых адресов. при -1 искать все адреса.
Если ищите один адрес, так и указывайте 1, а не все -1.
Я в курсе, просто для примера скопировал примеры функции из справки.
Kibor пишет:
Нет никакой ошибки.
Если используете массив, даете указатель на него так:
CODE:
int adr[55];
в функции
#adr[0]
если просто переменная
CODE:
int adr;
в функции
#adr
Работает одинаково в findmemory и findmemorymask
Сорян, сейчас еще раз проверил все работает, видимо в прошлый раз когда баг у себя в скрипте ловил, что то не заметил и запомнил этот момент
10. Kibor - 24 Марта, 2018 - 17:40:25 - перейти к сообщению
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("НЕ нашел ");
}
char mask64[28];
int prc;
int adr;
if (findmemory (-1, #char64[0], 8, #adr[0], 25567892, prc)==1)
{
messagebox("нашел ");
}
else
{
messagebox("НЕ нашел ");
}