Главная страница
    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.042 c
6-1144091609
Velimir
2006-04-03 23:13
2006.08.27
Чат в локальной сети с динамическим IP (tcp)


15-1153997361
ПЛОВ
2006-07-27 14:49
2006.08.27
Примерчик бы :-)


3-1150381411
Urvin
2006-06-15 18:23
2006.08.27
Счетчик (?) в Firebird


2-1154950938
webpauk
2006-08-07 15:42
2006.08.27
TstringList.AddObject


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