Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Как перехватить обращение к файлу

Hello comp,

Я новичек в программировании под виндовс. Пэтому прошу Вас,
подскажите, как перехватить обращение программы (консольное
приложение виндовс) к конкретно заданному текстовому файлу (нужно
перед чтением этой программы изменить данный текстовый файл).
Скажите, какие функции виндовс API нужно вызывать, и, если можно,
примерчик на С (или asm). Программу пишу на ассемблере. Спасибо.

Ответить   mad_ras_prog Thu, 27 Nov 2003 13:13:18 +0200 (#26230)

 

Ответы:

Здравствуйте !

Думал на эту тему...

Похоже, не обойтись без перехвата API - функций (например, CreateFile).
Сам перехват функции - дело сложное. Можно реализоватьего через подмену
адреса в элементе таблиц экспорта загруженного модуля (в адресном
пространстве процесса, за которым) хотите следить. Но это не даст
полной уверенности в результате, поскольку функция может вызываться через
указатель, полученный через GetProcAddress.

С консольным приложением вообще все сложнее. Дело в том, что для перехвата
функции надо внедрить свой код в адресное пространство другого процесса.
Это делается обычно путем загрузки длл с хуком в другой процесс.
Но вся беда в том, что консольные приложения, похоже не имеют очереди
сообщения, а значит, хук бесполезен.
Можно попробовать внедрить код через WriteProcessMemory, а потом
использовать
RPC - удаленный вызов процедур. Но такая схема будет работать только в
WinNT и 2000.

Вообще очень много написано в книге Рихтера "Программирование в Windows
для профессионалов" (кажется так это называется).

Вообще, как видите, довольно сложно.
Но сделать, в принципе можно.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sun, 30 Nov 2003 16:04:40 +0300 (#27281)

 

Hello, Victor

Может у вас есть ссылка на перевод этого на русский язык, а то с
английским я очень пока даже не дружу.

Да, прийдется наверное отложить, пока опыта не наберусь.

PS: Спасибо за внимание
PS: А сколько человек подписано на этот дискуссионный лист, а то я
пока только двоих (вместе с вами) видел.

Best regards,
mad_ras_prog mailto:mad_ras_pr***@t*****.by

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   mad_ras_prog Mon, 1 Dec 2003 02:58:51 +0200 (#28064)

 

Здравствуйте !

Попробуйте вот это :
http://www.proglib.ru/detail_book.asp?id=190

но ссылка старая, нет гарантии что работает.

Кстати, есть такая утилита (кажется на сайте sysinternals)
называется FileMon (можно попробовать в гугле найти). Для нее,
наверно должны быть исходники. Она как раз отслеживает обращения
к файлам. но она встает как фильтр к файловой системе. То есть
встает в цепочку драйверов Windows2000.
Еще, говорят знающие люди, пример такой же программы есть в
DDK 2000 (это пакет разработки драйверов Device Driver Kit).
Но самое плохое то, что разработка драйверов одна из самых
сложных тем в программировании, т.к. там полно недокументировнного.
и нужны специфические средства отладки.

Пишите еще - на более простые темы ответы будут более определенными :-)

Сейчас 84. Но, как видите, пока общение идет с трудом.

Эй, народ !!!
Здесь есть программисты ?!

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sun, 2 Jun 2002 03:34:40 +0400 (#28065)

 

Здравствуте, Victor!

Есть, но только начинающие.

Ответить   Лена П. Tue, 2 Dec 2003 08:55:46 +0300 (#28095)

 

Hello, Лена

И на чем начинающие счас пишут программы?

2All: 1)может поактивнее примем участвие в конференции?
2) антиофтопик: как писать плагины, в смысле, общие принципы,
примерчик, если можно (простейшей программки и простейшего
плагинчика). Приветсвуются ссылки на русскоязычную литературу (в
интернете).

Best regards,
mad_ras_prog mailto:mad_ras_pr***@t*****.by

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   mad_ras_prog Tue, 2 Dec 2003 16:13:15 +0200 (#29201)

 

Здравствуте, mad_ras_prog!

На чем приходится. Раньше на Pascal'e, сейчас в основном на Clipper'е.
Немножко SQL'ем балуемся и т.п.

К сожалению, с такими вещами не встречалась, поэтому помочь, скорее
всего не смогу.

Ответить   Лена Thu, 4 Dec 2003 13:04:12 +0300 (#29241)

 

Имхо, здесь только программисты и есть... ;--)
Если бы я не был програмистом, я бы не подписался на этот лист :--)

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 4 Dec 2003 15:39:52 +0500 (#29258)

 

Привет всем !

В свое время я решил эту задачу достаточно просто - сделал несколько
dll - ек, в которых должна была быть обязательно некоторая функция. Получал
указатель на нее через GetProcAddress (если функции в длл нет, то это не мой
плагин).
Вызывал эту функцию, а она мне возвращала указатель на структуру, содержащую
описания и указатели на функции с алгоритмами плагина. И все.
Работало, в принципе. Еще в какой то конфе тоже как то обсуждали такое -
сошлись на том, что лучше всего плагин делать как приложение, в котором
будет COM -
сервер. И юзать его.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 4 Dec 2003 22:59:08 +0300 (#29578)

 

Здарова программеры,

1 декабря 2003 г., 05:58:51, было намылено:

Есть, только я по delphi в основном. Но по API могу че-нить и
написать.

прямоугольные

1) Про непрямоугольные окна.
На форме TImage. Align=alClient
"Прозрачный" цвет берется из левого верхнего угла 1.bmp

unit UnitMain;

interface

uses
Windows, Messages, Graphics, Controls, Forms, ExtCtrls, Classes;

type
TFormMain = class(TForm)
ImageFormMain: TImage;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormMain: TFormMain;
R:HRgn;

implementation

{$R *.dfm}

procedure TFormMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If ssLeft In Shift Then
Begin
ReleaseCapture;
SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
End;
end;

procedure TFormMain.FormCreate(Sender: TObject);
Var
X1,X,Y:Integer;
begin
X1:=-1;
R:=CreateRectRgn(0,0,0,0);
ImageFormMain.Picture.LoadFromFile('1.bmp');
FormMain.BorderStyle:=bsNone;
FormMain.Height:=ImageFormMain.Picture.Bitmap.Height;
FormMain.Width:=ImageFormMain.Picture.Bitmap.Width;
With ImageFormMain.Picture.Bitmap Do
For Y:=0 To Height-1 Do
For X:= 0 To Width-1 Do
If Canvas.Pixels[X,Y]<>Canvas.Pixels[0,0] Then
Begin If X1=-1 Then X1:=X; End
Else
If X1>-1 Then
Begin
CombineRgn(R,R,CreateRectRgn(X1,Y,X-1,Y+1),RGN_OR);
X1:=-1;
End;
SetWindowRgn(Handle,R,True);
SetWindowLong(Handle,GWL_EXSTYLE,0{WS_EX_LAYERED});
end;

end.

Про непрямоугольные окна 2
На форме TImage. Align=alClient
TTimer interval=100 enabled=true

unit UnitMain;

interface

uses
Windows, Messages, Graphics, Controls, Forms, ExtCtrls, Classes;

type
TFormMain = class(TForm)
ImageFormMain: TImage;
Timer: TTimer;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure TimerTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormMain: TFormMain;
R: HRgn;

implementation

{$R *.dfm}

procedure TFormMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If ssLeft In Shift Then
Begin
ReleaseCapture;
SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
End;
end;

procedure TFormMain.FormCreate(Sender: TObject);
Var
X1,X,Y: Integer;
begin
X1 := -1;
R := CreateRectRgn(0,0,0,0);

ImageFormMain.Picture.LoadFromFile('1.bmp');
FormMain.BorderStyle := bsNone;
FormMain.Height := ImageFormMain.Picture.Bitmap.Height;
FormMain.Width := ImageFormMain.Picture.Bitmap.Width;

With ImageFormMain.Picture.Bitmap Do
For Y := 0 To Height-1 Do
For X := 0 To Width-1 Do
If Canvas.Pixels[X,Y] <> Canvas.Pixels[0,0] Then
Begin If X1=-1 Then X1 := X; End
Else
If X1>-1 Then
Begin
CombineRgn(R,R,CreateRectRgn(X1,Y,X-1,Y+1),RGN_OR);
X1 := -1;
End;
SetWindowRgn(Handle, R, True);
SetWindowLong(Handle, GWL_EXSTYLE, 0{WS_EX_LAYERED});
end;

procedure TFormMain.TimerTimer(Sender: TObject);
begin
If Timer.Tag = 255 Then Timer.Tag := -255;
If Timer.Tag > 0 Then
// SetLayeredWindowAttributes(Handle, 0, Timer.Tag, LWA_ALPHA)
Else
// SetLayeredWindowAttributes(Handle, 0, -Timer.Tag, LWA_ALPHA);
Timer.Tag := Timer.Tag+1;

end;

end.

2) Про A и A* ничего не слышал.

PS: Еще, мылы с аттачами запрещены здесь или нет, а то всем желающим
на мыло рассылать в облом?

Ответить   Томилов Александр Wed, 3 Dec 2003 03:12:00 +0500 (#28569)