Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Бот реагирующий на чат.

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 21.06.2016, 22:56   #1
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Бот реагирующий на чат.

Появилась задумка написать бота реагирующего на команды с чата.
Собственно сами действия бота уже написаны и волне работают, но не работает считывание чата, так сказать. Точнее программа вроде как считывает но в текстбоксе пусто, или null. Но null'ом он точно не может быть ибо СЕ показывает какие то знаки по данному адресу.

Считываю чат по адресу.
0x00E61250 + (1*0х1с + 0х08) + 0х0 - типо первое сообщение по идее.
в коде выглядит так (пишу на С#).

Цитата:
public string chat
{
get
{

return memory.ChainReadString_ASCII(0x00E61250 + (1*0x1c + 0x08) + 0x0, 32, 0);
}
}

Код считывания

Цитата:
public String ChainReadString_Unicode(Int32 address, Int32 length, params Int32[] offsets)
{
if (offsets.Length == 0) return ReadString_Unicode(address, length);

var tmpInt = ReadInt32(address);

for (var i = 0; i < offsets.Length - 1; i++)
{
tmpInt = ReadInt32(tmpInt + offsets[i]);
}

return ReadString_Unicode(tmpInt + offsets[offsets.Length - 1], length);


потом:

public String ReadString_Unicode(Int32 address, Int32 length)
{
int read; var buffer = new byte[length];

WinApi.ReadProcessMemory(OpenedProcessHandle, address, buffer, length, out read);

var enc = new UnicodeEncoding();
var rtnStr = enc.GetString(buffer);

return (rtnStr.IndexOf('\0') != -1) ? rtnStr.Substring(0, rtnStr.IndexOf('\0')) : rtnStr;
}
}

Может кто помочь? :с

P.S.
Оффсеты взяты из темки Уважаемого diagnost.
Пишется все на основе FrameWork'а Уважаемого krukovis.

Последний раз редактировалось Arsen0208; 21.06.2016 в 23:05.
  Ответить с цитированием
Старый 21.06.2016, 23:28   #2
 Разведчик
Аватар для Smerch
 
Smerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известен
Регистрация: 14.07.2009
Сообщений: 11
Популярность: 306
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 6 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

1) Если я правильно понял, то ReadString_Unicode читает по "0x00E61250 + (1*0x1c + 0x08) + 0x0", т.е. получается читает по адресу E61274, т.к. offsets = 0.
2) Длина каждого сообщения 0x24 байт, а не 0x1c.

Насчет первого не уверен, т.к. трудно разобраться, видя кусок кода. Второе точно правильно.

Последний раз редактировалось Smerch; 21.06.2016 в 23:34.
  Ответить с цитированием
Старый 21.06.2016, 23:29   #3
 Разведчик
Аватар для Hilling
 
Hilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личность
Регистрация: 05.09.2010
Сообщений: 32
Популярность: 1182
Сказал(а) спасибо: 38
Поблагодарили 12 раз(а) в 10 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

Строка Unicode, а считываешь ASCII

из старого:
chatStart = MyPersonage.memory.ReadInt32(PWOffssAndAddrss.Chat Base_Address);
pointerChatMessage = MyPersonage.memory.ReadInt32(chatStart + ((i * 0x24) + 0x8));
chatMessage = MyPersonage.memory.ReadString_Unicode(pointerChatM essage, 300);

Последний раз редактировалось Hilling; 21.06.2016 в 23:35.
  Ответить с цитированием
Старый 21.06.2016, 23:30   #4
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Бот реагирующий на чат.

Угу.
Пробовал читать как String_ASCII. Тоже ничего...


Как бы даже не суть в том что бы читать весь чат, только последнее сообщение.
Я так понял оно ведь здесь? ChatEnd = 00E61250 + 4.
Если да то считывание и там не дает никаких результатов...
  Ответить с цитированием
Старый 21.06.2016, 23:40   #5
 Разведчик
Аватар для Smerch
 
Smerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известен
Регистрация: 14.07.2009
Сообщений: 11
Популярность: 306
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 6 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

