Форум: "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