Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 781

/ вопрос открыт /

Здравствуйте!
В процессе создания программы, я сталкнулся с броблемой записи string в память прцесса.

Всё, что нужно - ввести в Edit любой текст и по нажатию на Button, в процессе, в адресе, отображается то, что и Edit.

Как это реализовать? Какие функции необходимы?

RamzeS Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: RamzeS (статус: Посетитель)
Вопрос отправлен: 3 декабря 2010, 12:10
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, RamzeS!
пускай, writebyte(adress:cardinal; data:byte); это процедура, которая может записать указанный байт по заданному адресу. тогда

s := Edit1.text;
for i:=1 to length(s) do
  writebyte(start_adress+i, ord(s[i]));
где start_adress - это адрес, с которого нужно начать запись данных.
Это все дело, конечно можно оптимизировать, вроде есть функции, которые могут оперировать массивами, тогда можно им просто передавать начало массива - s[1], а не саму строку.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 3 декабря 2010, 13:11


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 4 декабря 2010, 08:15; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 3 декабря 2010, 12:22 [#1]:

а писать в нужный процесс байты умеем?
Галочка "подтверждения прочтения" - вселенское зло.
RamzeS

RamzeS (статус: Посетитель), 3 декабря 2010, 12:29 [#2]:

Вроде как умеем
min@y™

min@y™ (статус: Доктор наук), 3 декабря 2010, 12:58 [#3]:

WriteProcessMemory()? Или я чего-то не понимаю?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
RamzeS

RamzeS (статус: Посетитель), 3 декабря 2010, 13:21 [#4]:

Вот код, который есть:

function Write_String (var WindowTitle: String; Address: Pointer; var ASize: Cardinal; var AValue: String): Byte;
begin
Result := write_value5 (WindowTitle, Address, ASize, Pointer(AValue));
end;

function write_value5 (var WindowTitle: String; Addres: Pointer; var ASize: Cardinal; var AValue: Pointer): Byte;
var
WindowH: DWORD;
ProcessId: DWORD;
ProcessH: DWORD;
begin
WindowH := FindWindowByText (WindowTitle);
if WindowH = 0 then begin
Result := 1;
Exit;
end;

GetWindowThreadProcessId (WindowH, ProcessId);
ProcessH := OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);

if WriteProcessMemory (ProcessH, Addres, AValue, ASize, ASize) then
Result := 0
else
Result := 2;

CloseHandle (ProcessH);
end;

procedure TfmMain.SpeedButton56Click(Sender: TObject);
var
s: String;
Size: Cardinal;
Adr: Pointer;
wt: String;
begin
wt:= 'имя_процесса';
s:= Edit10.Text;
Adr:= Pointer($7D9658);
Size:= Length (s);
if Write_String5 (wt, Adr, Size, s) <> 0 then
ShowMessage ('Ошибка!');
end;

Но при этом не получается, отправляется только 1 символ
min@y™

min@y™ (статус: Доктор наук), 3 декабря 2010, 13:38 [#5]:

Вместо Pointer(AValue) попробуй PChar(AValue).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
RamzeS

RamzeS (статус: Посетитель), 3 декабря 2010, 13:55 [#6]:

Ошибка:
[DCC Error] Unit1.pas(1030): E2033 Types of actual and formal var parameters must be identical
min@y™

min@y™ (статус: Доктор наук), 3 декабря 2010, 15:02 [#7]:

Тогда Pointer(PChar(AValue)).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
RamzeS

RamzeS (статус: Посетитель), 3 декабря 2010, 15:24 [#8]:

Снова ошибка:
[DCC Error] Unit1.pas(1030): E2197 Constant object cannot be passed as var parameter
min@y™

min@y™ (статус: Доктор наук), 3 декабря 2010, 15:57 [#9]:

В какой строке?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
RamzeS

RamzeS (статус: Посетитель), 3 декабря 2010, 16:03 [#10]:

В этой:

Result := write_value5 (WindowTitle, Address, ASize, Pointer(PChar(AValue)));
min@y™

min@y™ (статус: Доктор наук), 4 декабря 2010, 08:15 [#11]:

Тогда попробуй так:
var
  P: Pointer;
begin
  P:= Pointer(PChar(AValue));
  Result := write_value5 (WindowTitle, Address, ASize, P);
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.03 сек.