| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |