Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 357
Начал добавление функционала связанного с работой непосредственно с памятью процессов.
На данный момент добавлены самые необходимые функции позволяющие производить поиск, чтение и запись непосредственно в память игры.
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;
}
Шестой - идентификатор процесса.
//
Так же можно указать не обязательным параметром финишный адрес поиска Указанный финишный адрес является адресом региона, в котором будет происходить поиск!
Его можно не указывать или поставить его в -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;
}
}
Покинул форум
Сообщений всего: 54
Дата рег-ции: Июль 2013
Репутация: 1
Ни чего не понял , но жутко интересно, буду разбираться
Barabachka
Отправлено: 08 Ноября, 2013 - 20:06:40
Участник
Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2013
Репутация: 3
ArtChemist пишет:
Ни чего не понял
Аналогично
Kibor
Отправлено: 09 Ноября, 2013 - 12:49:03
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 357
Что непонятно? Код или принцип?
Эти функции работают с памятью игры и позволяют оперировать ее данными непосредственно в ее памяти.
Почитайте про Cheat Engine. Как писать читы с его помощью.
Barabachka
Отправлено: 09 Ноября, 2013 - 18:36:24
Участник
Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2013
Репутация: 3
Поглядел я ссылку данную товарищем Kibor , и вспомнил такую штуку.
Если не ошибаюсь подобным образом раньше дюпали вещи в линейке.
Жаль такое сейчас не прокатит
BioDread
Отправлено: 17 Декабря, 2013 - 04:17:02
Прохожий
Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013 Откуда: Украина Кременчуг
Репутация: 0
Круто. В первую очередь для считывания данных с клиента без особых усилий, типа параметров персонажа хп мп и т.д. ну и конечно же для считывания текущих координат=) а это перспективы однако.
Barabachka
Отправлено: 23 Декабря, 2013 - 02:16:45
Участник
Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2013
Репутация: 3
Для начала нужно найти эти координаты, а потом можно и узнавать их с помощью кибор.
ArtyZiff
Отправлено: 06 Июля, 2014 - 21:50:03
Прохожий
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2014
Репутация: 0
Хотелось бы поинтересоваться, как можно сделать поиск всех одинаковых байтов с последующей их заменой? Одинаковых байтов около 5000 штук.
Kibor
Отправлено: 06 Июля, 2014 - 22:35:12
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 357
ArtyZiff пишет:
Хотелось бы поинтересоваться, как можно сделать поиск всех одинаковых байтов с последующей их заменой? Одинаковых байтов около 5000 штук.
Идут по порядку?
создать файл бинарный в котором находится то что искть будет. второй с тем чем будем заменять.
создать два массива char[5000] в которые прочитать файлы (в режиме бинарном)
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.