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函数处理消息
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函数处理消息