Верно .Viktor Zull писал(а):Текст в этой метке может изменяться в процессе работы программы. Может быть любым. Я знаю что изначально при запуске программы текст в метке: Label1. Если я отредактирую hex редактором exe - поставлю свой текст, то сначала это будет мой текст, а затем он будет изменен. Верно?
Функция FindWindowEx не может найти Label
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
А как насчет изменения значения в процессе работы программы? Можно в памяти найти ячейку где хранится значение метки и изменить его?
Да вроде бы можно сдампить память процесса, найти текст в буфере, вычислить смещение и записать данные, но на практике такого не делал.
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Интересно как "сдампить память процесса". Может кто-нибудь подскажет как это сделать. Я такими вещами еще не занимался, даже затрудняюсь с чего начать.
Может есть ссылки или примеры.
Может есть ссылки или примеры.
Вообще идея такая(это только идея, я её не проверял):
-Запустить программу на выполнение и получить указатель на процесс
-Получить дамп памяти процесса(короче записать память процесса в буфер) с помощью ReadProcessMemory
-Просканировать буфер на наличие нужного слова(нужной последовательности байтов) и вычислить позицию данного блока в буфере
-Записать измененные данные с помощью WriteProcessMemory
В принципе ничего сложного, ноработоспособность не гарантирую-сам не делал
А вот на счет конкретных примеров-ничего вразумительного не нашел.
-Запустить программу на выполнение и получить указатель на процесс
-Получить дамп памяти процесса(короче записать память процесса в буфер) с помощью ReadProcessMemory
-Просканировать буфер на наличие нужного слова(нужной последовательности байтов) и вычислить позицию данного блока в буфере
-Записать измененные данные с помощью WriteProcessMemory
В принципе ничего сложного, ноработоспособность не гарантирую-сам не делал
А вот на счет конкретных примеров-ничего вразумительного не нашел.
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Как получить указатель на процесс? Через FindWindow через Handle можно?
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Чтобы получить указатель на процесс нужно использовать функцию GetWindowThreadProcessId?
Указатель не проблема, его можно получить при запуске приложения, вот как получить размер памяти процесса и базовый адрес - вот это вопрос.
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Мне при запуске моей программы нужно получать указатель чужой программы? Повашему это не сложно? Подскажите как?
Почему именно при запуске?
Почему именно при запуске?
Нет, я имел в виду то, что вы сами запускаете чужую программу.
Или нужно работать с уже запущенной программой?
Вообще я имел в виду такой метод:
[syntax='Delphi']
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
implementation
{$R *.dfm}
function WinExecAndWait32(FileName: String;
Visibility: integer): cardinal;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
setcurrentdir(workdir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,
nil,
nil,
false,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then Result :=1
else begin
end;
//В ProcessInfo.hProcess будем иметь указатель на процесс
end;
end.
[/syntax]
Или нужно работать с уже запущенной программой?
Вообще я имел в виду такой метод:
[syntax='Delphi']
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
implementation
{$R *.dfm}
function WinExecAndWait32(FileName: String;
Visibility: integer): cardinal;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
setcurrentdir(workdir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName,
nil,
nil,
false,
CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then Result :=1
else begin
end;
//В ProcessInfo.hProcess будем иметь указатель на процесс
end;
end.
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...