На данный момент добавлены самые необходимые функции позволяющие производить поиск, чтение и запись непосредственно в память игры.
openprocess - открывает процесс. В виде параметра принимает указатель на главное окно:
CODE:
int prc=openprocess(w);//Открываем процесс с указателем на окно w.
CODE:
int Pid=findprocess("notepad.exe");
int prc=openprocess(Pid);//Открываем процесс по PIDу процесса
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
}
// Установить радар на самый обзор
//Запустить скрипт. Радар должен увеличить свой обзор
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
}
Еше тема про чтение запись в другой процесс.пример управления программой собранной в Кибор.