Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Перечват CreateFile   Найти похожие ветки 

 
__ViC ©   (2006-05-04 17:54) [0]

Есть вот такой код(ниже), подскажите что не так.
Он как-бы  работает, но с глюками, после запуска программы вызывающей dll не запускаються exe"шники :(

прога:

program CreateFileHook_TEST;

uses
 Windows;

begin
LoadLibrary("CreateFileHook.dll");
SLEEP(INFINITE);
end.


dll:

library CreateFileHook;

uses
 Windows, Dialogs, SysUtils;

type
OldCode = packed record
 One: dword;
 two: word;
end;

far_jmp = packed record
 PuhsOp: byte;
 PushArg: pointer;
 RetOp: byte;
end;

var
JmpCfw, JmpCfa: far_jmp;
OldCfw, OldCfa: OldCode;
CfwAdr, CfaAdr: pointer;

//-----------ViC---------------------------------------------------------------
function NewCreateFileA(lpFileName: PChar;
                       dwDesiredAccess: DWORD;
                       dwShareMode: DWORD;
                       lpSecurityAttributes: PSecurityAttributes;
                       dwCreationDisposition: DWORD;
                       dwFlagsAndAttributes: DWORD;
                       hTemplateFile: THandle): THandle; stdcall;
var
 file_name: PWideChar;
 name_len: dword;
begin
 name_len := lstrlen(lpFileName) * SizeOf(WideChar) + 2;
 GetMem(file_name, name_len);
 StringToWideChar(lpFileName, file_name, name_len);

 CreateFileW(file_name, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
             dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);

 FreeMem(file_name);
end;
//-----------ViC---------------------------------------------------------------

//-----------ViC---------------------------------------------------------------
function TrueCreateFileW(lpFileName: PWideChar;
                        dwDesiredAccess: DWORD;
                        dwShareMode: DWORD;
                        lpSecurityAttributes: PSecurityAttributes;
                        dwCreationDisposition: DWORD;
                        dwFlagsAndAttributes: DWORD;
                        hTemplateFile: THandle): THandle; stdcall;
var
Written: dword;
begin
 WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
                    @OldCfw, SizeOf(OldCode), Written);
 {*
 if (dwDesiredAccess = GENERIC_WRITE) and
    (dwShareMode = 0) and
    (dwCreationDisposition = OPEN_ALWAYS)
 then ShowMessage("It""s mine");
 *}
 
 CreateFileW(lpFileName,
             dwDesiredAccess,
             dwShareMode,
             lpSecurityAttributes,
             dwCreationDisposition,
             dwFlagsAndAttributes,
             hTemplateFile);

 WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr,
                    @JmpCfw, SizeOf(far_jmp), Written);
end;
//-----------ViC---------------------------------------------------------------

//-----------ViC---------------------------------------------------------------
function NewCreateFileW(lpFileName: PWideChar;
                       dwDesiredAccess: DWORD;
                       dwShareMode: DWORD;
                       lpSecurityAttributes: PSecurityAttributes;
                       dwCreationDisposition: DWORD;
                       dwFlagsAndAttributes: DWORD;
                       hTemplateFile: THandle): THandle; stdcall;
begin
 TrueCreateFileW(lpFileName,
                 dwDesiredAccess,
                 dwShareMode,
                 lpSecurityAttributes,
                 dwCreationDisposition,
                 dwFlagsAndAttributes,
                 hTemplateFile);
end;
//-----------ViC---------------------------------------------------------------

Procedure SetHook();
var
kernel32: dword;
Bytes: dword;
begin
 kernel32 := GetModuleHandle("Kernel32.dll");
 CfwAdr  := GetProcAddress(kernel32, "CreateFileW");
 CfaAdr  := GetProcAddress(kernel32, "CreateFileA");
 ReadProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, @OldCfw, SizeOf(OldCode), Bytes);
 ReadProcessMemory(INVALID_HANDLE_VALUE, CfaAdr, @OldCfa, SizeOf(OldCode), Bytes);
 JmpCfw.PuhsOp  := $68;
 JmpCfw.PushArg := @NewCreateFileW;
 JmpCfw.RetOp   := $C3;
 JmpCfa.PuhsOp  := $68;
 JmpCfa.PushArg := @NewCreateFileA;
 JmpCfa.RetOp   := $C3;
 WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, @JmpCfw, SizeOf(far_jmp), Bytes);
 WriteProcessMemory(INVALID_HANDLE_VALUE, CfaAdr, @JmpCfa, SizeOf(far_jmp), Bytes);
end;

Procedure Unhook();
var
Bytes: dword;
begin
 WriteProcessMemory(INVALID_HANDLE_VALUE, CfaAdr, @OldCfa, SizeOf(OldCode), Bytes);
 WriteProcessMemory(INVALID_HANDLE_VALUE, CfwAdr, @OldCfw, SizeOf(OldCode), Bytes);
end;

// çàëåïà
Function MessageProc(code : integer; wParam : word;
                   lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;

Procedure SetGlobalHookProc();
begin
SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
Sleep(INFINITE);
end;
//

Procedure SetGlobalHook();
var
hMutex: dword;
TrId: dword;
begin
hMutex := CreateMutex(nil, false, "CreateFileHook");
if GetLastError = 0 then
CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
CloseHandle(hMutex);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
 case dwReason of
   DLL_PROCESS_ATTACH: begin
                         SetGlobalHook();
                         Randomize();
                         SetHook()
                       end;
   DLL_PROCESS_DETACH: UnHook();
 end;
end;

begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
Сергей М. ©   (2006-05-05 11:42) [1]


> не запускаються exe"шники


Ошибаешься. Они запускаются, но тут же падают, когда код твоей библиотеки (с кучей ошибок и несуразностей), загружаемый в их АП, получает управление.


 
__ViC ©   (2006-05-05 12:02) [2]

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


 
Сергей М. ©   (2006-05-05 12:16) [3]


> что не так


Да тут многое что не так .. ошибка на ошибке ..

Ты вообще что сделать-то хочешь - перехватить вызов ф-ции глобально для всех процессов или в контексте только текущего процесса ?


 
__ViC ©   (2006-05-05 14:19) [4]

для всех


 
Сергей М. ©   (2006-05-05 14:22) [5]


> __ViC ©   (05.05.06 14:19) [4]
>
> для всех


Так, это понятно.

Поехали дальше ?

Sleep(INFINITE); // это что за галиматья-отсебячина ? Комментируй ..


 
__ViC ©   (2006-05-05 14:35) [6]

Пробле не со Sleep на самом деле, я могу вам привести пример перехвата MessageBox по той же системе, и оно не глючит.
            взято из http://ms-rem.dot-link.net/hook/ApiHook1/apihook.htm

library AdvBox32;

{$R Reklama.res}

uses
 Windows;

type
OldCode = packed record
 One: dword;
 two: word;
end;

far_jmp = packed record
 PuhsOp: byte;
 PushArg: pointer;
 RetOp: byte;
end;

var
JmpMbw, JmpMba: far_jmp;
OldMbw, OldMba: OldCode;
MbwAdr, MbaAdr: pointer;

Function GetRandomString(): PWideChar;
var
rId: dword;
begin
 GetMem(Result, 4096);
 rId := Random(3) + 1;
 LoadStringW(hInstance, rId, Result, 4096);
end;

function NewMessageBoxExA(hWnd: HWND; lpText, lpCaption: PAnsiChar;
                         uType: UINT; wLanguageId: Word): Integer; stdcall;
var
Text, Caption: PWideChar;
tLen, cLen: dword;
begin
tLen := lstrlen(lpText) * SizeOf(WideChar) + 2;
cLen := lstrlen(lpCaption) * SizeOf(WideChar) + 2;
GetMem(Text, tLen);
GetMem(Caption, cLen);
StringToWideChar(lpText, Text, tLen);
StringToWideChar(lpCaption, Caption, cLen);
Result := MessageBoxExW(hWnd, Text, Caption, uType, wLanguageId);
FreeMem(Text);
FreeMem(Caption);
end;

function TrueMessageBoxExW(hWnd: HWND; lpText, lpCaption: PWideChar;
                          uType: UINT; wLanguageId: Word): Integer; stdcall;
var
Written: dword;
begin
 WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr,
                    @OldMbw, SizeOf(OldCode), Written);

 Result := MessageBoxExW(hWnd, lpText, lpCaption, uType, wLanguageId);

 WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr,
                    @JmpMbw, SizeOf(far_jmp), Written);
