Контроль за процессом
с помощью каких функций можно осуществить контроль за процессом. Т.е. например мне нужно запретить обращение какого то процесса к папке, файлу или какому либо другому ресурсу.
Торлько при помощи API Hook.
Перехватываеш то чем он обращаеться и делаеш с ним что тебе надо.
ahilles, а пример какой-нибуть функции подскажи пожалуста. У меня есть примерчик Фленова по перехвату пороля, но что то лажа, там рассматривается не та функция.
ну и дальше как сказал ahilles,
[quote=ahilles]смотришь если допустим функции передан в качестве параметра путь к запрещённому файлу, то возвращаешь INVALIDE_HANDLE_VALUE[/quote]
.....
static int (WINAPI*TrueConnect)(SOCKET s,const SOCKADDR_IN* name,int namelen);
.....
int __stdcall Hconnect(SOCKET s,const SOCKADDR_IN* name,int namelen)
{
if(name->.sin_addr.s_addr == inet_addr("12.34.56.78")) return -1;
return TrueConnect(s,name,namelen);
}
.....
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason==DLL_PROCESS_ATTACH)
{
// лутше всего добавить проверку на тему точно ли ет тот процесс
TrueConnect = (int(__stdcall*)(unsigned int,const struct sockaddr FAR*,int))SetAPIHookByName("wsock32.dll","connect",Hconnect);
};
....
}
.....
загружаеш свою длл-ку в интересующий тебя процесс
использовал свою библиотечку, возможно она местами корявая.
загружаеш свою длл-ку в интересующий тебя процесс
использовал свою библиотечку, возможно она местами корявая.
Спасибо большое! Дальше разбирусь. Ну а если что, я думаю поможите! ;)
Подскажите пожалуста, при нажатии кнопки мыши генерируется событие HC_ACTION, а какое событие генирируется при двойном нажатии?
необходимо перехватить событие открытия или копирования некоторого файла(папки). Подскажите какое именно событие нужно ждать и какие парамметры проверять.
FindNextChangeNotification
FindCloseChangeNotification
Для реестра
uses
Windows,
advApiHook;
{$R *.res}
const
MutexName='__API_HOOK';
var
SH:HHOOK = 0;
CopyFileNextHook: function (lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
function CopyFileHookProc(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;
begin
MessageBox(0, 'Функция: CopyFile', 'Позволить ?', MB_YESNO or MB_ICONQUESTION);
end;
function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall;
begin
CallNextHookEx(SH,code,wParam,lparam);
end;
procedure SetWindowsHook(e:Boolean); stdcall;
var
M:THandle;
begin
if e then
begin
m:=CreateMutex(0,false,MutexName);
if m=0 then exit;
SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0);
end
else
UnhookWindowsHookEx(sh);
end;
procedure HandleEvents(reason: integer);
begin
case reason of
DLL_PROCESS_ATTACH:
begin
SetWindowsHook(true);
HookProc('kernel32.dll', 'CopyFileW', @CopyFileHookProc, @CopyFileNextHook);
end;
DLL_PROCESS_DETACH:
begin
SetWindowsHook(false);
UnhookCode(@CopyFileNextHook);
end;
end;
end;
// HandleEvents(DLL_PROCESS_DETACH);
begin
DllProc := @HandleEvents;
MessageBox(0, 'Запускаем дллку', 'Позволить ?', MB_YESNO or MB_ICONQUESTION);
HandleEvents(DLL_PROCESS_ATTACH);
/// CopyFile('C:\test.txt','C:\test1.txt',true);
end.
end.
ВСе вроде бы как работает, перехватывает функцию CopyFileA()(создал свое приложение, которое вызывает эту функцию), да то ка проблема в том что в Винде почему то копирование не перехватывает. Не пойму почему, может винда чем то другим пользуется, или дллка не цепляется к explorer'у? ПОдскажите в чем касяк?
ahilles, пробывал как ты посоветовал, перехватывал функцию CreateFile, других приложений перехватывает, а в винде нет.
99% что Эксплорер использует функцию SHFileOperation
Пробывал ее перехватывать, но результат такой же, на меня ноль эмоций =(
Уже было, юзай поиск )
http://forum.codenet.ru/showthread.php?t=34320
Я перехватил функцию
NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
Как мне определить к какому файлу произошло обращение.
а точнее ObjectAttributes.ObjectName.Buffer
begin
if <проверка> then
result:=OldNtCreateFile(......);
else
begin
result:=SEVERITY_ERROR; ///(3 или $C0000000, точно не помню)
FileHandle^:=INVALID_HANDLE_VALUE;//(-1)
exit;
end;
но это врядли верно, но должно пойти
uses
Windows, advApiHook,
NTSTATUSDEFS,
HSNtDef,
NtDll;
{$R *.res}
const
MutexName='__API_HOOK';
var
SH:HHOOK = 0;
NtCreateFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;
ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock;
AllocationSize: PLARGE_INTEGER; FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG;
EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;
NtOpenFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES;
IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
////////////////////////////////////////////////////////////////////////////////
{*
function NtCreateFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;
ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock;
AllocationSize: PLARGE_INTEGER;
FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG;
EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;
begin
end;
*}
function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES;
IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
var
res : NTSTATUS;
err : Integer;
text : PUNICODE_STRING;
f:hFile;
buffer,st :string;
rwd : DWORD;
begin
res:=NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
if res = STATUS_SUCCESS then begin
//--
err:=GetLastError;
f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
if f <> INVALID_HANDLE_VALUE then begin
try
buffer:=#13+#10+'NtOpenFile: ';
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,buffer[1],length(buffer),rwd,nil);
text:= ObjectAttributes.ObjectName;
st := WideCharToString(text.Buffer);
WriteFile(f,st[1],length(st),rwd,nil);
finally
CloseHandle(f);
SetLastError(err);
end;
end;
//--
if (st = 'C:\test.txt') then begin
CloseHandle(FileHandle^);
FileHandle^:=INVALID_HANDLE_VALUE;
res:=STATUS_OBJECT_NAME_NOT_FOUND;
end;
end;
result:=res;
end;
function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall;
begin
CallNextHookEx(SH,code,wParam,lparam);
end;
procedure SetWindowsHook(e:Boolean); stdcall;
var
M:THandle;
begin
if e then
begin
m:=CreateMutex(0,false,MutexName);
if m=0 then exit;
SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0);
end
else
UnhookWindowsHookEx(sh);
end;
procedure HandleEvents(reason: integer)export;stdcall;
begin
case reason of
DLL_PROCESS_ATTACH:
begin
SetWindowsHook(true);
//HookProc('ntdll.dll', 'NtCreateFile', @NtCreateFileHookProc, @NtCreateFileNextHook);
HookProc('ntdll.dll', 'NtOpenFile', @NtOpenFileHookProc, @NtOpenFileNextHook);
end;
DLL_PROCESS_DETACH:
begin
SetWindowsHook(false);
//UnhookCode(@NtCreateFileNextHook);
UnhookCode(@NtOpenFileNextHook);
end;
end;
end;
begin
DllProc := @HandleEvents;
MessageBox(0, 'Запускаем дллку', 'Позволить ?', MB_YESNO or MB_ICONQUESTION);
HandleEvents(DLL_PROCESS_ATTACH);
end.
IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
var
res : NTSTATUS;
err : Integer;
text : PUNICODE_STRING;
f:hFile;
buffer,st :string;
rwd : DWORD;
begin
res:=NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
if res = STATUS_SUCCESS then begin
//--
err:=GetLastError;
f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
if f <> INVALID_HANDLE_VALUE then begin
try
..........
finally
.....
end;
end;
//--
if (st = 'C:\test.txt') then begin
CloseHandle(FileHandle^);
FileHandle^:=INVALID_HANDLE_VALUE;
res:=STATUS_OBJECT_NAME_NOT_FOUND;
end;
end;
result:=res;
end;
довольно таки непонятный код.... перехватом NtOpenFile невозможно получить контроль над процессом. ну ладно, пусть будет так, иначе ты не сможешь выхвать Createfile в перехватчике
CloseHandle(FileHandle^);
FileHandle^:=INVALID_HANDLE_VALUE;
res:=STATUS_OBJECT_NAME_NOT_FOUND;
end;
этот код на надо в самое начало
это так, просто сразу с реализацией контроля над процессом не получилось. Поэтому стал эксперементировать просто на перехвате, в частности NtOpenFile, и записи результата в лог. Но это не суть важно, как и ниже следующий код
CloseHandle(FileHandle^);
FileHandle^:=INVALID_HANDLE_VALUE;
res:=STATUS_OBJECT_NAME_NOT_FOUND;
end;
Просто осталась одна проблема - "это ошибка по адресу ...". Не могу понять, в чем причина. Помоги разобраться.
приложи архив с проектом. какую версию advApiHook используешь? не пробовал ли ты вместо NTSTATUSDEFS, HSNtDef, NtDll использовать NativeAPI от того же Ms-Rem'а? используется ли в каком-либо из юнитов SysUtils? и напоследок: что у тебя за машинка, какая ОС, наличие заплаток и т.д. - подробней плиз.
извините на лирическое отступление: а где их можно скачать?
Какая версия advApiHook я не знаю ... скачал с какого то сайта.
не пробовал ли ты вместо NTSTATUSDEFS, HSNtDef, NtDll использовать NativeAPI от того же Ms-Rem'а? используется ли в каком-либо из юнитов SysUtils?
Как раз их и использую. SysUtils ни где не использую.
и напоследок: что у тебя за машинка, какая ОС, наличие заплаток и т.д. - подробней плиз.
проц Athlon XP 1700+, озу 256, ОС Windows XP SP2 больше ничего.
Архив прикрепил.
ну вообще можно воспользоваться поиском по форуму, т.к. я где-то уже ссылку давал или сходить сюда http://kladovka.net.ru/index.cgi?pid=dir&rid=8&ppn=2
Coffein гляну твой код чуть позжее, но могу сразу сказать, что такая ошибка вылазиет не только у тебя я много таких случаев видел, самое интересное, что один и тот же код у одних отрабатывает нормально, а у других нет.