Код:
  ChatStruct=record
    uk1         : DWORD;
    TypeChat    : Byte;
    SmileSet    : Byte;
    uk2         : Byte;
    uk3         : Byte;
    uk4         : DWORD;
    Addr        : DWORD;
    ItemID      : DWORD;
    ID          : DWORD;
    uk5         : DWORD;
    uk6         : DWORD;
    WID         : DWORD;
  end;
  AllChat = array[0..4] of ChatStruct;

OldMsg: AllChat;

function TDemonAll.TGetNewMsg(): String;
var
  rez: AnsiString;
  NewMsg: AllChat;
  kolvoNewMsg: DWORD;
  i: byte;
begin
  NewMsg:= ReadChat(handleProcess);
  if (NewMsg[4].ID = 0) or (NewMsg[3].ID = 0) or (NewMsg[2].ID = 0) or (NewMsg[1].ID = 0) or (NewMsg[0].ID = 0) then
    begin
      OldMsg := NewMsg;
      exit;
    end;
  kolvoNewMsg := NewMsg[4].ID - OldMsg[4].ID;
  OldMsg := NewMsg;
  if kolvoNewMsg > 5 then
    kolvoNewMsg := 5;
  TGetNewMsg := '';
  for i:=kolvoNewMsg downto 1 do
    begin
      if OldMsg[5-i].TypeChat = $2 then
          begin
            rez := ReadMsgByAddr(handleProcess,OldMsg[5-i].uk4+$56);
            TGetNewMsg := rez;
            Exit;
          end;
    end;
end;

function ReadChat(handleProcess: DWORD): AllChat;
var
  ChatBegin,ChatCount,NoD: NativeUInt;
  mass: AllChat;
begin
  ReadProcessMemory(handleProcess,Pointer(OffChatBegin+$C),@ChatCount,sizeof(ChatCount),NoD);
  ReadProcessMemory(handleProcess,Pointer(OffChatBegin+$4),@ChatBegin,sizeof(ChatBegin),NoD);
  ChatBegin := DWORD(NativeUInt(ChatBegin) - $24*5);
  if ChatCount > 4 then
    ReadProcessMemory(handleProcess,Pointer(ChatBegin),@mass,5*$24,NoD)
  else
    ReadProcessMemory(handleProcess,Pointer(ChatBegin),@mass,ChatCount*$24,NoD);
  ReadChat := mass;
end;

function ReadMsgByAddr(handleProcess: DWORD;Addr: DWORD): String;
var
  mass: array[0..255] of Char;
  NoD: NativeUInt;
begin
  ReadProcessMemory(handleProcess,Pointer(Addr),@mass,sizeof(mass),NoD);
  ReadMsgByAddr:= mass;
end;
Так я реализовал в своем боте управление через ГЧ. При запуске потока, управляющего персонажем, я первоначально записываю 5 последних сообщений в чате в переменную OldCMsg. Далее через определенные промежутки времени, читаю последние 5 сообщений, если появились новые, проверяю их на наличие сообщений из ГЧ.
Мб поможет.

Последний раз редактировалось Smerch; 22.06.2016 в 02:03.
  Ответить с цитированием
Старый 21.06.2016, 23:51   #6
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Бот реагирующий на чат.

Опять страшный и непонятный Дельфи :с


Цитата:
из старого:
chatStart = MyPersonage.memory.ReadInt32(PWOffssAndAddrss.Chat Base_Address);
pointerChatMessage = MyPersonage.memory.ReadInt32(chatStart + ((i * 0x24) + 0x8));
chatMessage = MyPersonage.memory.ReadString_Unicode(pointerChatM essage, 300);

Int32 pointerChatMessage = memory.ReadInt32(0x00E61250 + ((0x9c) + 0x8));
return memory.ReadString_Unicode(pointerChatMessage, 300);

Если я правильно все написал тоо... результат тож никакой (по этому адресу в СЕ постонно меняется значение поэтому взял его).
  Ответить с цитированием
Старый 22.06.2016, 00:04   #7
 Разведчик
Аватар для Smerch
 
Smerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известен
Регистрация: 14.07.2009
Сообщений: 11
Популярность: 306
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 6 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

Код:
rez := ReadMsgByAddr(handleProcess,OldMsg[5-i].uk4+$56);
Вот тут, когда я читаю уже само сообщение, я к адресу, указанному в дескрипторе сообщения, прибавляю еще 0x56, т.к. перед непосредственным содержанием сообщения хранится еще много непонятной информации, включающей в себя имя персонажа и много другое (что именно, я не понял).
Для примера: написал в общий чат сообщение "pokapoka". В памяти оно хранится так:
Код:
5E 00 46 00 46 00 46 00 46 00 46 00 46 00 00 E0 3C 00 33 00 3E 00 3C 00
2D 00 31 00 3E 00 3C 00 30 00 3E 00 3C 00 30 00 3E 00 3C 00 31 00 2E 00 
30 00 30 00 30 00 30 00 30 00 30 00 3E 00 3C 00 3E 00 20 00 26 00 21 04 
42 04 30 04 3B 04 35 04 11 04 30 04 44 04 26 00 3A 00 20 00 70 00 6F 00 
6B 00 61 00 70 00 6F 00 6B 00 61 00
Красным выделено само сообщение "pokapoka"
  Ответить с цитированием
Старый 22.06.2016, 00:17   #8
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Бот реагирующий на чат.

Цитата:
Код:

rez := ReadMsgByAddr(handleProcess,OldMsg[5-i].uk4+$56);

Вот тут, когда я читаю уже само сообщение, я к адресу, указанному в дескрипторе сообщения, прибавляю еще 0x56, т.к. перед непосредственным содержанием сообщения хранится еще много непонятной информации, включающей в себя имя персонажа и много другое (что именно, я не понял).
Для примера: написал в общий чат сообщение "pokapoka". В памяти оно хранится так:
Код:

5E 00 46 00 46 00 46 00 46 00 46 00 46 00 00 E0 3C 00 33 00 3E 00 3C 00
2D 00 31 00 3E 00 3C 00 30 00 3E 00 3C 00 30 00 3E 00 3C 00 31 00 2E 00
30 00 30 00 30 00 30 00 30 00 30 00 3E 00 3C 00 3E 00 20 00 26 00 21 04
42 04 30 04 3B 04 35 04 11 04 30 04 44 04 26 00 3A 00 20 00 70 00 6F 00
6B 00 61 00 70 00 6F 00 6B 00 61 00

Красным выделено само сообщение "pokapoka"


Поменял, подставил и теперь не пустое поле! (теперь там целый вопросительный знак )

Цитата:
int Last = memory.ChainReadInt32(0x00E6125C);
return memory.ReadString_ASCII(((0x00E61250 +(Last*0x24+0x08))+0) + 0x56, 300);

Может проблема в компе? СЕ как я и говорил тоже не выдает нормальные сообщения (хотя ник мой бот читает на ура...)


А возможно ли как то считывать все в байтах как вы показали выше и уже байты расшифровывать в буквы и составлять сообщения? (Получить в качестве ответа именно всю таблицу)
  Ответить с цитированием
Старый 22.06.2016, 00:47   #9
 Разведчик
Аватар для Hilling
 
Hilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личность
Регистрация: 05.09.2010
Сообщений: 32
Популярность: 1182
Сказал(а) спасибо: 38
Поблагодарили 12 раз(а) в 10 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

В общем в CE найди сначала какое-нибудь сообщение из чата, а потом уже и в программе по этой цепочке считывай.
Чтобы быть уверенным, что у тебя код правильный. А он у тебя неправильный, потому что ты продолжаешь цитировать чтение ASCII-строки, хотя в игре она - юникод. В CE так же не забудь галочку напротив UNICODE поставить и кол-во считываемых символов увеличить, чтобы увидеть всю строку, а не несколько первых символов
  Ответить с цитированием
Старый 22.06.2016, 00:49   #10
 Разведчик
Аватар для Smerch
 
Smerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известен
Регистрация: 14.07.2009
Сообщений: 11
Популярность: 306
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 6 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

Цитата:
Сообщение от Arsen0208Посмотреть сообщение
Может проблема в компе? СЕ как я и говорил тоже не выдает нормальные сообщения (хотя ник мой бот читает на ура...)

Не думаю, что CE как зависит от компа. Раз не выдает нормальные сообщения значит где-то ошибка в оффсетах.
Вот так выглядит нахождение адреса последнего сообщения (в моем случае он равен 0x4235C16C)
[Ссылки могут видеть только зарегистрированные пользователи. ]
По адресу ChatEnd находится дескриптор, который указывает на статичную область памяти. Вычитая 0x1c, я попадаю на адрес последнего сообщения.

[Ссылки могут видеть только зарегистрированные пользователи. ]
В красной рамке - дескриптор, адрес которого находится в ChatEnd.
Выделено красным - 2 адреса, указывающие на статичную область. Не знаю зачем они нужны.
В зеленой рамке - дескриптор последнего сообщения.
Выделено зеленым - адрес последнего сообщения.

Последний раз редактировалось Smerch; 22.06.2016 в 00:51.
  Ответить с цитированием
Старый 22.06.2016, 01:03   #11
 Разведчик
Аватар для Hilling
 
Hilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личность
Регистрация: 05.09.2010
Сообщений: 32
Популярность: 1182
Сказал(а) спасибо: 38
Поблагодарили 12 раз(а) в 10 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

[Ссылки могут видеть только зарегистрированные пользователи. ]
Самое первое сообщение для PWI. Поменяй первый адрес на свой.
ChatNumber тебе показывает общее кол-во сообщений. Подставляя его в цепочку [[ChatStart]+((ChatNumber)*0x1C+0x08)]+0] - считаешь последнее

Последний раз редактировалось Hilling; 22.06.2016 в 01:05.
  Ответить с цитированием
Старый 22.06.2016, 01:15   #12
 Разведчик
Аватар для Arsen0208
 
Arsen0208 никому не известный тип
Регистрация: 24.10.2011
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Бот реагирующий на чат.

Сделано. СЕ отображает корректно сообщения.
Программа начала выдавать Китайские символы при адрессе.
Цитата:
return memory.ChainReadString_Unicode ((0x00E61254 - 0x1c) + 0x0, 0x300);

[Ссылки могут видеть только зарегистрированные пользователи. ]
  Ответить с цитированием
Старый 22.06.2016, 01:21   #13
 Разведчик
Аватар для Hilling
 
Hilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личность
Регистрация: 05.09.2010
Сообщений: 32
Популярность: 1182
Сказал(а) спасибо: 38
Поблагодарили 12 раз(а) в 10 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

return memory.ChainReadString_Unicode ((0xE61250+0x8) + 0x0, 0x300);
  Ответить с цитированием
Старый 22.06.2016, 01:21   #14
 Разведчик
Аватар для Smerch
 
Smerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известенSmerch скоро будет известен
Регистрация: 14.07.2009
Сообщений: 11
Популярность: 306
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 6 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

Цитата:
Сообщение от Arsen0208Посмотреть сообщение
Сделано. СЕ отображает корректно сообщения.
Программа начала выдавать Китайские символы при адрессе.


...

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

Цитата:
Сообщение от HillingПосмотреть сообщение
return memory.ChainReadString_Unicode ((0xE61250+0x8) + 0x0, 0x300);

Это адрес, чтобы читать самое первое сообщение в чате (из тех 199, которые хранятся в памяти).
  Ответить с цитированием
Старый 22.06.2016, 01:26   #15
 Разведчик
Аватар для Hilling
 
Hilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личностьHilling определенно авторитетная личность
Регистрация: 05.09.2010
Сообщений: 32
Популярность: 1182
Сказал(а) спасибо: 38
Поблагодарили 12 раз(а) в 10 сообщениях
 
По умолчанию Re: Бот реагирующий на чат.

Цитата:
Сообщение от SmerchПосмотреть сообщение
Попробуй написать свое сообщение на англ. языке и прочесть его, чтобы проверить правильно ли программа считывает. Вроде бы китайские символы появляются только при чтение русского текста.
Если с английским все будет нормально, то нужно будет далее мудрить с кодировкой.



Это адрес, чтобы читать самое первое сообщение в чате (из тех 199, которые хранятся в памяти).

Именно. Выведет его - сможет и любое другео считать. Он же вообще никакое сообщенеи прочитать не может в программе.
  Ответить с цитированием
Ответ


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

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

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

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

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

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net