امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
hook detection
نویسنده پیام
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #12
RE: hook detection
library Injection;
uses
Windows, Sysutils, Messages, Psapi;
type
TShared = record
Hook: HHooK;
AttachCount: Integer;
end;
PShared = ^TShared;
PItem = ^TItem;
TItem = record
hWnd: HWND;
WndProc: Pointer;
Next: PItem;
end;
var
Mutex, Mem: THandle;
Shared: PShared;
Injected: Boolean;
HandleList: PItem;
function FindWindowProc(hWnd: HWND; Item: PItem): Pointer;
begin
if Item <> nil then
begin
if Item.hWnd = hWnd then
Result:= Item.WndProc
else
Result:= FindWindowProc(hWnd,Item.Next);
end else
Result:= nil;
end;
function WindowProc(hWnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM):
LRESULT; stdcall;
var
Str: String;
begin
if (Msg = WM_SETTEXT) then
begin
Str:= String(PChar(LParam));
Str:= StringReplace(Str,'128 MB','1,00 GB',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'256 MB','1,00 GB',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'512 MB','2,00 GB',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'233 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'300 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'333 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'400 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'500 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'533 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'700 MHz','2,5 GHz',[rfReplaceAll,rfIgnoreCase]);
Str:= StringReplace(Str,'versión 2002','versión 2007',[rfReplaceAll,rfIgnoreCase]);
LParam:= Longint(PChar(Str));
end;
Result:= CallWindowProc(FindWindowProc(hWnd,HandleList),hWnd,Msg,WParam,lParam);
end;
function HookWindow(hWnd: HWND): Pointer;
var
Item: PItem;
begin
Result:= FindWindowProc(hWnd, HandleList);
if Result = nil then
begin
GetMem(Item,Sizeof(TItem));
Item.hWnd:= hWnd;
Item.Next:= HandleList;
Item.WndProc:= Pointer(SetWindowLong(hWnd,GWL_WNDPROC,LongInt(@WindowProc)));
HandleList:= Item;
end;
end;
function CallWndProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
stdcall;
var
ClassName: array[0..16] of Char;
begin
if Code = HC_ACTION then
if Injected then
begin
FillChar(ClassName,Sizeof(ClassName),0);
if GetClassName(PCWPStruct(lParam).hwnd,@ClassName,Sizeof(ClassName)-1) > 0 then
begin
if StrIComp(ClassName,'Link Window') = 0 then
HookWindow(PCWPStruct(lParam).hwnd);
end;
end;
Result := CallNextHookEx(Shared^.Hook, Code, wParam, lParam);
end;
procedure StartHook; stdcall;
begin
if Shared <> nil then
begin
WaitForSingleObject(Mutex, INFINITE);
try
with Shared^ do
begin
if Hook = 0 then
Hook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, HInstance, 0);
end;
finally
ReleaseMutex(Mutex);
end;
end;
end;
procedure StopHook; stdcall;
begin
if Shared <> nil then
begin
WaitForSingleObject(Mutex, INFINITE);
try
with Shared^ do
begin
if Hook <> 0 then
begin
UnhookWindowsHookEx(Hook);
Hook := 0;
end;
end;
finally
ReleaseMutex(Mutex);
end;
end;
end;
procedure Inject;
var
Process: THandle;
ModName: array[0..MAX_PATH] of Char;
Target: array[0..MAX_PATH] of Char;
begin
Injected:= FALSE;
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,
GetCurrentProcessId);
if Process <> 0 then
begin
if GetModuleFileNameEx(Process, 0, ModName,sizeof(ModName)-1) > 0 then
begin
FillChar(Target,Sizeof(Target),#0);
GetSystemDirectory(@Target,Sizeof(Target)-1);
StrLCat(Target,'\rundll32.exe',Sizeof(Target)-1);
if StrIComp(Target,ModName) = 0 then
begin
HandleList:= nil;
Injected:= TRUE;
end;
end;
CloseHandle(Process);
end;
end;
procedure Attach; stdcall;
var
isNew: boolean;
begin
Mutex := CreateMutex(nil, True, '{92366DA1-4F66-472D-BE12-65F0993F62AC}');
try
Mem := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShared),
'{D1A38D62-9FAB-4298-A358-579D2D286E40}');
isNew := GetLastError() = 0;
if Mem <> 0 then
Shared := MapViewOfFile(Mem, FILE_MAP_WRITE, 0, 0, 0)
else
Shared := nil;
if Shared <> nil then
if isNew then
with Shared^ do
begin
Hook := 0;
AttachCount := 1;
end
else
inc(Shared^.AttachCount);
finally
ReleaseMutex(Mutex);
end;
// Aqui viene la inyeccion
Inject;
end;
procedure UnHookWindows(Item: PItem);
begin
if Item <> nil then
begin
UnHookWindows(Item.Next);
SetWindowLong(Item.hWnd,GWL_WNDPROC,LongInt(Item.WndProc));
FreeMem(Item);
end;
end;
procedure Detach; stdcall;
begin
WaitForSingleObject(Mutex, INFINITE);
try
if (Shared <> nil) then
dec(Shared^.AttachCount);
finally
ReleaseMutex(Mutex);
end;
if (Shared <> nil) then
if Shared^.AttachCount <= 0 then
begin
StopHook;
UnmapViewOfFile(Shared);
CloseHandle(Mem);
CloseHandle(Mutex);
end;
if Injected then
UnHookWindows(HandleList);
end;
procedure DLLEntryPoint(Reason: integer);
begin
case Reason of
Dll_Process_Detach: Detach;
Dll_Process_Attach: Attach;
end;
end;
exports
StartHook,
StopHook;
begin
Attach;
DLLProc:= @DLLEntryPoint;
end.
اینم یه نسخش به زبان دلفی
در ضمن جناب ویسکرمی تو این مبحث کار کردن بهتره باهاش یه صحبتی داشته باشی
(البته فعلا رفته قاطی مرقا سخت میشه گیرش اورد وقت قبلی باید بگیری)
۳۰-دى-۱۳۸۶, ۱۰:۴۵:۴۸
وب سایت ارسال‌ها
پاسخ
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #13
RE: hook detection



