小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

delphi HooK 指定程序窗體和控件的 WndProc

 quasiceo 2013-11-30

delphi HooK 指定程序窗體和控件的 WndProc

作者:admin 來源: 日期:2011/8/16 9:35:18 人氣:555 標簽:

搞點界面XX

只是做不好的話會引起explorer和其他程序崩潰

首先我們的思路肯定這樣的啦!

1 下鉤

2 當一個程序運行后鉤子被注入,入口肯定是要先判斷 是否是我們要HOOK的程序的進程

3判斷是了就保存原來的WndProc的地址然后 SetWindowLong 把窗體的 WndProc 或 控件的 WndProc 轉(zhuǎn)向我們新的 WndProc



然后呢,發(fā)現(xiàn)什么問題,鉤子入口函數(shù)執(zhí)行啦,但是 SetWindowLong 就是不成功。。。(SetWindowLong 頭參是窗體或控件句柄)

調(diào)了下,發(fā)現(xiàn)原來 SetWindowLong 函數(shù)沒有被執(zhí)行,納悶中 ,以為入口函數(shù)沒有被執(zhí)行 ,后來放個消息發(fā)現(xiàn) 入口函數(shù)被執(zhí)行,但是

SetWindowLong 沒有被執(zhí)行........

原來當鉤子入口函數(shù)執(zhí)行的時候 鉤子所在進程是有啦 ,但是進程的窗體還沒出來,獲取不到窗體句柄和控件句柄.

后來把 SetWindowLong 嘗試放在其他位置 , 發(fā)現(xiàn)掛鉤總是過濾不到消息不然就是引起其他程序崩潰..........

下樓完吃飯 , 找到突破口 , 嘗試了下 , 好啦.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

鉤任務(wù)管理器的 WndProc 為例子...............

HOOK控件WndProc的話,需要先枚舉出你要搞的那個的句柄,然后就不用說了吧,枚舉自己來,我這里不搞了.

ibrary zhusjm;

uses
Windows, Messages, SysUtils, Dialogs, psapi;

var
OldHook: HHOOK;
OldProc:FARPROC;
CriticalSection: TRTLCriticalSection;

Function WndProc(Hwnd,Msg,wParam,lParam:longint):LRESULT; stdcall;
begin
case Msg of
//WM_PAINT: 這東西好啊 = = ,搞點什么好事都不錯丫,嘻嘻嘻
WM_MOUSEMOVE:
begin
showmessage('s');
end;
end;
Result:=CallWindowProc(OldProc,Hwnd,Msg,wParam,lParam);
end;


procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
var
Winh:HWND;
begin
CallNextHookEx(OldHook, nCode, wParam, lParam);
end;


function SetHook:Boolean;stdcall;
begin
OldHook:=SetWindowsHookEx(WH_GETMESSAGE,@HookProc, Hinstance,0);
if (OldHook=0) then
begin
exit
end
else
Result:=True;
end;


procedure UnHook; stdcall;
begin
UnhookWindowsHookEx(OldHook);
end;


function IdToExeDir(dwProcessId : DWORD): String;
var
cbNeeded : DWORD;
hProcess : THandle;
hModules : HMODULE;
lpFilename : array [0..1024-1] of Char;
begin
result:='';
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,dwProcessId);
if hProcess=0 then exit;
EnumProcessModules(hProcess,@hModules,sizeof(hModule),cbNeeded);
GetModuleFileNameEx(hProcess,hModules,lpFilename,1024);
result:=lpFilename;
CloseHandle(hProcess);
end;


procedure SetWndProc;
var
WinStr:HWND;
begin
EnterCriticalSection(CriticalSection);
Sleep(2000); //等兩秒,嘿嘿 這回窗口出來了吧~
WinStr:=FindWindow(nil,'Windows 任務(wù)管理器');
OldProc:=FARPROC(GetWindowLong(WinStr,GWL_WNDPROC));
if WinStr<>0 then
begin
SetWindowLong(WinStr,GWL_WNDPROC,Longint(@WndProc));
end;
LeaveCriticalSection(CriticalSection);
ExitThread(4);
end;


procedure FindWindows;
var
WinStr:HWND;
ThreadId1:DWORD;
begin
if pos('taskmgr',IdToExeDir(GetCurrentProcessID))>0 then
begin
if CriticalSection.RecursionCount<>0 then
DeleteCriticalSection(CriticalSection);
InitializeCriticalSection(CriticalSection);
CreateThread(nil,0,@SetWndProc,nil,0,ThreadId1); //雖然這時候窗口沒出來find不到句柄,那我們不懂來個線程啊,嘻嘻嘻嘻
end;
end;


procedure DllMain(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
FindWindows;
end;
DLL_PROCESS_DETACH:
begin

end;
end;
end;

exports
SetHook,
UnHook;

begin
DLLProc:=@DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多