end;

function NewMessageBoxExW(hWnd: HWND; lpText, lpCaption: PWideChar;
                         uType: UINT; wLanguageId: Word): Integer; stdcall;
var
AdText: PWideChar;
NewText: PWideChar;
NewLen: dword;
begin
AdText := GetRandomString();
NewLen := (lstrlenw(AdText) + lstrlenw(lpText)) * SizeOf(WideChar) + 20;
GetMem(NewText, NewLen);
lstrcpyw(NewText, lpText);
lstrcatw(NewText, #10#13#10#13);
lstrcatw(NewText, AdText);
FreeMem(AdText);  
Result := TrueMessageBoxExW(hWnd, NewText, lpCaption, uType, wLanguageId);
FreeMem(NewText);
end;

Procedure SetHook();
var
hUser32: dword;
Bytes: dword;
begin
 hUser32 := GetModuleHandle("user32.dll");
 MbwAdr  := GetProcAddress(hUser32, "MessageBoxExW");
 MbaAdr  := GetProcAddress(hUser32, "MessageBoxExA");
 ReadProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes);
 ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
 JmpMbw.PuhsOp  := $68;
 JmpMbw.PushArg := @NewMessageBoxExW;
 JmpMbw.RetOp   := $C3;
 JmpMba.PuhsOp  := $68;
 JmpMba.PushArg := @NewMessageBoxExA;
 JmpMba.RetOp   := $C3;
 WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @JmpMbw, SizeOf(far_jmp), Bytes);
 WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Bytes);
end;

Procedure Unhook();
var
Bytes: dword;
begin
 WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes);
 WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes);
end;

// залепа
Function MessageProc(code : integer; wParam : word;
                   lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;

Procedure SetGlobalHookProc();
begin
SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
Sleep(INFINITE);
end;
//

Procedure SetGlobalHook();
var
hMutex: dword;
TrId: dword;
begin
hMutex := CreateMutex(nil, false, "AdvareHook");
if GetLastError = 0 then
CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
CloseHandle(hMutex);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
 case dwReason of
   DLL_PROCESS_ATTACH: begin
                         SetGlobalHook();
                         Randomize();
                         SetHook()
                       end;
   DLL_PROCESS_DETACH: UnHook();
 end;
end;

begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.




program AdwareBox;

uses
 Windows;

begin
LoadLibrary("AdvBox32.dll");
SLEEP(INFINITE);
end.


 
Сергей М. ©   (2006-05-05 14:40) [7]


> Пробле не со Sleep на самом деле


Но ты же влупил в свой код этот sleep() !

Вот и изволь для начала пояснить, что и зачем ты при этом делаешь ..

Как только с этим разберемся - поедем дальше ...


 
__ViC ©   (2006-05-05 14:58) [8]

Зачем мы так сосредоточились на Sleep"е, приложение просто впадает в бесконечную спячку, с глюками Sleep никак не связан.


 
Сергей М. ©   (2006-05-05 15:13) [9]

Ладно, фиг с ним, со слипом ... Упрямого могила выпрямит.

А вот то что в твоем алгоритме наблюдается бесконечная рекурсия - это факт.


 
Сергей М. ©   (2006-05-05 15:18) [10]

И вообще - нафига выкрутасничать с модификацией секции кода, когда легко и без проблем можно модифицировать EAT и IAT ?



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
15-1154543035
Ketmar
2006-08-02 22:23
2006.08.27
господа, как по-английски "обтекание"?


15-1154073849
Petr V. Abramov
2006-07-28 12:04
2006.08.27
Oracle XE


15-1154329986
Nic
2006-07-31 11:13
2006.08.27
Архитектура приложений


2-1155146390
ArtemESC
2006-08-09 21:59
2006.08.27
Окаймление компонентна


2-1154779776
AlexanderMS
2006-08-05 16:09
2006.08.27
Убрать прямоугольную рамку фокуса в ListBox.