Главная страница
    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.046 c
15-1154011493
Vlad
2006-07-27 18:44
2006.08.27
Майкрософт шалит? :-)


15-1154424567
tsa
2006-08-01 13:29
2006.08.27
Головокружение от успехов


6-1144652520
IntruderLab
2006-04-10 11:02
2006.08.27
FTP заливка файла


15-1154063502
bau009
2006-07-28 09:11
2006.08.27
Borland Developer Studio 2006 - различие продуктов


2-1154596391
berezne
2006-08-03 13:13
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский