Текст в памяти

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Текст в памяти

Сообщение Res5 » 11.11.2013 (Пн) 4:39

Есть адрес в памяти, с текстом неопределенной длины. Как через "ReadProcessMemory" в проекте вывести содержимое этого адреса? Если это число, то получается нормально, а вот с текстом выводит непонятно что.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Текст в памяти

Сообщение Mikle » 11.11.2013 (Пн) 9:28

Может текст юникодный? Или наоборот ASCII, а ты пытаешься вывести, как юникод?

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 11.11.2013 (Пн) 19:05

Что это за кодировка такая?
Вложения
Новый точечный рисунок (3).jpg
Новый точечный рисунок (3).jpg (1.22 Кб) Просмотров: 7908

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.11.2013 (Пн) 19:12

Ты уверен, что правильный адрес читаешь?

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 11.11.2013 (Пн) 19:22

Да уверен CE правильно показывает. Может я неправильно строку читаю

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Текст в памяти

Сообщение FireFenix » 12.11.2013 (Вт) 0:14

Res5 писал(а):CE

CheatEngine?
Однако здравствуйте!

Ты прими из VB не строку, а побайтно и посмотри сходятся ли байты и как они идут
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 12.11.2013 (Вт) 1:13

ок попробую

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 12.11.2013 (Вт) 5:54

как байты в строку перевести?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 6:24

А зачем ReadProcessMemory? Адрес принадлежит адресному пространсству чужого процесса?

Res5 писал(а):как байты в строку перевести?

В общем случае — никак.
В тысячи частных случаев существует тысяча решений.

Отбросить всё, забыть о всех и прочитать вот эту статью особо внимательно.

Затем помедитировать о том, есть ли информация (явлная или подразумеваемая) о том, в какой кодировке находится строка.

VB внутри себя все строки представляет в юникоде. Windows NT внутри себя представляет строки в юникоде. Все цивилизованные люди исопльзуют для строк юникод. Причём речь идёт про UCS-2.

Если на твоё счастье строка по известному адресу уже лежит в кодировке UCS-2, то дело за малым. Осталось только узнать её длину. Если она NULL-терминированная, то окей, в ином случае нужно будет каким-то образом узнать её длину самому. Дальше, чтобы уж сделать из неё полноценную строку COM (а следовательно и полноценную строку для VB): SysAllocString или SysAllocStringLen.

Если счастья не происходит, и строка не в UCS-2 (а пусть даже в UTF-8, а то и чего похуже: в одной из национальных кодировок), то нужно использовать MultiByteToWideChar, прежде чем проделывать вышеописанное (SysAllocString).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 12.11.2013 (Вт) 7:09

Процесс игры, юникод

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 12.11.2013 (Вт) 7:54

Код: Выделить всё
      ReadProcessMemory(hProcess, ptr(ChatStartAddr), @start_addr, sizeof(start_addr), BytesCountOfRead);
      ReadProcessMemory(hProcess, ptr(ChatNumberAddr), @ChatLen, sizeof(ChatLen), BytesCountOfRead);
      for strNo := 0 to ChatLen-1 do
      begin
        str[0] := #0;
        i := 0;
        try
          ReadProcessMemory(hProcess, ptr(start_addr + ((StrNo * $1C) + $8)), @addr, sizeof(addr), BytesCountOfRead);
          if addr <> 0 then
          repeat
            ReadProcessMemory(hProcess, ptr(addr), @ch, 2, BytesCountOfRead);
            str[i] := ch;
            addr := addr + 2;
            inc(i);
          until (ord(ch) = 0) or (i >= High(str));
        except
        end;
        if i >= 1 then
          str[i] := #0;
        st := Str;
        Chat.Add(st);
      end;


