Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 3.02 Работа с памятью процесса. Поиск, чтение, запись в память процесса игры

Страниц (24): [1] 2 3 4 5 6 7 8 9 ... » В конец
 

1. Kibor - 03 Ноября, 2013 - 11:49:30 - перейти к сообщению
Начал добавление функционала связанного с работой непосредственно с памятью процессов.
На данный момент добавлены самые необходимые функции позволяющие производить поиск, чтение и запись непосредственно в память игры.

openprocess - открывает процесс. В виде параметра принимает указатель на главное окно:

CODE:
int prc=openprocess(w);//Открываем процесс с указателем на окно w.


CODE:
int Pid=findprocess("notepad.exe");
int prc=openprocess(Pid);//Открываем процесс по PIDу процесса


Возвращает int, который потом используется для идентификации процесса.

codhex - служит для перевода целых или дробных чисел (до 4 байт) в HEX, для использования их в функциях поиска, чтения и записи в память. Конвертирует в char
char poisk[4];
codhex(1032983058, #poisk[0]);//Конвертируем искомое целое число int 1032983058 в HEX
codhex(45.0, #poisk[0]);//Конвертируем дробное число double (float) 45.0 в HEX
codhex(27.95, #poisk[0]);//Конвертируем дробное число double (float) 27.95 в HEX

Возвращает фактическое количествол байт занятое в масиве.
При ошибке возвращается -1 - размер масива char меньше чем надо для помещения количества байт данного числа.


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

int adr[1000000];
findmemory (-1, #poisk[0], 8, #adr[0], 25567892, prc);
Ищем 8 байт записанных в массив char poisk, начиная с адреса 25567892 в процессе prc. В массив adr записываются все адреса найденных данных. findmemory возвращает количество найденных адресов. При ошибке возврат -1 - размер принимаемого масива меньше колическтва адресов, -2 - количество поиска 0.
Первый параметр -1 - искать сколько есть, если больше нуля - искать сколько в параметре и поиск заканчивать.
Второй: Указатель на масив char, в котором записаны данные которые надо искать.
Пример как указать число указано выше. Строку можно указать таким образом:

char a[20];
string poisK="Текст нужный";
strcpy(#a[0], poisK);
В этом случае в виде параметра третьего в findmemory можно указать размер данных в массиве char до 0 с помощью функции size(#a[0]).
Третий параметр количество байт в массиве которые ищутся.

Четвертый - указатель на int или double (Подробнее..) масив в который запишутся адреса найденных данных.
Пятый - стартовый адрес поиска. Для первого вызова указать 0. Потом, если ищется не сразу все, а к примеру по одному адресу, в виде этого адреса надо указывать найденный адрес +1. То есть начинать поиск со следующего адреса.
Пример поиска по одному адресу:
int b=0;
e: if (findmemory (1, #a[0], size(#a[0]), #b, b+1, prc)>0)
{
//Тут что то делаем с адресом иль значением в нем
goto e;
}

Шестой - идентификатор процесса.

//

Так же можно указать не обязательным параметром финишный адрес поиска
Указанный финишный адрес является адресом региона, в котором будет происходить поиск!


findmemory без ограничения:
findmemory (1, #poisk[0], 4, #adr, 0, prc)
Красным обозначен стартовый адрес.

findmemory с ограничениями:
findmemory (1, #poisk[0], 4, #adr, 0, 500000, prc)
Зеленым обозначен финишный адрес.

Его можно не указывать или поставить его в -1. Тогда будет без ограничений.



////////////////////////////////


readmemory - чтение с памяти по адресу.
readmemory(#chitat_v_char[0], 8, adr, prc);
Читаем в масив char chitat_v_char 8 байт начиная с адреса adr.
При ошибке возвращается 0

writememory - запись в память.
writememory(#char_dannie[0], 8, adr, prc);
Записать в память процесса данные с массива char_dannie размером 8 байт начиная с адреса adr
При ошибке возвращается 0



Вот пример хака радара в игре RF Online:
Принцип - ищем адрес по которому записано заранее известное значение радара на максимальном обзоре. Такое значение вряд ли может быть более 1 раза, так как его длина 8 байт. Поэтому нам чхать на поиск статического адреса. В этом случае вполне можно применить такой метод. По найденному адресу записывается новое значение (хакаем обзор радара).

 Цитата:
//Хак радара в RF Online
// Установить радар на самый обзор
//Запустить скрипт. Радар должен увеличить свой обзор
string name=getcontrol(EDIT_0);
win w=window (name);
if (w==0)
{
messagebox ("Невозможно найти окно "+name);
goto er;
}
int prc=openprocess(w);//Открываем процесс RF

char all_poisk[8];
char poisk[4];
codhex(1032983058, #poisk[0]);//Конвертируем искомое число 1032983058 в HEX, для поиска в памяти процесса при максимальном обзоре радара

zapis(#poisk[0], #all_poisk[0]);//Записываем 4 байтовое число 1032983058 два раза в 8 байт (идут один за другим X и Y) Его ищем

char all_zamen[8];
char zamen[4];
codhex(1022983058, #zamen[0]);//Конвертируем искомое число 1032983058 в HEX, для поиска в памяти процесса

zapis(#zamen[0], #all_zamen[0]);//Записываем 4 байтовое число 1022983058 два раза в 8 байт (идут один за другим X и Y) Им заменить надо

int adr=0;
findmemory (1, #all_poisk[0], 8, #adr, 0, prc);//Ищем 8 байт ( числа 1032983058 одно за другим)
writememory(#all_zamen[0], 8, adr, prc);//Заменяем 1032983058 числа на 1022983058.(сразу два числа. 8 байт)

if (adr!=0)messagebox ("Хак должен быть по адресу "+format(adr));
else messagebox ("Проверьте стоит ли радар на макс обзоре и повторите еще раз.");

er:;
///////////////////////////


function zapis(char #ch, char #all_ch)//Эта функция для заполнения 8 байт повторением по 4 байта (одинаковые числа)
{
int n=0, n1=0;
q: if (n<4)
{
all_ch[n1]=ch[n];
n++; n1++;
goto q;
}
n=0;
q1: if (n<4)
{
all_ch[n1]=ch[n];
n++; n1++;
goto q1;
}
}

///////////////////////////////////
CREATE_INTERFACE
{
DIALOG "Хак радара в RF Online" 237 140 //РазмерX РазмерY
BUTTONSCRIPT "Хакнуть радар" 6 80 220 25 //ПозицияX ПозицияY РазмерX РазмерY
//Добавление контролов управления ......
STATIC_0 "Название окна" 10 10 75 17 //ПозицияX ПозицияY РазмерX РазмерY
STATIC_1 "Увеличьте обзор на радаре на максимум" 10 40 215 17 //ПозицияX ПозицияY РазмерX РазмерY
STATIC_2 "и нажмите Хак" 75 60 90 17 //ПозицияX ПозицияY РазмерX РазмерY
EDIT_0 "RF Online" 90 8 136 18 //ПозицияX ПозицияY РазмерX РазмерY
}


Еше тема про чтение запись в другой процесс.пример управления программой собранной в Кибор.

2. ArtChemist - 03 Ноября, 2013 - 23:53:06 - перейти к сообщению
Ни чего не понял Радость , но жутко интересно, буду разбираться Подмигивание
3. Barabachka - 08 Ноября, 2013 - 12:06:40 - перейти к сообщению
 ArtChemist пишет:
Ни чего не понял

Аналогично
4. Kibor - 09 Ноября, 2013 - 04:49:03 - перейти к сообщению
Что непонятно? Код или принцип?
Эти функции работают с памятью игры и позволяют оперировать ее данными непосредственно в ее памяти.
Почитайте про Cheat Engine. Как писать читы с его помощью.
5. Barabachka - 09 Ноября, 2013 - 10:36:24 - перейти к сообщению
Поглядел я ссылку данную товарищем Kibor , и вспомнил такую штуку.
Если не ошибаюсь подобным образом раньше дюпали вещи в линейке.
Жаль такое сейчас не прокатит
6. BioDread - 16 Декабря, 2013 - 20:17:02 - перейти к сообщению
Круто. В первую очередь для считывания данных с клиента без особых усилий, типа параметров персонажа хп мп и т.д. ну и конечно же для считывания текущих координат=) а это перспективы однако.
7. Barabachka - 22 Декабря, 2013 - 18:16:45 - перейти к сообщению
Для начала нужно найти эти координаты, а потом можно и узнавать их с помощью кибор.
8. ArtyZiff - 06 Июля, 2014 - 13:50:03 - перейти к сообщению
Хотелось бы поинтересоваться, как можно сделать поиск всех одинаковых байтов с последующей их заменой? Одинаковых байтов около 5000 штук.
9. Kibor - 06 Июля, 2014 - 14:35:12 - перейти к сообщению
 ArtyZiff пишет:
Хотелось бы поинтересоваться, как можно сделать поиск всех одинаковых байтов с последующей их заменой? Одинаковых байтов около 5000 штук.

Идут по порядку?

создать файл бинарный в котором находится то что искть будет. второй с тем чем будем заменять.

создать два массива char[5000] в которые прочитать файлы (в режиме бинарном)

CODE:
char poisk[5000];
if (fopen ("D:\что-ищем.txt", "rb")!=0)
{
freadb(#poisk[0], 5000);
fclose();
}

char men[5000];
if (fopen ("D:\тут-что-запишем.txt", "rb")!=0)
{
freadb(#men[0], 5000);
fclose();
}

win w=window (/*......*/);
int prc=openprocess(w);
int adr;
if (findmemory (1, #poisk[0], 5000, #adr, 0, prc)==1)
{
writememory(#men[0], 5000, adr, prc);
}
10. ArtyZiff - 07 Июля, 2014 - 02:43:55 - перейти к сообщению
 Kibor пишет:

Идут по порядку?

Да, по порядку, спасибо Радость

Powered by ExBB FM 1.0 Final