Чтение строки из другого процесса средством WinAPI
Требуется прочитать значение строковой переменной другого процесса (в моем случае процесс "SA-MP 0.3").
[Ссылки могут видеть только зарегистрированные пользователи. ]
Нашел адрес этой строки ($00863974) и ее значение (mapname) через Cheat Engine. Далее сам код:
В результате чего выводится число: [Ссылки могут видеть только зарегистрированные пользователи. ]
Возник вопрос: как правильно вывести текстовую строку из другого процесса?
Re: Чтение строки из другого процесса средством WinAPI
Цитата:
Сообщение от MembRupt
Может адрес неверный или не unicode строка?
Насчет первого, я прикрепил отдельно скрин (см. самый первый пост, самую первую ссылку). Адрес верный. Насчет unicod/не unicod - каким способом определить?
Ваша проблема в том что вы прочитали 4 символа строки и переводите их в значение типа integer.
Вам надо было сначало создать массив н символов типа char ,где н = количество символов строки +1
Далее прочитать из процесса по адресу в этот массив строку,после просто её вывести функцией ShowMessage
Re: Чтение строки из другого процесса средством WinAPI
Цитата:
Сообщение от артём612
Ваша проблема в том что вы прочитали 4 символа строки и переводите их в значение типа integer.
Вам надо было сначало создать массив н символов типа char ,где н = количество символов строки +1
Далее прочитать из процесса по адресу в этот массив строку,после просто её вывести функцией ShowMessage
Re: Чтение строки из другого процесса средством WinAPI
Цитата:
Принцип ясен, а вот как это сделать — не знаю.
Пример был вам представлен.
Если его переделать под ваш код ,то должно получится примерно следующее...
Код:
var
HandleWindow: hWnd;
ProcessId: Cardinal;
hProcess: THandle;
Adress: dword;
readwrite: cardinal;
procedure TForm1.FormCreate(Sender: TObject);
var
//длина строки 21 символ
strfromprocess : array[0..20] of Char; //Char - для Ascii символов и WideChar для юникода
begin
ZeroMemory(@strfromprocess[0], sizeof(strfromprocess));//Обнуляем массив на случай если он будет содержать мусор
HandleWindow := FindWindow(nil, 'SA-MP 0.3');//Ищем окно игры
GetWindowThreadProcessId(HandleWindow,@ProcessId);//Получаем id процесса игры
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); //Открываем хандл процесса на доступ для функций чтения\записи в процесс
ReadProcessMemory(hProcess, $00863974, @strfromprocess[0], sizeof(strfromprocess), readwrite); //Читаем память процесса
//hProcess - дискриптор процесса
//$00863974 - Адрес где читаем память
//@strfromprocess[0] - Указатель на буфер куда читаем
//sizeof(strfromprocess) - Количество байт для чтения (Для Ascii 1 символ = 1 байт ,для Юникода 1 символ = 2 байта)
ShowMessage(strfromprocess); //Выводим прочитанную строку
end;
Re: Чтение строки из другого процесса средством WinAPI
Цитата:
Сообщение от артём612
Пример был вам представлен.
Если его переделать под ваш код ,то должно получится примерно следующее...
Код:
var
HandleWindow: hWnd;
ProcessId: Cardinal;
hProcess: THandle;
Adress: dword;
readwrite: cardinal;
procedure TForm1.FormCreate(Sender: TObject);
var
//длина строки 21 символ
strfromprocess : array[0..20] of Char; //Char - для Ascii символов и WideChar для юникода
begin
ZeroMemory(@strfromprocess[0], sizeof(strfromprocess));//Обнуляем массив на случай если он будет содержать мусор
HandleWindow := FindWindow(nil, 'SA-MP 0.3');//Ищем окно игры
GetWindowThreadProcessId(HandleWindow,@ProcessId);//Получаем id процесса игры
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); //Открываем хандл процесса на доступ для функций чтения\записи в процесс
ReadProcessMemory(hProcess, $00863974, @strfromprocess[0], sizeof(strfromprocess), readwrite); //Читаем память процесса
//hProcess - дискриптор процесса
//$00863974 - Адрес где читаем память
//@strfromprocess[0] - Указатель на буфер куда читаем
//sizeof(strfromprocess) - Количество байт для чтения (Для Ascii 1 символ = 1 байт ,для Юникода 1 символ = 2 байта)
ShowMessage(strfromprocess); //Выводим прочитанную строку
end;
Теперь вылезает пуская строчка xD:[Ссылки могут видеть только зарегистрированные пользователи. ]
P.S. код скопировал точно, перепроверил, ошибок быть не должно)
Re: Чтение строки из другого процесса средством WinAPI
В таком случае мне бы хотелось видеть область памяти, в которой записан текст. Но вероятно он попросту записан в юникоде. Соответственно массив должен быть типа wChar
________________
Ни одно доброе дело не остается безнаказанным.
Re: Чтение строки из другого процесса средством WinAPI
Цитата:
Сообщение от Dinmaite
В таком случае мне бы хотелось видеть область памяти, в которой записан текст. Но вероятно он попросту записан в юникоде. Соответственно массив должен быть типа wChar
[Ссылки могут видеть только зарегистрированные пользователи. ]
Re: Чтение строки из другого процесса средством WinAPI
Цитата:
Сообщение от артём612
strfromprocess : array[0..20] of Char; //Char - для Ascii символов и WideChar для юникода
Это если вы до сих пор сидите на морально усторевшей делфи 7.
Для более новых как раз таки Char = WideChar юникод строки
а вот AnsiChar это анси строка.
________________ Продаю приват читы для AION Absolute, desteny 3.5, Legend, Cataclysm, Ru, EU, NA Продаю многооконку на R2 Пишу читы на заказ под любые игры. Предложения в ЛС. Все мои читы/программы/статьи тут:http://zhyk.ru/forum/showpost.php?p=38501&postcount=21