MFC第二天

HOOK函数是一个非常有用的技术,是各种木马病毒的必用技术。它能钩取各种消息。如果想钩取其它进程的消息, 这个函数必须写在动态库内。全局钩子必须写在动态库中。

SetWindowsHookEx(WH_CBT<勾取WM_CREATE消息>,lpfn<处理函数>,NULL<空表示钩取所有进程的消息>,0);
HHOOK SetWindowsHookEx(       
     int idHook,//钩子类型<WH_CBT>
    HOOKPROC lpfn,//钩子处理函数
    HINSTANCE hMod,//应用程序实例句柄
    DWORD dwThreadId//线程ID
);//返回值为钩子句柄
LRESULT CALLBACK CBTProc(         
     int nCode,//钩子码<HCBT_CREATEWND>
    WPARAM wParam,//新创建窗口的句柄,具体的钩子代码不同不一样。
    LPARAM lParam
);
想写病毒很简单,关键是怎么样挂病毒,怎么样免杀, 像钩子这种函数,360马上就干掉了。一层层的加盖。让360找不到你的钩子函数。挂病毒不是要学一下网络安全这方面的。
///
窗口创建及窗口处理函数
窗口的参数初始化
包括窗口类.风格窗口处理函数等信息. 
将DefWindowProc注册成窗口处理函数.
设置窗口创建HOOK (钩子) 
当窗口创建的时候,调用这个HOOK函数 
创建窗口
CreateWindowEx
卸载创建HOOK
将HOOK程序从当前程序中移除

仍然用WIN32来改.跟昨天一样。
#include "stdafx.h"
#include "MFCBase.h"
class CMyFrameWnd:public CFrameWnd{
public:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};
LRESULT CMyFrameWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){
switch (message)
{
case WM_CREATE:
AfxMessageBox(_T("wm_create"));
break;
}
return CFrameWnd::WindowProc(message,wParam,lParam);
}
class CMyWinApp: public CWinApp{
public:
   virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance(){
CMyFrameWnd *pFrame=new CMyFrameWnd;
CString str=_T("this is a window");
LPCTSTR lpszWindowName=str;
pFrame->Create(NULL,lpszWindowName); //设置一个断点
pFrame->ShowWindow(SW_NORMAL);
pFrame->UpdateWindow();
m_pMainWnd=pFrame;
return TRUE;
}
///
_AFX_THREAD_STATE ccc;//第三个全局变量,总共三个全局变量 。当前程序线程信息。
_afxWndFrameOrView===AFX_WNDFRAMEORVIEW===AFX_WNDCLASS("FrameOrView")="AfxFrameView42sd"
pFrame->Create(NULL,lpszWindowName);//函数内部this指针为pFrame
{
      CreateEx(有很多参数){
     CREATESTRUCT cs;
     cs.lpszClass = lpszClassName;//??窗口类名不能为空
      cs.hInstance = AfxGetInstanceHandle();//能够拿到当前进程的实例句柄
                PreCreateWindow(cs)//函数内部this指针为pFrame{
                            AfxDeferRegisterClass(){
                            WNDCLASS wndcls;
                           wndcls.lpfnWndProc = DefWindowProc;//????????????????
                          wndcls.hInstance = AfxGetInstanceHandle();
                      wndcls.hCursor = afxData.hcurArrow;
                              _AfxRegisterWithIcon(&wndcls, _afxWndFrameOrView,--)
                               {
                               &wndcls->lpszClassName = afxWndFrameOrView;
                               AfxRegisterClass(pWndCls)
                                   {
                                   ::AfxCtxRegisterClass(lpWndClass)
                                   }
                               }
}
cs.lpszClass = _afxWndFrameOrView;
}
           AfxHookWindowCreate(this)埋钩子
             {
             _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();获取当前程序线程信息(&ccc)
             pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,
_AfxCbtFilterHook, NULL, ::GetCurrentThreadId());//埋下钩子,在钩子处理函数中设置一个断点
pThreadState->m_pWndInit = pWnd;//将pFrame保存到当前程序线程信息ccc当中的一个成员。
             }
          ::AfxCtxCreateWindowEx()创建窗口之后马上WM_CREATE消息出来,于是钩子处理函数调用。
          _AfxCbtFilterHook()//钩子处理函数
          {
          _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();获取当前程序线程信息(&ccc)
          CWnd* pWndInit = pThreadState->m_pWndInit;//自己new的窗口类对象地址pFrame,基类型指针指向子类对象。多态
          HWND hWnd = (HWND)wParam;
               pWndInit->Attach(hWnd)
               {
               CHandleMap* pMap = afxMapHWND(TRUE)
                    {
                    AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();//获取全局变量bbb的地址。
                    pState->m_pmapHWND = new CHandleMap()//new子一个映射类对象,并将对象地址保存到bbb的成员变量中
                    return pState->m_pmapHWND;
                    }
                    pMap->SetPermanent(this->m_hWnd = hWndNew, this);this指针为pFrame,将句柄赋给对象的成员
                      {//函数内部this指针为pMap
                     this-> m_permanentMap[(LPVOID)h] = permOb;//将窗口类对象地址pFrame和窗口句柄进行绑定
                      }
               }
               WNDPROC afxWndProc = AfxGetAfxWndProc();//获取AfxWndProc函数地址。<真正的窗口处理函数
               oldWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC,
(DWORD_PTR)afxWndProc);<这个函数能够改变窗口处理函数,改成afxWndProc>
          }
}


}
///
窗口的参数初始化
包括窗口类.风格窗口处理函数等信息. 
将DefWindowProc注册成窗口处理函数.
设置窗口创建HOOK (钩子) 
当窗口创建的时候,调用这个HOOK函数 
创建窗口
CreateWindowEx
卸载创建HOOK
将HOOK程序从当前程序中移除
钩子( HOOK )程序
使用AfxGetAfxWndProc函数获取WNDPROC函数指针
AfxWndProc(AfxWndProcBase)函数地址.
将这个WNDPROC函数设置成当前窗口的处理函数
将窗口句柄和窗口类的指针保存到MFC的映射数据中.(afxMapHWND函数)

以WM_CREATE消息为例
1.调用堆栈查看一下WindowProc这个函数的调用关系。
AfxWndProc()//真正的窗口处理函数
{
CWnd *pWnd=CWnd::FromHandlePermanent(hWnd);//根据句柄拿到窗口类对象地址
     {
     CHandleMap*pMap=afxMapHWND()//映射类对象整个程序只能有一个
         {
         AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();//获取全局变量bbb的地址。
          return pState->m_pmapHWND;//返回上面new的映射类对象地址
          
         }
         CWnd *pWnd=NULL;
         pWnd=(CWnd*)pMap->LookupPermanent(hWnd);
         return pWnd;
     }
AfxCallWndProc(pWnd,)参数pWnd等同于pFrame
    {
    lResult=pWnd->WindowProc(nMsg,wParam,lParam);//多态,基类指针指向子类对象,回到自己的代码中。一般情况下不重写这个函数。不重写,CWnd::WindowProc
    }
}
///
AfxWndProc(Base)窗口处理函数
根据窗口句柄获取了相对应的窗口的CWnd *类型的指针,从映射数据中根据窗口句柄查找CWnd *指针. (afxMapHWND函数)
调用AfxCallWndProc函数
在AfxCallWndProc函数中,调用CWnd的WindowProc函数
注意: 在MFC程序当中,所有窗口都是使用同一个窗口处理函数.
窗口的创建及处理过程
将DefWindowProc函数注册成当前窗口的处理函数
设置钩子函数
创建窗口,并执行钩子函数
将窗口类指针和窗口句柄的对应关系保存. 
在钩子函数将AfxWndProc(Base)函数设置为当前窗口的窗口处理函数
在AfxWndProc(Base)收到窗口消息, 从窗口对应关系的数据中,根据窗口句柄查找相应的窗口类指针.
调用窗口类WindowProc函数处理消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值