[Статья] Как написать бота с нуля [Borland C++ Builder 6] - Страница 4 - Zhyk.Ru Forums
Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.Ru LIVE! Реклама на Zhyk.Ru Доска почета top.zhyk.ru (beta) Премиум-аккаунт

Как написать бота с нуля [Borland C++ Builder 6]

-

Разработка ПО для Perfect World

- Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World

Ответ
 
Опции темы Опции просмотра
Старый 07.12.2012, 06:49   #46
 Разведчик
Аватар для let999
 
let999 никому не известный тип
Регистрация: 06.10.2012
Сообщений: 3
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Спасибо, так и знал, что косячит в ассемблере

хм... исправил, косячит там же

Последний раз редактировалось let999; 07.12.2012 в 07:08. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 07.12.2012, 10:31   #47
 Разведчик
Аватар для qwer7074
 
qwer7074 никому не известный тип
Регистрация: 07.09.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию 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);                     // инжектим
}
  Ответить с цитированием
Старый 07.12.2012, 15:36   #48
 Разведчик
Аватар для let999
 
let999 никому не известный тип
Регистрация: 06.10.2012
Сообщений: 3
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Спасибо, разберусь, попробую.
  Ответить с цитированием
Старый 11.12.2012, 08:34   #49
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Кстати, все адреса указанные в темке - давние. Их скорее всего нужно будет поменять на корректные.
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝
  Ответить с цитированием
Старый 12.01.2013, 19:37   #50
 Разведчик
Аватар для SPONKE
 
SPONKE никому не известный тип
Регистрация: 03.01.2013
Сообщений: 2
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию 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
  Ответить с цитированием
Старый 12.01.2013, 19:45   #51
Reaper
 Фельдмаршал
Аватар для Dinmaite
 
Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(Dinmaite сломал счётчик популярности :(
Регистрация: 13.08.2009
Сообщений: 1,000
Популярность: 22697
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 107
Поблагодарили 827 раз(а) в 393 сообщениях
Отправить сообщение для Dinmaite с помощью ICQ
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Читать из памяти следует в переменную типа DWORD, ведь integer может получать отрицательные значения. Кроме того integer в различных системах имеет различную длину.
  Ответить с цитированием
Старый 12.01.2013, 20:46   #52
 Разведчик
Аватар для SPONKE
 
SPONKE никому не известный тип
Регистрация: 03.01.2013
Сообщений: 2
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Перебрал весь код - все по гайду.
Выдает одинаковое значение ХП, МР, Lvla и то неправильное:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вчера ночью работало, утром уже нет %)

Решил проблему.
Открыл исходник бота - нашел строчки:

DWORD READER::PersStruct()
{
DWORD buff = Read_32(GA);
return Read_32(buff+PERS_STRUCT);
}

отсчет велся сразу с GA)))
и зачем было все так усложнять в гайде)))

Всем спасибо, двигаюсь дальше
________________
1. Админ всегда прав.
2. Если админ не прав - смотрите п.1

Последний раз редактировалось SPONKE; 13.01.2013 в 01:33.
  Ответить с цитированием
Старый 13.01.2013, 03:06   #53
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от SPONKEПосмотреть сообщение
и зачем было все так усложнять в гайде)))

Затем, чтобы было понятно, откуда что берется.
Вообще, читать HP от GA (GA+0x20+OffsetHP) - это классика ботостроения. Так делали, когда еще не знали, что существует адрес BA. А чтобы чтение HP было быстрее, можно при запуске бота получить и запомнить адрес структуры перса - тогда чтение занимает только одно действие - PersStruct+OffsetHP.
Хотя, это все относится к стилю программиста - каждый пишет немного по своему.
  Ответить с цитированием
Старый 29.01.2013, 09:23   #54
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию 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. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 31.01.2013, 14:18   #55
 Разведчик
Аватар для micro-st
 
micro-st никому не известный тип
Регистрация: 31.01.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Доброе время суток. Ребят а кто нибудь мне может помочь изминить адрес в скрипте? я его там вообще не вижу. Или как это можно сделать? я только зарегистрировался если можно напишите впочту.
  Ответить с цитированием
Старый 26.02.2013, 17:47   #56
 Разведчик
Аватар для deman4ik
 
deman4ik никому не известный тип
Регистрация: 22.05.2011
Сообщений: 3
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Я не понял раздел пакеты, откуда брать данные для массива (как я понял они после обновы изменились), как их найти? Например откуда взялось "\x02\x00\x01\x00\x00\x00"; из значений для массива таргета.