WH_DEBUG

Confused ! ! ! Amaze

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۰۱-بهمن-۱۳۸۶, ۰۲:۱۸:۳۷
ارسال‌ها
پاسخ
veyskarami غایب
مدیر بازنشسته
*****

ارسال‌ها: 861
موضوع‌ها: 82
تاریخ عضویت: مرداد ۱۳۸۴

تشکرها : 477
( 2479 تشکر در 611 ارسال )
ارسال: #14
RE: hook detection
(۲۷-دى-۱۳۸۶, ۰۲:۳۰:۴۳)spiderman نوشته است: من با WH_KEYBOARD_LL کیبورد رو هوک می کنم. حالا چطور می تونم بفهمم وقتی یه کلیدی زده میشه اول هوکه من میگیرش یا یه هوک از یه برنامه دیگه؟
http://www.xtremevbtalk.com/showthread.php?p=1268721

بستگی داره!
اگه برنامه ای که هوک می کنه سطح دسترسی بالاتری داشته باشه مثلا سطح کرنل (مثل بعضی از آنتب ویروس ها) مسلما اون برنامه کیفیت کار و قدرتش بیشتر از برنامه ای هستش که در user mode یا ring3 هوک می کنه
ضمنا روش هوک کردن هم خیلی تاثیر داره توی هوک مثلا CodeHook قدرتش از HookIAT بالاتره چون مستقیما با GetProcAddress کار می کنی.
(۲۷-دى-۱۳۸۶, ۰۲:۳۰:۴۳)spiderman نوشته است: می خوام بدونم برنامه من کجای زنجیر هوک قرار گرفته. یا نهایتش اینکه برنامه ای بعد از من هوک کرده یا نه؟
http://www.xtremevbtalk.com/showthread.php?p=1268721
شما واسه پیدا کردن جواب این سوال باید بعد از هوک کردن آدرس IAT ی که دتو حافظه تغییر می کنه بدست بیاری و تو یه حلقه یا لوپ بذاری بعد اگه یه برنامه دیگه هوک کرد دوباره آدرسش تو حافظه تغییر می کنه و می تونی بفهمی که دوباره هوک شده.

البته یه چیز دیگه هم بگم و اونم اینه که معمولا آنتی ویروس ها قبل از هوک کردن هوک قبلی رو از بین می برن (یعنی unhook می کنن او تابع رو) بعد دوباره تابع رو هوک می کنن (البته اگه جز تابع nt یا Zw باشه).

۲۹-آذر-۱۳۸۷, ۱۹:۱۸:۰۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS