Описание: Работа с памятью процесса. Поиск, чтение, запись в память процесса игры |
Поиск в теме | Версия для печати |
AdryV |
Отправлено: 07 Декабря, 2017 - 07:51:39
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
Dantes3000 пишет: было бы еще проще, если бы маску можно было заполнять как поиск.
вот.... у меня прекрасно работает)
код (Отобразить)CODE:char poiskRXP[148];
char maskRXP[148];
win w;
int prc;
int adr;
int x, y;
int hps;
char xp[4];
//////////////////////////
poiskRXP[0]=5;
poiskRXP[1]=0;
poiskRXP[41]=0;
poiskRXP[42]=100;
poiskRXP[43]=0;
poiskRXP[44]=0;
poiskRXP[76]=2;
///////////////////////////////////////////
maskRXP[0]=1;
maskRXP[1]=1;
maskRXP[41]=1;
maskRXP[42]=1;
maskRXP[43]=1;
maskRXP[44]=1;
maskRXP[76]=1;
for(int n2=0; n2>148; n2++)
{
if(maskRXP[n2]!=1)
{
maskRXP[n2]=0;
}
}
start_();
loop() {sleep(50); poiskRealXP();}
//////////////////////////////////////////////////////////////
function start_()
{
pause(500);
beep(1000, 100);
getmouse(x, y);
w=getwindow(1, x, y);
}
//
function poiskRealXP()
{
prc=openprocess(w);
if (findmemorymask (1, #poiskRXP[0], 148, #adr, 0, #maskRXP[0], 100, prc)==1)
{
if (readmemory(#xp[0], 4, adr+32, prc)!=0)
{
hps=codhexi(#xp[0], 4);
} else textout(0, 10, 40, "ошибка реад мемори",0);
textout(0, 30, 40+40, "бьют или нет - "+format(hps)+" "+format(adr+32), 0);
} else textout(0, 10, 40, "ошибка финд мемори",0);
return hps;
}
хм) |
|
|
Kibor |
Отправлено: 07 Декабря, 2017 - 09:45:27
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
AdryV пишет: у меня прекрасно работает
Это странно)
надо не n2>148 а n2<148
CODE:char maskRXP[148];
maskRXP[0]=1;
maskRXP[1]=1;
maskRXP[41]=1;
maskRXP[42]=1;
maskRXP[43]=1;
maskRXP[44]=1;
maskRXP[76]=1;
for(int n2=0; n2>148; n2++)
{
messagebox("");//никогда в цикл не войдет так как n2 никак не больше 148
if(maskRXP[n2]!=1)
{
maskRXP[n2]=0;
}
}
так проще
CODE:for(int n2=0; n2<148; n2++)maskRXP[n2]=0;
maskRXP[0]=1;
maskRXP[1]=1;
maskRXP[41]=1;
maskRXP[42]=1;
maskRXP[43]=1;
maskRXP[44]=1;
maskRXP[76]=1; |
|
|
AdryV |
Отправлено: 07 Декабря, 2017 - 16:08:20
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
Kibor пишет: Это странно)
надо не n2>148 а n2<148
видимо в том скрипте мало что было искать так что оно всегда находило))) и спасиб что тыкнули в ошибку а то с большим скриптом поиска мучался и не замечал из-за чего проблема
Kibor пишет: for(int n2=0; n2<148; n2++)maskRXP[n2]=0;
maskRXP[0]=1;
еще лучше!! сначала всему массиву присваивается 0 а после нужному массиву присваиваем 1 идеально))) че я не додумался) |
|
|
007wan |
Отправлено: 10 Января, 2018 - 09:50:24
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
AdryV , AdryV пишет: скажем от адреса 25567892 до адреса 45567892? Я в этом не шарю, но дипазон от 25567892 до адреса 45567892 очень много. Я думаю добавить к числу 25567892 переменную или просто слагаемое 1 и он будет прибавлять 1 и искать если не нашел, то снова прибавляет и ищет...Но это очень долго будет.
(Добавление)
AdryV пишет: Kibor пишет: findmemory (-1, #poisk[0], 8, #adr[0], 25567892, prc);
Ищем 8 байт записанных в массив char poisk, начиная с адреса 25567892 в процессе prc.
а возможно ли как нить ограничить поиск
скажем от адреса 25567892 до адреса 45567892?
так как зачем мне дальше искать адреса, если нужных адресов просто напросто уже нет, хотя после него еще идет столько же кода памяти
CODE:
int a=0;
loop()
{
findmemory (-1, #poisk[0], 8, #adr[0], 25567892+a, prc);
a++;
}
(Добавление)
Поставь в таймер и он будет искать вне скрипта и последующий код не будет мешать, а там уже как-нибудь сделаешь в цикле если нашел, то... |
|
|
AdryV |
Отправлено: 10 Января, 2018 - 19:17:41
|
Специалист
Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016
Репутация: 11
|
007wan пишет: Я в этом не шарю, но дипазон от 25567892 до адреса 45567892 очень много
ну эт еще нормально дет 5 сек переискивает 4байта максимум 200 адресов... а вообще память нужной мне игры уж куда больше поэтому и спрашиваю
как ограничить поиск?)
дело в том что искать по конкретным адресам получится чет типа такой каши
код (Отобразить)CODE:////////////////////////////////////////////////////////////////////////////////////////////////
function mob_adress_attack_xp_id()
{
adrr=adr+312;
adrr2=adr2+248;
adrr4=adr3+248;//05C000F8-05C00000=
text_static0[8]="";
for(int k=0; k<100; k++)
{
if(k>0)
{
if(k<15){adres[k]=17120+adrr;}//шаг
if(k==15){adres[k]=18144+adrr;}//пропустить
if(k>15 && k<17){adres[k]=17120+adrr;}//шаг
if(k==17){adres[k]=17144+adrr;}//пропустить
if(k>17 && k<32){adres[k]=17424+adrr;}//шаг
if(k==32){adres[k]=adrr2;}//сменить адрес
if(k>32 && k<47){adres[k]=17424+adrr;}//шаг
if(k==47){adres[k]=19760+adrr;}//пропустить
if(k>47 && k<62){adres[k]=17424+adrr;}//шаг
if(k==62){adres[k]=19232+adrr;}//пропустить
if(k>62 && k<77){adres[k]=17424+adrr;}//шаг
if(k==77){adres[k]=adrr4;}//сменить адрес 96469240+243936=96713176 05C400F8=96731384
if(k>77 && k<92){adres[k]=17424+adrr;}//шаг
if(k==92){adres[k]=18208+adrr;}//пропустить
if(k>92 && k<100){adres[k]=17424+adrr;}//шаг
}else adres[k]=adrr;
adrr=adres[k];
if (readmemory(#xp[0], 4, adres[k], prc)!=0)
{
mob_adress[k]=codhexi(#xp[0], 4);
}
if (readmemory(#xp[0], 4, adres[k]-88, prc)!=0)
{
mob_xp[k]=codhexi(#xp[0], 4);
}
if (readmemory(#xp[0], 4, adres[k]-140, prc)!=0)
{
mob_id[k]=codhexi(#xp[0], 4);
}
}
//
}
////////////////////////////////////////////////////////////////////
куча адресов, куча указателей... да работает быстро, но тяжело найти все возможные адреса... и потом проделывать расчеты
поэтому нашел один указатель который есть только в нужных мне местах и ищу этот адрес и от него уже расчитываю данные и параметры... но поиск 200-ти одинаковых указателей занимает время около 10-20 сек смотря сколько памяти игра на данный момент занимает...
////////////
так вот мне нужно ограничить зону поиска 4-х байт от 25567892 до 45567892 потому что дальше есть еще память где то так 445567892 а то и больше... куча текста и всякой балабурды
+ в добавок есть довольно большие участки памяти которые пустые тоисть ??????????????????
к примеру:
от 25567892 до 45567892 находит 46 адресов
между 45567892 и 75567892 пусто
от 75567892 до 95567892 находит 54
ну в общем и тд... |
|
|
Dantes3000 |
Отправлено: 23 Января, 2018 - 19:44:08
|
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
|
Spoiler (Отобразить)CODE:win w_KIB;
int ex_KIB, ey_KIB, sum_KIB, x_KIB, y_KIB;
start_();
int prc=openprocess(w_KIB);
int x_kurs;
int y_kurs;
char xy_kurs_p[4];
char xy_kurs_m[4];
xy_kurs_p[0]=136; //88
xy_kurs_p[1]=16; //16
xy_kurs_p[2]=53; //13
xy_kurs_p[3]=144; //90
xy_kurs_m[0]=1;
xy_kurs_m[1]=1;
xy_kurs_m[2]=1;
xy_kurs_m[3]=1;
loop()
{
ху_курс();
if(y_kurs!=9 && x_kurs!=19) переб();
{
sendkey(13, w_KIB); beep(500, 500); goto ex;
}
}
ex:;
function ху_курс()
{
char x[2];
char y[2];
int adr;
if(findmemorymask(1, xy_kurs_p[0], 4, #adr, 0, xy_kurs_m[0], 100, prc)==1)
{
if(readmemory(#x[0], 2, adr+13, prc)!=0)
{
y_kurs=codhexi(#x[0], 2);
if(readmemory(#y[0], 2, adr+15, prc)!=0)
{
x_kurs=codhexi(#y[0], 2);
}
}
}
return;
}
function start_()
{
pause(1000);
int x, y;
getmouse(x, y);
w_KIB=getwindow(1, x, y);
ex_KIB=w_KIB.widthclient; ey_KIB=w_KIB.heightclient;
}
function переб()
{
//пук
}
почему такая ошибка?
|
|
|
|
Поиск в теме | Версия для печати |
Страниц (24): В начало « 6 7 8 9 [10] 11 12 13 14 » В конец |
Сейчас эту тему просматривают: 16 (гостей: 16, зарегистрированных: 0) |
« О программе Кибор » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|