Добавлено через 2 минуты
Ну или может кто скинет сразу готовые значения.

Последний раз редактировалось deman4ik; 26.02.2013 в 17:49. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.02.2013, 22:44   #57
 Сержант
Аватар для gurin
 
gurin душа компанииgurin душа компанииgurin душа компанииgurin душа компанииgurin душа компанииgurin душа компанииgurin душа компанииgurin душа компании
Регистрация: 18.12.2009
Сообщений: 152
Популярность: 1075
Сказал(а) спасибо: 45
Поблагодарили 204 раз(а) в 67 сообщениях
Отправить сообщение для gurin с помощью Skype™
 
По умолчанию 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 - это сброс таргета

Во вложении прикрепил то что когда-то нарыл на просторах интернета.
Вложения
Тип файла: zip packets.zip (6.6 Кб, 27 просмотров)
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось gurin; 26.02.2013 в 22:56.
  Ответить с цитированием
Старый 27.02.2013, 18:25   #58
 Разведчик
Аватар для des99
 
des99 никому не известный тип
Регистрация: 27.02.2013
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Здравствуйте)
Возник вопрос. Когда пытаюсь считать имя персонажа то выводиться пустое значение. Вывожу таким образом
Код:
DWORD str_addr = 0xA591E0 + 0x1C + 0x34 + 0x66C + 0x0;
 char str [40] = {0};
 bot.client.get.Read_Mass(str_addr, str, 40);
 Label5->Caption = bot.client.get.UnicodeToAnsi(str, 20);
Ошибок не выдает. Использовал в качестве примера это сообщение.

Цитата:
Сообщение от dwa83Посмотреть сообщение
Считываю в массив а затем перевожу из юникода в анси. Я на билдере шестом пишу, потому приходится с юникодом колдовать, так как более поздние версии с ним норм работают.

1)определить массив для хранения считанных символов
2)считать юникод-строку имени или названия
(в основном строки в клиенте в юникоде, 2 байта на символ, строка оканчивается двойным нулём)
3)преобразовать в удобную для работы строку(я неревожу в анси)

Вот например функция считывания для структуры READER из этой статьи
addr - адрес строки юникода
mass - массив в который считываем
len - количество считываемых байт
Код:
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);
}
Преобразовываю вот такой ерундой(самому не обязательно такие "велосипеды" писать, должны быть готовые средства)
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);

Подскажите из-за чего такое может быть?
  Ответить с цитированием
Старый 28.02.2013, 14:27   #59
 Сержант
Аватар для pw.assistant
 
pw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауру
Регистрация: 16.02.2012
Сообщений: 105
Популярность: 651
Сказал(а) спасибо: 19
Поблагодарили 39 раз(а) в 31 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от des99Посмотреть сообщение
DWORD str_addr = 0xA591E0 + 0x1C + 0x34 + 0x66C + 0x0;

вы неверно вычисляете адрес, адрес надо считать путем последовательного чтения значения участка памяти с последующим сложением смещения к результату, а не простым суммированием

правильно было бы так, правда пример на делфи

Код:
  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;
вызов

Код:
const
  game_addr       =  $00B9029C;
  GamerStructOfs = $34;
  ofsGamerName  = $670;
  
  GamerName  : array [1..4] of dword = (game_addr, GamerStructOfs, ofsGamerName, $0);

                              ***

  Name := ChainReadString(hProc, GamerName);
________________
backup - акт проявления трусости

Последний раз редактировалось pw.assistant; 28.02.2013 в 15:09.
  Ответить с цитированием
Старый 02.03.2013, 14:33   #60
 Разведчик
Аватар для des99
 
des99 никому не известный тип
Регистрация: 27.02.2013
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию 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. Причина: Нашел ошибку
  Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Написать бота! romel Вопросы и ответы, обсуждения 2 10.02.2012 17:39
[Помогите!] Как же написать бота? ХАМнаМИЛЛИОН Школа Читера 3 29.07.2011 19:58
[Помогите!] написать бота @ndreyk@ Общение и обсуждение Perfect World 32 23.07.2011 12:32
[Помогите!] хочу написать бота! Фестер Аддамс Общение и обсуждение (Тюряга ВК) 7 31.01.2011 21:36

www.webmoney.ru
Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 12:42.

Пишите нам: forum@zhyk.ru
Copyright © 2019 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net