Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2009, 21:23   #1
GRA1N
 
Аватар для GRA1N
 
Регистрация: 25.07.2009
Сообщений: 7
По умолчанию Импорт данных из памяти, прибавление к ним значение и запись

Доброго времени суток, уважаемые форумчане
Недавно начал изучать делфи. Столкнулся с проблемой, просто ступор.
Пишу програмку. Суть:

Есть приложение. Необходимо при нажатии кнопки обратиться к приложению, взять из его памяти некоторую информацию (из определенного адреса), записать его, прибавить к нему какое-то значение и снова записать.

Сделать запись определенного значения в память получается.

Но мне нужно, чтобы к существующему значению прибавлялась циферка, например, значение + 10 и потом уже вписывалось в память. Но постоянно выходят какие-то ошибки. Изнасиловал гуглю, он мне ничего по теме не выдал. Логику действий представляю, но как это должно выглядеть на делфи - ума не приложу.


Проблемный код:
Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
ReadProcessMemory(HandleWindow, ptr(Address2), buf, 1, dwReaded);
si:=buf;
FreeMem(buf);
GetMem(buf,1);
xwx:=si;
yyy:=(xwx+xxx);
buf^ := Chr(yyy);
WriteProcessMemory(HandleWindow,ptr(Address2),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;





Код приложения в целом:

Код:

unit FH;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    Button4: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
Form1: TForm1;
WindowName : integer;
ProcessId : integer;
ThreadId : integer;
buf,Result: PChar;
HandleWindow : Integer;
si : string;
yyy : integer;
xwx : integer;
write : cardinal;
dwReaded : DWord;
Const
WindowTitle1 = 'ИМЯ_ОКНА_ПРИЛОЖЕНИЯ';
Address = $04692F6D;
PokeValue1 = $C9;
PokeValue2 = $E9;
NumberOfBytes = 1;
Address2 = $04692F4E;
xxx = $9;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
WindowName := FindWindow(nil,WindowTitle1);
// WindowName := FindWindow(nil,WindowTitle2);

ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

GetMem(buf,1);
buf^ := Chr(PokeValue1);
WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin

ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

GetMem(buf,1);
buf^ := Chr(PokeValue2);
WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
ReadProcessMemory(HandleWindow, ptr(Address2), buf, 1, dwReaded);
si:=buf;
FreeMem(buf);
GetMem(buf,1);
xwx:=si;
yyy:=(xwx+xxx);
buf^ := Chr(yyy);
WriteProcessMemory(HandleWindow,ptr(Address2),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);
end;

end.
Пробовал по-всякому, постоянно компилятор выдает какие-то ошибки. А если не выдает - то ошибки выдает само приложение(


Заранее благодарен за ответ
GRA1N вне форума Ответить с цитированием
Старый 26.07.2009, 00:45   #2
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Цитата:
Недавно начал изучать делфи. Столкнулся с проблемой, просто ступор.
К примеру я уже давно пишу в Делфи на любительском уровне и ничего из кода не понял

Попробуйте погуглить каждую вызываемую процедуру из "проблемного" куска и разобраться кто и что должен возлвращать...
Если вы взялись за такую программу, то должны понимать что должно получаться после выполнения каждой процедуры.. Ну а дальше брекпоинты, рассуждения, анализ данных и пр.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 26.07.2009, 00:59   #3
GRA1N
 
Аватар для GRA1N
 
Регистрация: 25.07.2009
Сообщений: 7
По умолчанию

Цитата:
Попробуйте погуглить каждую вызываемую процедуру из "проблемного" куска и разобраться кто и что должен возлвращать...
Если вы взялись за такую программу, то должны понимать что должно получаться после выполнения каждой процедуры.. Ну а дальше брекпоинты, рассуждения, анализ данных и пр.
Ну программа на самом деле элементарная. Просто у меня в данный момент ступор
По функции ReadProcessMemory я в гугле не нашел практически ничего, за что можно ухватиться(
Мне очень нужна подсказка, чтобы сдвинуться с мертвой точки
GRA1N вне форума Ответить с цитированием
Старый 26.07.2009, 01:04   #4
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Информация по функциям найти не проблема.. Самое сложное это понять что там написали

http://vsokovikov.narod.ru/New_MSDN_...cessmemory.htm

http://vsokovikov.narod.ru/New_MSDN_...cessmemory.htm

Попытайтесь понять какие имено ошибки возникает. Для того чтоб чтото отремонтировать, нужно выяснить что сломалось...
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 26.07.2009, 01:21   #5
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Вот пример чтения/записи в своём процессе:

Код:
type TBuf = array [ 1 .. 1024 ] of byte;

function WriteMem(Addr : DWORD; Buf : TBuf) : DWORD;
begin
  Result := 0;
  WriteProcessMemory(GetCurrentProcess(), ptr(Addr), @Buf, sizeof(Buf), Result);
end;

function ReadMem(Addr : DWORD; var Buf : TBuf) : DWORD;
begin
  Result := 0;
  ReadProcessMemory(GetCurrentProcess(), ptr(Addr), @Buf, sizeof(Buf), Result);
end;
Просто замените GetCurrentProcess на хэндл процесса, который, как я вижу , вы уже нашли. Незабудьте ещё проверки сделать на вилидность ))
BaronTreep вне форума Ответить с цитированием
Старый 26.07.2009, 01:29   #6
GRA1N
 
Аватар для GRA1N
 
Регистрация: 25.07.2009
Сообщений: 7
По умолчанию

Цитата:
Информация по функциям найти не проблема.. Самое сложное это понять что там написали

http://vsokovikov.narod.ru/New_MSDN_...cessmemory.htm

http://vsokovikov.narod.ru/New_MSDN_...cessmemory.htm

Попытайтесь понять какие имено ошибки возникает. Для того чтоб чтото отремонтировать, нужно выяснить что сломалось...

Цитата:
Вот пример чтения/записи в своём процессе:
Огромное спасибо за ответы *ушел тестить*
GRA1N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт данных VBA Lyubov1990 Microsoft Office Excel 5 05.06.2009 15:22
импорт данных Рокабіллі_Птах БД в Delphi 1 13.05.2008 18:49
Продвинутый импорт данных npsb Microsoft Office Access 0 28.02.2008 14:38
Импорт внешних данных asale Microsoft Office Excel 1 15.04.2007 00:41
Импорт данных Таня84 БД в Delphi 4 17.02.2007 20:43