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

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

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

> Описание: Работа с памятью процесса. Поиск, чтение, запись в память процесса игры
Kibor
Отправлено: 03 Ноября, 2013 - 19:49:30
Post Id



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


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




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

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
}


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

 
 Top
ArtChemist
Отправлено: 04 Ноября, 2013 - 07:53:06
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 54
Дата рег-ции: Июль 2013  
Репутация: 1




Ни чего не понял Радость , но жутко интересно, буду разбираться Подмигивание
 
 Top
Barabachka
Отправлено: 08 Ноября, 2013 - 20:06:40
Post Id



Пользователь
Участник


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




 ArtChemist пишет:
Ни чего не понял

Аналогично
 
 Top
Kibor
Отправлено: 09 Ноября, 2013 - 12:49:03
Post Id



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


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




Что непонятно? Код или принцип?
Эти функции работают с памятью игры и позволяют оперировать ее данными непосредственно в ее памяти.
Почитайте про Cheat Engine. Как писать читы с его помощью.
 
 Top
Barabachka
Отправлено: 09 Ноября, 2013 - 18:36:24
Post Id



Пользователь
Участник


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




Поглядел я ссылку данную товарищем Kibor , и вспомнил такую штуку.
Если не ошибаюсь подобным образом раньше дюпали вещи в линейке.
Жаль такое сейчас не прокатит
 
 Top
BioDread
Отправлено: 17 Декабря, 2013 - 04:17:02
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  
Откуда: Украина Кременчуг
Репутация: 0




Круто. В первую очередь для считывания данных с клиента без особых усилий, типа параметров персонажа хп мп и т.д. ну и конечно же для считывания текущих координат=) а это перспективы однако.
 
 Top
Barabachka
Отправлено: 23 Декабря, 2013 - 02:16:45
Post Id



Пользователь
Участник


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




Для начала нужно найти эти координаты, а потом можно и узнавать их с помощью кибор.
 
 Top
ArtyZiff
Отправлено: 06 Июля, 2014 - 21:50:03
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2014  
Репутация: 0




Хотелось бы поинтересоваться, как можно сделать поиск всех одинаковых байтов с последующей их заменой? Одинаковых байтов около 5000 штук.
 
 Top
Kibor
Отправлено: 06 Июля, 2014 - 22:35:12
Post Id



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


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




 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);
}
 
 Top
ArtyZiff
Отправлено: 07 Июля, 2014 - 10:43:55
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2014  
Репутация: 0




 Kibor пишет:

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

Да, по порядку, спасибо Радость
 
 Top
Страниц (24): [1] 2 3 4 5 6 7 8 9 » В конец
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« О программе Кибор »


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




Powered by