亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用跨進程子類化技術實現對其它進程消息的攔載

2019-11-18 18:29:58
字體:
來源:轉載
供稿:網友
      大家都知道每個窗口都有默認的窗口函數來進行對窗口消息的處理.
  而子類化技術就是替換窗口的窗口函數為自己定義的函數的技術.例如下面的代碼:
var
  Form1: TForm1;
  OldWndPRoc: Pointer;
implementation

{$R *.dfm}
function NewWndProc(hHwnd, Msg, wParam, lParam: LongWord): Longint; stdcall;
begin
  if Msg=WM_CLOSE then
    exit;
  Result := CallWindowProc(OldWndProc, hHwnd, Msg, wParam, lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  {保存舊的窗口函數地址}
  OldWndProc := Pointer(GetWindowLong(Self.Handle, GWL_WNDPROC));
  {設置新的窗口函數為自定義函數}
  SetWindowLong(Self.Handle, GWL_WNDPROC, Longint(@NewWndProc));
end;
  這樣在窗口建立時就對窗口實現了子類化,這時按下窗口的關閉按鈕就會發現關不了窗口,因為新的窗口處理函數把WM_CLOSE消息過濾掉了,要取消子類化,只需要簡單的把以前的窗口函數恢復過來就可以了.SetWindowLong(Self.Handle, GWL_WNDPROC, Longint(OldWndProc));

  現在看來似乎很簡單,只要對其它進程中的目標窗口進行子類化就可以實現對其消息的攔載監視了.但是在WIN32下,每一個進程都有自己獨立的內存空間,新的窗口函數必須和目標窗口在同一個進程內,直接使用SetWindowLong(其它進程中窗口的句柄, GWL_WNDPROC, 新窗口函數)就會失敗,所以就要想辦法把我們的窗口函數代碼放到目標進程內,這兒有二個辦法,一是使用CreateRemoteThread在目標進程內建立線程,但這函數只在NT及以上操作系統實現,而且還要涉及到API地址重定位等問題,很麻煩(請參考http://www.csdn.net/develop/Read_Article.asp?Id=21079).另一個方法就是使用HOOK技術(SetWindowsHookEx,如果不知道,請先參考HOOK技術方面的文章),大家都知道,對其它進程進行HOOK時,此進程會自動加載HOOK過程所在的DLL,如果我們把窗口函數也放在DLL中,那窗口函數就相當于加載到了目標進程的地址空間中了,這方法簡單易行.在這里我們就采用HOOK技術來實現跨進程子類化.

  最后一個問題是如何在DLL中實現全局變量,因為DLL中的變量在每個進程加載這個DLL時都申請新的空間來存放變量,所以DLL中的變量在各個進程內不一樣,可以利用內存文件映射,WM_COPYDATA等方法來實現全局變量.這兒采用內存文件映射.

  現在需要的知識都已了解了,就讓我們來看具體的代碼吧(這兒是把所有函數放在一個DLL中):
library Hook;

uses
  SysUtils,windows, Messages;

const
  WM_UNSUBCLASS = WM_USER + 1001;  {卸載子類化消息}
  WM_NEWMESSAGE = WM_USER + 1002;  {通知監視窗口攔到了新消息}
  HOOK_EVENT_NAME = 'MyHook';

type
  PMyDLLVar = ^TMyDLLVar;
  TMyDLLVar = record
    SubClass: Boolean;                 {是否已經子類化}
    HookWindow, SpyWindow: LongWORD;   {要安裝HOOK的窗口及用于接收消息的窗口}
    hHook: LongWORD;                   {HOOK句柄}
    OldWndProc: pointer;               {舊的窗口過程}
    MsgHwnd: LongWORD;
    Msg: TMessage;
  end;

var
  DLLData: PMyDLLVar;

{---------------------------------------}
{函數名:NewWndProc
{函數功能:新的窗口過程
{函數參數:hHwnd:窗口句柄 Msg:消息ID
{         wParam, lParam:消息參數
{函數返回值:下一個窗口過程的返回值
{---------------------------------------}
function NewWndProc(hHwnd, Msg, wParam, lParam: LongWORD): Longint; stdcall;
begin
  if Msg = WM_UNSUBCLASS then   {如果收到卸載子類化消息就恢復以前的WndProc}
  begin
    SetWindowLong(DLLData^.HookWindow, GWL_WNDPROC, longint(DLLData^.OldWndProc));
    exit;
  end;
  {這兒是把收到的消息放在映射的內存中,我們自己的程序可以通過讀這個內存來得到監視到的消息.}
  DLLData^.Msg.Msg := Msg;           
  DLLData^.Msg.WParam := wParam;
  DLLData^.Msg.LParam := lParam;
  DLLData^.MsgHwnd := hHwnd;
  {給監視窗口發送攔載新消息的消息}
  SendMessage(DLLData^.SpyWindow, WM_NEWMESSAGE, 0, 0);
  {這兒可以添加自己對目標進程消息處理的代碼,因為己經是在目標進程的地址空間內,現在可以為所
  欲為 ^_^)
  Result := CallWindowProc(DLLData^.OldWndProc, hHwnd, Msg, wParam, lParam);
end;

{------------------------------------}
{過程名:HookProc
{過程功能:HOOK過程
{過程參數:nCode, wParam, lParam消息的相
{         關參數
{------------------------------------}
procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
var
  hEvent: THandle;
begin
  if not DllData^.SubClass then  {如果此窗口未子類化}
  begin                          {保存窗口過程地址并子類化}
    if hEvent <> 0 then
    begin
      WaitForSingleObject(hEvent, INFINITE);
      CloseHandle(hEvent);
    end;
    DLLData^.OldWndProc := pointer(GetWindowLong(DLLData^.HookWindow, GWL_WNDPROC));
    SetWindowLong(DLLData^.HookWindow, GWL_WNDPROC, integer(@NewWndProc));
    DLLData^.SubClass := True;
    hEvent := OpenEvent(Synchronize, False, HOOK_EVENT_NAME);
  end;
  {調用下一個Hook}
  CallNextHookEx(DLLData^.hHook, nCode, wParam, lParam);
end;


{------------------------------------}
{函數名:InstallHook
{函數功能:在指定窗口上安裝HOOK
{函數參數:HWindow:要安裝HOOK的窗口
{         SWindow:用于接收消息的窗口
{返回值:成功返回TRUE,失敗返回FALSE
{------------------------------------}
function InstallHook(HWindow, SWindow: LongWORD):Boolean;stdcall;
var
  ThreadID: LongWORD;
  hEvent: THandle;
begin
  Result := False;
  DLLData^.hHook := 0;
  DLLData^.HookWindow := HWindow;
  DLLData^.SpyWindow := SWindow;
  {得到指定窗口的線程ID}
  ThreadID := GetWindowThreadProcessId(HWindow, nil);
  {給指定窗口掛上鉤子}
  hEvent := CreateEvent(nil, True, False, HOOK_EVENT_NAME);
  DLLData^.hHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, ThreadID);
  SetEvent(hEvent);
  CloseHandle(hEvent);
  if DLLData^.hHook > 0 then Result := True;  {是否成功HOOK}
end;

{------------------------------------}
{過程名:UnHook
{過程功能:卸載HOOK
{過程參數:無
{------------------------------------}
procedure UnHook;stdcall;
begin
  {發送卸載子類化消息給指定窗口}
  SendMessage(DLLData^.HookWindow, WM_UNSUBCLASS, 0, 0);
  DLLData^.SubClass := False;
  {卸載Hook}
  UnhookWindowsHookEx(DLLData^.hHook);
end;

{------------------------------------}
{過程名:DLL入口函數
{過程功能:進行DLL初始化,釋放等
{過程參數:DLL狀態
{------------------------------------}
procedure MyDLLHandler(Reason: Integer);
var
  FHandle: LongWORD;
begin
  case Reason of
    DLL_PROCESS_ATTACH:
    begin            {建立文件映射,以實現DLL中的全局變量}
      FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, $ff, 'MYDLLDATA');
      if FHandle = 0 then
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        FHandle := OpenFileMapping(FILE_MAP_ALL_access, False, 'MYDLLDATA');
        if FHandle = 0 then Exit;
      end else Exit;
      DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
      if DLLData = nil then
        CloseHandle(FHandle);
    end;
    DLL_PROCESS_DETACH:
      if Assigned(DLLData) then
      begin
        UnmapViewOfFile(DLLData);
        DLLData := nil;
      end;
    DLL_THREAD_ATTACH:;
    DLL_THREAD_DETACH:;
  end;
end;

{$R *.res}
exports
  InstallHook, UnHook, HookProc;

begin
  DLLProc := @MyDLLHandler;
  MyDLLhandler(DLL_PROCESS_ATTACH);
end.

  編譯這個DLL,然后在我們的程序中加載這個DLL,并調用InstallHook(目標窗口句柄, 自己窗口句柄)就可  以實現對目標窗口消息的監視了(在接收到WM_NEWMESSAGE消息時讀映射的內存),調用UnHook則可以卸載掉子類化和HOOK.具休的代碼還請讀者自行編寫.


上一篇:動態創建ClientDataSet的表定義

下一篇:使用SQLSERVER的擴展存儲過程實現遠程備份與恢復

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品无人区乱码1区2区3区在线| 欧美与欧洲交xxxx免费观看| 欧美性猛交xxxx富婆| 成人精品在线视频| 精品国产欧美一区二区三区成人| 狠狠躁18三区二区一区| 欧美激情精品久久久久| 国产精品一二三视频| 日韩亚洲综合在线| 国产精品久久久久久久app| 国产成人久久久| 亚洲人成网站免费播放| 色婷婷综合久久久久中文字幕1| 亚洲精品黄网在线观看| 北条麻妃一区二区三区中文字幕| 国产精品视频最多的网站| 国产在线拍揄自揄视频不卡99| 亚洲人av在线影院| 欧美最近摘花xxxx摘花| 日韩精品欧美激情| 91精品视频大全| 亚洲国产精品美女| 欧美激情va永久在线播放| 国产亚洲精品激情久久| 亚洲a在线播放| 91色在线观看| 亚洲一区二区国产| 国产精品jizz在线观看麻豆| 国产精品美女免费| 不卡在线观看电视剧完整版| 国产精品爽黄69天堂a| 久久精品国产96久久久香蕉| 亚州成人av在线| 国产成人综合av| 91在线观看免费观看| 欧美激情a∨在线视频播放| 亚洲天堂网在线观看| 一本大道香蕉久在线播放29| 亚洲free性xxxx护士白浆| 欧美性猛交xxxx免费看漫画| 欧美成人午夜影院| 91九色精品视频| 亚洲成人av片| 欧美电影在线观看高清| 欧美精品免费看| 亚洲欧美制服中文字幕| 九九精品在线播放| 18性欧美xxxⅹ性满足| 日韩欧美国产中文字幕| 亚洲视频在线免费看| 亚洲天堂网在线观看| 国产一区二区三区高清在线观看| 中文字幕在线观看亚洲| 亚洲精品黄网在线观看| 久久久久久这里只有精品| 992tv成人免费视频| 国产一区二区三区在线视频| 欧美肥臀大乳一区二区免费视频| 这里精品视频免费| 欧美在线视频一二三| 97在线日本国产| 色综合色综合久久综合频道88| 欧日韩在线观看| 国产精品观看在线亚洲人成网| 欧美成人中文字幕在线| 精品福利在线看| 欧美精品aaa| 九九九久久国产免费| 成人午夜激情免费视频| 久久天天躁狠狠躁夜夜躁2014| 国产久一一精品| 国产精品福利网| 亚洲一级免费视频| 日韩在线观看免费高清完整版| 日韩成人中文电影| 91亚洲精品在线| 日韩美女av在线免费观看| 欧美精品久久久久a| 亚洲国产精品久久精品怡红院| 麻豆成人在线看| 91av福利视频| 一本一本久久a久久精品牛牛影视| 久久夜精品va视频免费观看| 欧美激情免费看| 久久久久久久久久久免费| 亚洲福利在线看| 亚洲精品国精品久久99热| 欧美日韩美女在线| 亚洲欧美国产精品va在线观看| 国产成人精品电影久久久| 在线性视频日韩欧美| 欧美老肥婆性猛交视频| 一区二区欧美激情| 亚洲精品电影网在线观看| 久久国内精品一国内精品| 欧美视频在线观看免费| 中文字幕欧美国内| 97高清免费视频| 国产精品久久久久久久app| 国产一区二区三区高清在线观看| 色噜噜狠狠狠综合曰曰曰| 成人精品福利视频| 欧美国产日韩一区二区三区| 日韩一区二区久久久| 久久久免费精品视频| 国产成人精品久久二区二区91| 欧美一区二区三区免费视| 亚洲女人天堂视频| 久久精品视频99| 国产一区二区三区在线播放免费观看| 欧美日本中文字幕| 亚洲精品欧美一区二区三区| 97视频在线观看播放| 国产乱肥老妇国产一区二| 国产成人精品免高潮费视频| 久久天天躁狠狠躁夜夜av| 91亚洲精品一区二区| 国产mv免费观看入口亚洲| 国产日韩在线观看av| 国产精品白嫩初高中害羞小美女| 久久久久久亚洲精品不卡| 亚洲精品98久久久久久中文字幕| 97久久伊人激情网| 在线精品91av| 亚洲jizzjizz日本少妇| 国产视频在线观看一区二区| 亚洲精品欧美日韩专区| 一区二区三区日韩在线| 91香蕉嫩草神马影院在线观看| 欧美一区二区影院| 福利精品视频在线| 日韩av最新在线| 久久视频国产精品免费视频在线| 性欧美xxxx交| 国产精品露脸自拍| 色综合五月天导航| 久久精品91久久久久久再现| 最近2019年手机中文字幕| 日韩精品在线电影| 神马国产精品影院av| 亚洲日本欧美日韩高观看| 欧美xxxx18性欧美| 亚洲欧美日韩在线高清直播| 国内精品小视频在线观看| 亚洲激情免费观看| 日本一区二区在线免费播放| 久久久国产精品免费| 国产精品成人av性教育| 波霸ol色综合久久| 4k岛国日韩精品**专区| 国产成人中文字幕| 成人激情电影一区二区| 国产精品直播网红| 亚洲精品自拍视频| 亚洲永久在线观看| 欧美激情一区二区三级高清视频| 亚洲激情视频网| 自拍偷拍亚洲区| 51ⅴ精品国产91久久久久久| 国产精品三级美女白浆呻吟| 国产一区二区三区在线观看视频| 91久久中文字幕| 日韩av网址在线观看| 欧美激情国产日韩精品一区18|