Re: Как написать бота с нуля [Borland C++ Builder 6]
Используй отправку пакетов для таргета
От этого же автора
Код:
void INJECTOR::TargetMob(DWORD wid)
{
PACKET pack; // структура пакета
pack.len=6; // длина данных пакета
char Packet[6] = "\x02\x00\x01\x00\x00\x00"; // массив данных пакета
memcpy(pack.Bytes,Packet,pack.len); // скопируем в структуру пакета данные массива
memcpy(pack.Bytes+2,&wid,4); // последние четыре байта - WID выделяемого моба
SendPacket(&pack); // инжектим
}
Re: Как написать бота с нуля [Borland C++ Builder 6]
Столкнулся с одной проблемой.
В 1 разделе PID определился правильно. Дошел до получения НР.
Выдает не четырёхбайтное значение а восьмибайтное - 4208432
Вывел значение PersStruct()
Label1->Caption=bot.client.get.PersStruct(); - четырёхбайтное
Может проблема в типе переменной функции myHP()?
int myHP() имеет тип Integer, PersStruct();тип DWORD. Пробовал изменять тип - одни эмоции компилятора)))
Использую Borland C++ Builder 6
Оффсеты взял правильные
________________
1. Админ всегда прав.
2. Если админ не прав - смотрите п.1
Re: Как написать бота с нуля [Borland C++ Builder 6]
Читать из памяти следует в переменную типа DWORD, ведь integer может получать отрицательные значения. Кроме того integer в различных системах имеет различную длину.
________________
Ни одно доброе дело не остается безнаказанным.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Перебрал весь код - все по гайду.
Выдает одинаковое значение ХП, МР, Lvla и то неправильное:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вчера ночью работало, утром уже нет %)
Решил проблему.
Открыл исходник бота - нашел строчки:
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от SPONKE
и зачем было все так усложнять в гайде)))
Затем, чтобы было понятно, откуда что берется.
Вообще, читать HP от GA (GA+0x20+OffsetHP) - это классика ботостроения. Так делали, когда еще не знали, что существует адрес BA. А чтобы чтение HP было быстрее, можно при запуске бота получить и запомнить адрес структуры перса - тогда чтение занимает только одно действие - PersStruct+OffsetHP.
Хотя, это все относится к стилю программиста - каждый пишет немного по своему.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от Dinmaite
Читать из памяти следует в переменную типа DWORD, ведь integer может получать отрицательные значения. Кроме того integer в различных системах имеет различную длину.
Кстати да, здесь как то интуитивно было принято что хп в инт поместится и не может быть больше 65535, а до этого значения int аналогичен DWORD(руоф всё-таки, хотя может быть есть и папы у которых и зашкаливает хп, но наверное не будут сажать бота на тру-перса)), но корректнее DWORD.
Добавлено через 7 минут
Во туплю спросоня, последний бит же определяет знак, так что int сопоставим с DWORD аш до значения 2147483647, такого ХП точно нет и на фришках))
А вообще, все эти одинаково-длинные типы различаются только "на бумажке", в памяти же представляют фактически одно и то же - определённое количество байт. Потому, если я уверен на 1000%, что значение всегда будет в пределах положительного значения INT, то на автомате и пишу INT. Максимум компилятор варнингом пнёт тебя, но ясно что зря он так пугается)). Извиняюсь за отступление, не судите строго)
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 29.01.2013 в 09:44.
Причина: Добавлено сообщение
Re: Как написать бота с нуля [Borland C++ Builder 6]
Доброе время суток. Ребят а кто нибудь мне может помочь изминить адрес в скрипте? я его там вообще не вижу. Или как это можно сделать? я только зарегистрировался если можно напишите впочту.
Re: Как написать бота с нуля [Borland C++ Builder 6]
Я не понял раздел пакеты, откуда брать данные для массива (как я понял они после обновы изменились), как их найти? Например откуда взялось "\x02\x00\x01\x00\x00\x00"; из значений для массива таргета.
Добавлено через 2 минуты
Ну или может кто скинет сразу готовые значения.
Последний раз редактировалось deman4ik; 26.02.2013 в 17:49.
Причина: Добавлено сообщение
Re: Как написать бота с нуля [Borland C++ Builder 6]
Цитата:
Сообщение от deman4ik
Я не понял раздел пакеты, откуда брать данные для массива (как я понял они после обновы изменились), как их найти? Например откуда взялось "\x02\x00\x01\x00\x00\x00"; из значений для массива таргета.
Добавлено через 2 минуты
Ну или может кто скинет сразу готовые значения.
пакеты меняются крайне редко и после этой обновы вроде не менялись. Ловятся PacketListener-ом (дай бог N00bSa1b0t здоровья)
саму структуру пакета можно или самомму постараться понять что там где или тут порыть - на мой памяти только в одном пакете она чуток поменялась, да и то на позапрошлой обнове
Что касаемо тарета, то там структура такая (значения в hex) 08 00 {00 00 00 00} , где то что в фигурных скобках - WID того кого берешь в таргет, просто 02 00 - это сброс таргета
Во вложении прикрепил то что когда-то нарыл на просторах интернета.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось gurin; 26.02.2013 в 22:56.
Ошибок не выдает. Использовал в качестве примера это сообщение.
Цитата:
Сообщение от dwa83
Считываю в массив а затем перевожу из юникода в анси. Я на билдере шестом пишу, потому приходится с юникодом колдовать, так как более поздние версии с ним норм работают.
1)определить массив для хранения считанных символов
2)считать юникод-строку имени или названия
(в основном строки в клиенте в юникоде, 2 байта на символ, строка оканчивается двойным нулём)
3)преобразовать в удобную для работы строку(я неревожу в анси)
Вот например функция считывания для структуры READER из этой статьи
addr - адрес строки юникода
mass - массив в который считываем
len - количество считываемых байт
Преобразовываю вот такой ерундой(самому не обязательно такие "велосипеды" писать, должны быть готовые средства)
len - количество СИМВОЛОВ(не байт), или проще указать размерность_массива/2
Код:
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;
}
Применительно к статье можно использовать например так
Код:
DWORD str_addr=...вычисляем адрес строки по нужным оффсетам
char str[40]={0};
get.Read_Mass(str_addr, str, 40); // считываем
AnsiString string=get.UnicodeToAnsi(str, 20);
вы неверно вычисляете адрес, адрес надо считать путем последовательного чтения значения участка памяти с последующим сложением смещения к результату, а не простым суммированием
правильно было бы так, правда пример на делфи
Код:
function ReadString(hProc: THandle; addr: int64): UnicodeString;
const
len = 255;
var
st: array [0..len] of widechar;
BytesCountOfRead: NativeUInt;
begin
if addr > 0 then
begin
ZeroMemory(@st, len*2);
ReadProcessMemory(hProc, ptr(addr), @st, len*2, BytesCountOfRead);
result := st;
end
else
result := '';
end;
function ChainReadAddr(hProc: THandle; const addresses: array of dword): DWORD;
var
BytesCountOfRead: NativeUInt;
i, len: Integer;
addr, NextAddr: DWORD;
begin
addr := 0;
len := length(addresses);
try
for i:=0 to len-1 do
begin
NextAddr := addresses[i];
if (addr+NextAddr+4 < $FFFFFFFF) then
begin
if i < len-1 then
ReadProcessMemory(hProc, ptr(addr+NextAddr), @addr, 4, BytesCountOfRead)
else
addr := addr+NextAddr;
end
else
begin
addr := 0;
break;
end;
end;
Result := addr;
except
Result := 0;
end;
end;
function ChainReadString(hProc: THandle; const addresses: array of dword): String;
var
addr: dword;
begin
addr := ChainReadAddr(hProc, addresses);
result := ReadString(hProc, addr);
end;
Re: Как написать бота с нуля [Borland C++ Builder 6]
Дошел до считывание координат мобов и наткнулся на такую ошибку
Код:
int nom=-1;
float Dist=100000;
for (int i=0; i<768; i++)
{
if (bot.client.get.mobWID(i)!=0)
//Суда цикл да же не заходит (проверил путем вывода в Label значения i)
{
if (bot.client.get.mobType(i) == 6)
{
if (bot.client.get.mobDist(i) < Dist)
{
Dist = bot.client.get.mobDist(i);
nom = i;
}
}
}
}
Подскажите в чем может быть дело
--------------
почему то в цикле он не захотел к i++ увеличивать, решил проблему путем прописи i++ в конце тела цикла
Последний раз редактировалось des99; 02.03.2013 в 16:11.
Причина: Нашел ошибку