Появилась задумка написать бота реагирующего на команды с чата.
Собственно сами действия бота уже написаны и волне работают, но не работает считывание чата, так сказать. Точнее программа вроде как считывает но в текстбоксе пусто, или null. Но null'ом он точно не может быть ибо СЕ показывает какие то знаки по данному адресу.
Считываю чат по адресу.
0x00E61250 + (1*0х1с + 0х08) + 0х0 - типо первое сообщение по идее.
в коде выглядит так (пишу на С#).
1) Если я правильно понял, то ReadString_Unicode читает по "0x00E61250 + (1*0x1c + 0x08) + 0x0", т.е. получается читает по адресу E61274, т.к. offsets = 0.
2) Длина каждого сообщения 0x24 байт, а не 0x1c.
Насчет первого не уверен, т.к. трудно разобраться, видя кусок кода. Второе точно правильно.
Последний раз редактировалось Smerch; 21.06.2016 в 23:34.
Угу.
Пробовал читать как String_ASCII. Тоже ничего...
Как бы даже не суть в том что бы читать весь чат, только последнее сообщение.
Я так понял оно ведь здесь? ChatEnd = 00E61250 + 4.
Если да то считывание и там не дает никаких результатов...
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.
Вот тут, когда я читаю уже само сообщение, я к адресу, указанному в дескрипторе сообщения, прибавляю еще 0x56, т.к. перед непосредственным содержанием сообщения хранится еще много непонятной информации, включающей в себя имя персонажа и много другое (что именно, я не понял).
Для примера: написал в общий чат сообщение "pokapoka". В памяти оно хранится так:
Вот тут, когда я читаю уже само сообщение, я к адресу, указанному в дескрипторе сообщения, прибавляю еще 0x56, т.к. перед непосредственным содержанием сообщения хранится еще много непонятной информации, включающей в себя имя персонажа и много другое (что именно, я не понял).
Для примера: написал в общий чат сообщение "pokapoka". В памяти оно хранится так:
Код:
Поменял, подставил и теперь не пустое поле! (теперь там целый вопросительный знак )
Цитата:
int Last = memory.ChainReadInt32(0x00E6125C);
return memory.ReadString_ASCII(((0x00E61250 +(Last*0x24+0x08))+0) + 0x56, 300);
Может проблема в компе? СЕ как я и говорил тоже не выдает нормальные сообщения (хотя ник мой бот читает на ура...)
А возможно ли как то считывать все в байтах как вы показали выше и уже байты расшифровывать в буквы и составлять сообщения? (Получить в качестве ответа именно всю таблицу)
В общем в CE найди сначала какое-нибудь сообщение из чата, а потом уже и в программе по этой цепочке считывай.
Чтобы быть уверенным, что у тебя код правильный. А он у тебя неправильный, потому что ты продолжаешь цитировать чтение ASCII-строки, хотя в игре она - юникод. В CE так же не забудь галочку напротив UNICODE поставить и кол-во считываемых символов увеличить, чтобы увидеть всю строку, а не несколько первых символов
Может проблема в компе? СЕ как я и говорил тоже не выдает нормальные сообщения (хотя ник мой бот читает на ура...)
Не думаю, что CE как зависит от компа. Раз не выдает нормальные сообщения значит где-то ошибка в оффсетах.
Вот так выглядит нахождение адреса последнего сообщения (в моем случае он равен 0x4235C16C)
[Ссылки могут видеть только зарегистрированные пользователи. ]
По адресу ChatEnd находится дескриптор, который указывает на статичную область памяти. Вычитая 0x1c, я попадаю на адрес последнего сообщения.
[Ссылки могут видеть только зарегистрированные пользователи. ]
В красной рамке - дескриптор, адрес которого находится в ChatEnd.
Выделено красным - 2 адреса, указывающие на статичную область. Не знаю зачем они нужны.
В зеленой рамке - дескриптор последнего сообщения.
Выделено зеленым - адрес последнего сообщения.
Последний раз редактировалось Smerch; 22.06.2016 в 00:51.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Самое первое сообщение для PWI. Поменяй первый адрес на свой.
ChatNumber тебе показывает общее кол-во сообщений. Подставляя его в цепочку [[ChatStart]+((ChatNumber)*0x1C+0x08)]+0] - считаешь последнее
Последний раз редактировалось Hilling; 22.06.2016 в 01:05.
Сделано. СЕ отображает корректно сообщения.
Программа начала выдавать Китайские символы при адрессе.
...
Попробуй написать свое сообщение на англ. языке и прочесть его, чтобы проверить правильно ли программа считывает. Вроде бы китайские символы появляются только при чтение русского текста.
Если с английским все будет нормально, то нужно будет далее мудрить с кодировкой.
Попробуй написать свое сообщение на англ. языке и прочесть его, чтобы проверить правильно ли программа считывает. Вроде бы китайские символы появляются только при чтение русского текста.
Если с английским все будет нормально, то нужно будет далее мудрить с кодировкой.
Это адрес, чтобы читать самое первое сообщение в чате (из тех 199, которые хранятся в памяти).
Именно. Выведет его - сможет и любое другео считать. Он же вообще никакое сообщенеи прочитать не может в программе.