рабочая версия, но к соажалению это делфи(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 8:13

Res5 писал(а):Процесс игры, юникод

Ты не читал статью. Иди читай, потом возвращайся и продолжим.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Res5
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 07.09.2013 (Сб) 3:11

Re: Текст в памяти

Сообщение Res5 » 12.11.2013 (Вт) 15:09

Статью я смотрел, только всеравно не понял как она поможет мне сванговать код.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 16:32

Res5 писал(а):рабочая версия, но к соажалению это делфи(

По-моему, читать блоками по 2 байта всё-таки извращение... Если я правильно идею понял.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 16:36

Res5 писал(а):Статью я смотрел, только всеравно не понял как она поможет мне сванговать код.

Статью надо читать, а не смотреть. А потом медитировать.

Статья не содержит простого ответа на вопрос, а содержит пищу для ума. Которую нужно будет переварить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 16:40

Хакер писал(а):Статья не содержит простого ответа на вопрос, а содержит пищу для ума. Которую нужно будет переварить.

И какое отношение она имеет к этой теме сейчас?
По делфи-коду видно, что читается юникодная (UTF-16) строка, завершаемая нулём.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Текст в памяти

Сообщение ger_kar » 12.11.2013 (Вт) 16:46

Res5 писал(а):рабочая версия, но к соажалению это делфи(
Лучше свой вариант приведи. Тот код, который у тебя неправильно выводит строку.

Qwertiy писал(а):По-моему, читать блоками по 2 байта всё-таки извращение...
В принципе да. Такое чтение из чужого процесса будет сопровождаться кучей не нужных накладных расходов. Проще за один раз скопировать всю строку.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 16:48

Qwertiy писал(а):По делфи-коду видно, что читается юникодная (UTF-16) строка, завершаемая нулём.

Я даже не читал его.

Имеет значение, что хочет автор (что нужно автору), и не имеет значения, что делает какой-то код, который ему удалось найти, даже если кому-то (включая автора) кажется, что код далает именно то, что надо.

Даже если просто написать автору правильный код, пока у автора не возникнет понимания картины, это будет сродни обмену заклинаниями.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 16:50

ger_kar писал(а):Проще за один раз скопировать всю строку.

Эм.. Длина неизвестна. И границы страниц наверное пересекать не стоит, на случай если там другая защита (ну строки там естественно не будет в таком случае). Хотя это мои предположения. Не знаю что будет, если пытаться прочитать лишее - может функция и сама разберётся...

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 16:55

Хакер писал(а):и не имеет значения, что делает какой-то код, который ему удалось найти, даже если кому-то (включая автора) кажется, что код далает именно то, что надо.

Я так понимаю, фраза "рабочая версия" означает, что этот код делает именно то что нужно и оно никому не кажется. Ошибиться с кодировкой при этом весьма сложно, поскольку там UTF-16. Да и вообще, не особо-то другие юникодные кодировки растространены в качестве способа хранения данных в памяти.

Хакер писал(а):Даже если просто написать автору правильный код, пока у автора не возникнет понимания картины, это будет сродни обмену заклинаниями.

А смысл тыкать в конкретную статью, которая к вопросу уже не относится? Изначально были варианты, что там какая-то левая кодировка, но сейчас-то они отвалились. И знание разновидностей юникода при известном способе представления вообще никак делу не помогает. Так зачем же?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Текст в памяти

Сообщение ger_kar » 12.11.2013 (Вт) 17:05

Qwertiy писал(а):Эм.. Длина неизвестна.
Не факт. Вообще можно провести эксперимент и точно это выяснить, но это сможет сделать только сам автор. Самое лучшее в этом случае посмотреть на его код и наверняка станет понятно, что он делает не так.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 17:08

ger_kar писал(а):Не факт.

Согласен что не факт, но делфятина читает до завершающего нуля...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 19:09

Qwertiy писал(а):весьма сложно, поскольку там UTF-16.

Похоже, ты сам не знаешь разницы между UTF-16 и UCS-2?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Текст в памяти

Сообщение ger_kar » 12.11.2013 (Вт) 19:16

Qwertiy писал(а):Согласен что не факт, но делфятина читает до завершающего нуля...

А как быть с этим?
ReadProcessMemory(hProcess, ptr(ChatNumberAddr), @ChatLen, sizeof(ChatLen), BytesCountOfRead)
until (ord(ch) = 0) or (i >= High(str))
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 19:23

Хакер писал(а):Похоже, ты сам не знаешь разницы между UTF-16 и UCS-2?

Ладно, расскажи.
Гугл по UCS-2 первой же показывает статью википедии об UTF-16, там есть ссылка на
What is the difference between UCS-2 and UTF-16? писал(а):UCS-2 is obsolete terminology which refers to a Unicode implementation up to Unicode 1.1, before surrogate code points and UTF-16 were added to Version 2.0 of the standard. This term should now be avoided.

UCS-2 does not define a distinct data format, because UTF-16 and UCS-2 are identical for purposes of data exchange. Both are 16-bit, and have exactly the same code unit representation.

Sometimes in the past an implementation has been labeled "UCS-2" to indicate that it does not support supplementary characters and doesn't interpret pairs of surrogate code points as characters. Such an implementation would not handle processing of character properties, code point boundaries, collation, etc. for supplementary characters.


ger_kar писал(а):А как быть с этим?

A что это? Я не разбираюсь в паскалях.
Вроде как проверка, что оно влазиет в ту строку, которую мы формируем сейчас и прередача адреса переменной, которая не используется?

PS: В .NET'е вообще UTF-16 названа Encoding.Unicode, а остальные живут под своими именами.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Текст в памяти

Сообщение ger_kar » 12.11.2013 (Вт) 19:43

Qwertiy писал(а):Вроде как проверка, что оно влазиет в ту строку
Да и в @ChatLen возвращается длина, поэтому можно прочитать за раз весь буфер, а не устраивать чтение по 2 байта.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 20:03

Qwertiy писал(а):Гугл по UCS-2 первой же показывает статью википедии об UTF-16, там есть ссылка на

Всё правильно. UCS-2 — более простая штука, нежели UTF-16. В кодировке UCS-2 каждый word (пара байтов) будет одним символов и число символов жестко соответствует числу байтов, тогда как в UTF-16 ты не можешь сказать, сколько в строке символов, не проходясь по всей цепочке.

Поэтому, если тебе нужна строка в UCS-2, ты не можешь просто взять, спрятать голову в песок, скопировать UTF-16 строку в UCS-2-совместимый буфер и притвориться, что всё хорошо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Текст в памяти

Сообщение ger_kar » 12.11.2013 (Вт) 20:11

Хакер писал(а):Поэтому, если тебе нужна строка в UCS-2, ты не можешь просто взять, спрятать голову в песок, скопировать UTF-16 строку в UCS-2-совместимый буфер и притвориться, что всё хорошо.
А если делать наоборот и строку UCS-2 копировать в UTF-16 совместимый буфер, то все будет хорошо и ничего не надо мудрить?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.11.2013 (Вт) 20:52

Хакер писал(а):Всё правильно. UCS-2 — более простая штука, нежели UTF-16.
Поэтому, если тебе нужна строка в UCS-2, ты не можешь просто взять, спрятать голову в песок, скопировать UTF-16 строку в UCS-2-совместимый буфер и притвориться, что всё хорошо.

Т. е. ты утверждаешь, что на www.unicode.org написана неправда?

Хакер писал(а):тогда как в UTF-8

При чём тут вообще UTF-8?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Текст в памяти

Сообщение Хакер » 12.11.2013 (Вт) 21:27

Qwertiy писал(а):Т. е. ты утверждаешь, что на www.unicode.org написана неправда?

В чём именно? Где?

Qwertiy писал(а):При чём тут вообще UTF-8?

Это была простая опечатка.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 82

    TopList