Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от leto2011
Всем привет!
Похоже тема с ником персонажа актуальна)
У меня таже проблема, не получается правильно считать ник своего персонажа, приведу код, может кто чем поможет).
Код:
void __fastcall TForm1::Button6Click(TObject *Sender)
{
DWORD str_addr;
str_addr=bot.client.get.Read_Name(); //...вычисляем адрес строки по нужным оффсетам
char str[40]={0};
bot.client.get.Read_Mass(str_addr, str, 40); // считываем
AnsiString string=bot.client.get.UnicodeToAnsi(str, 20);
Label16->Caption="Name - "+ string;
}
DWORD READER::Read_Name()
{
DWORD buff;
buff = Read_32(BA);
//buff = Read_32(buff+D_GA); //Пробовал и с D_GA и без как с некоторых постах
buff = Read_32(buff+PERS_STRUCT);
buff = Read_32(buff+MY_NAME);
buff = Read_32(buff+ZERO);
return buff;
}
void READER::Read_Mass(DWORD addr, char* mass, int len)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid) ;
ReadProcessMemory(hProcess,(void*)addr,mass,len,0) ;
CloseHandle(hProcess);
}
AnsiString READER::UnicodeToAnsi(char *mass, int len)
{
AnsiString txt="";
for (int i=0; i<len; i++)
{
BYTE lo=mass[i*2];
BYTE hi=mass[i*2+1];
if ((lo==0)&&(hi==0)) break;
if ((lo==1)&&(hi==4)) {lo=168; hi=0;}
if ((lo==81)&&(hi==4)) {lo=184; hi=0;}
if (hi==4) lo+=176;
txt+=(char)lo;
}
return txt;
}
где:
#define MY_NAME 0x670//0x6b0 //Пробовал разные значения
#define ZERO 0x0
#define BA 0x00C9DFAC
#define GA 0x00C9E74C
#define D_GA 0x1C
Уважаемые гуру, намекните хотя бы на правильное направление), заранее спасибо!
Я пытаюсь таргет сделать, по его примеру, и вылетает клиент Вот пример моей функции:
Код:
SendPacket(PACKET *pack)
{
HANDLE hProcThread;
// базовый адрес адрес пакета // функция для отправки (33)
char fdata[30]="\x60\x8B\x0D\x00\x00\x00\x00\x8B\x49\x20\x68\x11\x11\x11\x11\x68\x22\x22\x22\x22\xB8\x33\x33\x33\x33\xFF\xD0\x61\xC3";
int lenfunc=30;
DWORD func=F_SEND_PACKET;
DWORD ba=BA;
DWORD len=pack->len;
void* pParams = Alloc(); // Указатель на память для функций
void* pFunction = Alloc(); // Указатель на память для функций
cout << pParams << endl << pFunction << endl;
WriteProcessMemory(m_hProc,pParams,pack->Bytes,len,NULL); // инжектим данные пакета
DWORD addr=DWORD(pParams); // возьмём адрес расположения данных нашего пакета
memcpy(fdata+3,&ba,4);
memcpy(fdata+11,&len,4);
memcpy(fdata+16,&addr,4); // запишем адрес расположения пакета прямо в массив кода
memcpy(fdata+21,&func,4);
WriteProcessMemory(m_hProc,pFunction,fdata,lenfunc,NULL); // инжектим наш код
hProcThread = CreateRemoteThread(m_hProc,NULL,NULL,(LPTHREAD_START_ROUTINE)pFunction,NULL,NULL,NULL);
if(hProcThread==INVALID_HANDLE_VALUE) // не удалось создать поток
{
CloseHandle(m_hProc);
return 0;
}
WaitForSingleObject(hProcThread, INFINITE); // ожидаем завершения работы потока
CloseHandle(hProcThread); // освобождаем
CloseHandle(m_hProc);
return 1; // успешная инъекция и выполнение кода
}
и вот функция выделения:
TargetMobPack(DWORD wid)
{
PACKET pack; // структура пакета
pack.len=7; // длина данных пакета
char Packet[7] = "\x02\x00\x00\x00\x00\x00"; // массив данных пакета
memcpy(pack.Bytes,Packet,pack.len); // скопируем в структуру пакета данные массива
memcpy(pack.Bytes+2,&wid,4); // последние четыре байта - WID выделяемого моба
SendPacket(&pack); // инжектим
}
через отладчик (прога останавливаю после всех WriteMemoryProcess, не создавая поток: CreateRemoteThread - видно, что записалось вот что:
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
она актуальна на сегодняшний день?
Да
Цитата:
Код:
TargetMobPack(DWORD wid)
{
PACKET pack; // структура пакета
pack.len=7; // длина данных пакета
char Packet[7] = "\x02\x00\x00\x00\x00\x00"; // массив данных пакета
memcpy(pack.Bytes,Packet,pack.len); // скопируем в структуру пакета данные массива
memcpy(pack.Bytes+2,&wid,4); // последние четыре байта - WID выделяемого моба
SendPacket(&pack); // инжектим
}
Длинна пакета неверна, должна быть 6
char fdata[30] Тут тоже надо 29
Последний раз редактировалось zasranecqwe1111; 23.01.2015 в 18:42.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Поправил, теперь так:
Код:
TargetMobPack(DWORD wid)
{
PACKET pack; // структура пакета
pack.len=6; // длина данных пакета
char Packet[] = "\x02\x00\x00\x00\x00\x00"; // массив данных пакета
memcpy(pack.Bytes,Packet,pack.len); // скопируем в структуру пакета данные массива
memcpy(pack.Bytes+2,&wid,4); // последние четыре байта - WID выделяемого моба
SendPacket(&pack); // инжектим
}
вылетает все равно. По сути,
Код:
char Packet[] = "\x02\x00\x00\x00\x00\x00";
- в реальности здесь же 7 символов, т.к компилятор C++ добавляет автоматически в конец \0.
Здесь также переделал:
Код:
char fdata[]="\x60\x8B\x0D\x00\x00\x00\x00\x8B\x49\x20\x68\x11\x11\x11\x11\x68\x22\x22\x22\x22\xB8\x33\x33\x33\x33\xFF\xD0\x61\xC3";
int lenfunc=29;
но у меня структура в клиенте немного другая (нашел адрес в CE примерно по гайду) : тык
[Ссылки могут видеть только зарегистрированные пользователи. ]
у меня версия клиента старая( 1.3.4 версии, сборка 2265 )
и я не нашел даже приблизительно одинаковых строчек подряд во всем elementclient
например команды "mov eax, dword ptr [PW_GAMERUN_ADDR]" у меня вообще нету, все начинается с BaseAdress а не с GameAdress,
прошу помощи где мне взять эти строки ( walk оффсеты имеются)
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось seergeeyy; 23.02.2016 в 22:56.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Спасибо большое за такое прекрасное руководство!
Уже на протяжении довольно долгого времени захожу на эту статью, перечитываю и сверяюсь на сколько больше начала понимать. Эта статья служит индикатором моего прогресса в С++ и win32 API.
А цель то в конечном итоге с полным пониманием каждого слова написать того самого бота.
Спасибо за Ваш труд!
Re: Как написать бота с нуля [Borland C++ Builder 6]
Вопрос ко всем, как сейчас обстоят дела с таким вот неприкрытым доступом к памяти клиента?
никак скрывать от протектора это не нужно?? Вопрос особенно касательно инъекций и пакетов
//////
не удается никаким вменяемым образом распечатать Ник персонажа и Локацию в консоль, чтобы получились читаемые символы. пример выше - не помог, среда VS2017 C++
Последний раз редактировалось dronte; 27.04.2017 в 20:35.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Не получается считать данные о персонаже из клиента, вместо моего текущего уровня (73) выдает -858993460
Сначала грешил на оффсеты, но CheatEngine по тому же адресу все нормально прочитал, как привести выводимое значение в нормальный вид?
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от BJIoM
Не получается считать данные о персонаже из клиента, вместо моего текущего уровня (73) выдает -858993460
Сначала грешил на оффсеты, но CheatEngine по тому же адресу все нормально прочитал, как привести выводимое значение в нормальный вид?
Может читаешь что-то не так? Покажи хотя бы код, офсеты, скажи версию PW, сервер...
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).