Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от gurin
P.S. 768 итераций - не самый лучший вариант.
ну да, ну да ладно, кому нужно, будут сортированный список использовать, мне просто так проще было
Цитата:
Сообщение от des99
Здравствуйте)
Возник вопрос. Когда пытаюсь считать имя персонажа то выводиться пустое значение. Вывожу таким образом
Прочитайте в темке внимательнеей
Цитата:
Сообщение от dwa83
Теперь сделаем считывание данных какого-нибудь моба.
Всё по аналогии, но не совсем. Идём в тему с оффсетами и видим целых 2 цепочки смещений
BA +0x1C +0x1C +0x24 +0x14 Count, dword /Количество/
BA +0x1C +0x1C +0x24 +0x18 +(i*0x4) +0x4 /i = 0 - 0x300/
Mоб не один, как наш персонаж, их много, и в памяти клиента структуры мобов расположены массивом, причём этих массивов два, упорядоченный и неупорядоченный.
Эти две цепочки смещений и приводят нас к данным этих массивов. Мы будем использовать неупорядоченный. В упорядоченном количество записей меняется так как количество мобов вокруг меняется, и номер одного и того же моба в этом массиве может изменяться со временем. Это для некоторых не очень удобно. Но у несортированного массива своя фишка. Один и тот же моб всегда в нём занимает одно и то же положение по порядку. Массив расчитан на 768(0x300 hex) мобов, но ведь вокруг нет столько, поэтому некоторые места пустуют. Причём существующие мобы расположены не по порядку в нём, а могут быть раскиданны по всему массиву.
Итак берём вторую цепочку смещений, она для несортированного массива мобов.
Прочитав адреса по цепочке BA +0x1C +0x1C +0x24 +0x18 +(i*0x4) +0x4 мы получим адрес структуры моба с номером i. Если вместо адреса структуры мы получили 0, значит моба в этом месте массива нет и место пустует. Напишем в ридере новую функцию, которая будет возвращать адрес структуры моба по номеру(по аналогии с адресом структуры перса, но у перса номера не было.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Проблема может быть в неправильных оффсетах или самой функции, после написания статьи было много обновлений и данные могли поменяться. Просьба указывать как именно исправили чтоб работало, у других с подобной проблемой будет меньше головной боли
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 11.05.2013 в 02:26.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Внимательным быть, заместо адреса GA, подставил его смещение
__________________________________________________ ____
По части клиент-сервер возник вопрос, у сина инвиз похож на ГМ-инвиз и если так, то данные о синах/ГМ в инвизе подгружается в массив игроков которые находятся вблизи или нет?
Последний раз редактировалось des99; 16.05.2013 в 09:55.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Всем добрый день!
Я пытаюсь написать бота по статьям данного сайта, за месяц получилось
сделать почти все, бот выделяет мобов ,бъет их собирает лут, пьет банки, вобщем сайт очень полезен)).
Но никак не получается сделать передвижение по координатам, голова уже идет кругом.
Вот сама функция инжекта движения:
void INJECTOR::MoveTo(float x, float y, float z, int walkmode)
{
char fdata[117]="\x60\xA1\x00\x00\x00\x00\x8B\xB0\x11\x11\x11\ x11 \x8B\x8E\x22\x22\x22\x22\x6A\x01\xBB\x33\x33\x33\x 33\xFF\xD3\x89\xC7\x8D\x44\xE4\x0C\x50\x68\x44\x44 \x44\x44\x89\xF9\xBB\x55\x55\x55\x55\xFF\xD3\x8B\x 8E\x66\x66\x66\x66\x6A\x00\x6A\x01\x57\x6A\x01\xBB \x77\x77\x77\x77\xFF\xD3\xA1\x88\x88\x88\x88\x8B\x 80\x99\x99\x99\x99\x8B\x80\xAA\xAA\xAA\xAA\x8B\x40 \x30\x8B\x48\x04\xB8\xBB\xBB\xBB\xBB\x89\x41\x20\x B8\xCC\xCC\xCC\xCC\x89\x41\x24\xB8\xDD\xDD\xDD\xDD \x89\x41\x28\x61\xC3";
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от des99
По части клиент-сервер возник вопрос, у сина инвиз похож на ГМ-инвиз и если так, то данные о синах/ГМ в инвизе подгружается в массив игроков которые находятся вблизи или нет?
Нет, сервер не отсылает пакеты о координатах сина в инвизе. Это отлично видно через Pandora_s_Box — клиенту эта информация не передается.
Последний раз редактировалось Desmond Hume; 14.08.2013 в 07:28.
Причина: Вместо сина написал сервер
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Полностью по уроку. Все циферки выводит как надо, А Никнейм не хочет... Выводит какой то 1 знак.
чтобы вывести ник создайте массив типа char и туда считывайте ник
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Re: Как написать бота с нуля [Borland C++ Builder 6]
Всем привет!
Похоже тема с ником персонажа актуальна)
У меня таже проблема, не получается правильно считать ник своего персонажа, приведу код, может кто чем поможет).
Код:
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
Уважаемые гуру, намекните хотя бы на правильное направление), заранее спасибо!
Последний раз редактировалось Smertig; 26.12.2014 в 22:03.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Имя как и любой текст - массив байт, нужно прочитать эти байты в массив , а потом кодировать в текст. Я поступал следующим образом: 1) выделял большой массив (255) 2) считывал эти данные в массив 3) обрезал этот массив до нулей 4) конвертировал
Vb.net:
Код:
Declare Function ReadProcessMemory1 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Byte, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Public Function Read_String() As String
Dim i As Integer
Dim StringBuffer As Byte() = New Byte(255) {}
If Me.Adres_And <> -1 Then
ReadProcessMemory1(Me.Hendle, (Me.Adres + Me.Adres_And), StringBuffer(0), StringBuffer.Length, Nothing) ' (Me.Adres + Me.Adres_And) - адрес структуры массива
Else
ReadProcessMemory1(Me.Hendle, (Me.Adres), StringBuffer(0), StringBuffer.Length, Nothing)
End If
For i = 0 To (StringBuffer.Count - 1) Step 2
If StringBuffer(i) = 0 And StringBuffer(i + 1) = 0 Then
If i > 0 Then
ReDim Preserve StringBuffer(i - 1)
Return System.Text.Encoding.Unicode.GetString(StringBuffer)
Else
Return ""
End If
End If
Next
End Function