|
Вопрос # 4 781/ вопрос открыт / |
|
Здравствуйте!
В процессе создания программы, я сталкнулся с броблемой записи string в память прцесса.
Всё, что нужно - ввести в Edit любой текст и по нажатию на Button, в процессе, в адресе, отображается то, что и Edit.
Как это реализовать? Какие функции необходимы?
 |
Вопрос задал: 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 (статус: Посетитель), 3 декабря 2010, 12:29 [#2]:
Вроде как умеем
|
|
min@y™ (статус: Доктор наук), 3 декабря 2010, 12:58 [#3]:
WriteProcessMemory()? Или я чего-то не понимаю?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 3 декабря 2010, 13:38 [#5]:
Вместо Pointer(AValue) попробуй PChar(AValue).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
RamzeS (статус: Посетитель), 3 декабря 2010, 13:55 [#6]:
Ошибка:
[DCC Error] Unit1.pas(1030): E2033 Types of actual and formal var parameters must be identical
|
|
min@y™ (статус: Доктор наук), 3 декабря 2010, 15:02 [#7]:
Тогда Pointer(PChar(AValue)).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
RamzeS (статус: Посетитель), 3 декабря 2010, 15:24 [#8]:
Снова ошибка:
[DCC Error] Unit1.pas(1030): E2197 Constant object cannot be passed as var parameter
|
|
min@y™ (статус: Доктор наук), 3 декабря 2010, 15:57 [#9]:
В какой строке?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
RamzeS (статус: Посетитель), 3 декабря 2010, 16:03 [#10]:
В этой:
Result := write_value5 (WindowTitle, Address, ASize, Pointer(PChar(AValue)));
|
|
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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|