Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

Перечват 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.049 c
15-1154503937
Ega23
2006-08-02 11:32
2006.08.27
Кстати, о птичках: в днём Войск Дяди Вани!


15-1154543035
Ketmar
2006-08-02 22:23
2006.08.27
господа, как по-английски "обтекание"?


2-1154786763
Reaktor
2006-08-05 18:06
2006.08.27
Чем можно заменить размер массива?


15-1154355138
vidiv
2006-07-31 18:12
2006.08.27
Список всех процессов:)


15-1154285491
Ксардас
2006-07-30 22:51
2006.08.27
Автозаполнение в поисковиках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский