您现在的位置是:主页 > news > 厦门海沧网站建设/深圳seo优化服务
厦门海沧网站建设/深圳seo优化服务
admin2025/6/30 5:38:55【news】
简介厦门海沧网站建设,深圳seo优化服务,做网站的背景照,永年网站建设导读: 新一篇: 我是怎么了 木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中࿰…
厦门海沧网站建设,深圳seo优化服务,做网站的背景照,永年网站建设导读: 新一篇: 我是怎么了 木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中࿰…
导读:
新一篇: 我是怎么了
木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中,找到保存密码的文件,等等。这里,我着重研究的是关于键盘和鼠标监听的技术。
首先,我们必须了解windows的消息处理机制。在windows系统下,对于某一窗口,用户或者系统对它的操作都是一个消息,这些消息会放入到一个FIFO的队列中,该窗口会依次从队列中取出消息,从而做出相应的反应。当然,也有一些类型的消息是例外的,它们可以优先被取出。
那么,很自然的,要想截获键盘和鼠标的信息,也就是要截获相应的消息,并在将该消息传递给窗口前先做出处理,然后再传递给相应窗口或者停止传递。windows下有一个称为钩子(hook)的东西,它可以捕获windows的消息,下面,我们来看一下钩子到底该如何使用。
一、钩子的安装。
使用API函数SetWidowsHookEx()可以创建一个自定义的钩子。其具体参数如下:
HHOOK SetWindowsHookEx(
int idHook, // 钩子的类型,即它处理的消息类型
HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
// 或是一个由别的进程创建的线程的标识,
// lpfn必须指向DLL中的钩子子程。
// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的DLL。
// 如果dwThreadId 标识当前进程创建的一个线程,
// 而且子程代码位于当前进程,hMod必须为NULL。
// 可以很简单的设定其为本应用程序的实例句柄。
DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
// 如果为0,钩子子程与所有的线程关联,即为全局钩子。
);
其中,由于我们需要监视的是键盘和鼠标,所以,idHook可以设为WM_KEYBOARD或WM_MOUSE,钩子子程的函数形式为
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
其中,HookProc是应用程序定义的名字。nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
另外,别忘了我们的目的,我们要监视的可不是仅仅是自己进程的操作,因此,dwThreadId需要设为0。而且,这个钩子需要放入动态链接库,才能达到监视的作用。
二、资源的共享
仅仅放入动态链接库是没用的,我们要让这个钩子为多有的进程所共享,这样才能够监视鼠键的一举一动。所以,我们可以这么做:
#pragma data_seg("SharedData")
HHOOK hHook=NULL;
#pragma data_seg()
另外,在导出dll的*.def中加入
SETCTIONS
SharedData READ WRITE SHARED
注意第二行中的SharedData前不要有空格;或者可以在cpp文件中加入
#pragma comment(linker,"/section:.SharedDataName,rws")
两种方法的效果是一样的。
三、钩子的卸载
经过以上的准备,鼠键的操作可以说是全在自己的掌控之中了,那么,只差最后一步,当我监视完后,如何将钩子卸载了,以免影响系统速度。这个就相对很简单了,只需使用如下的函数即可
UnHookWindowsHookEx
(
HHOOK hhk;//需要卸载的钩子
);
(以上参考了MSDN的HOOK专题文章)
最后,附上一段对鼠标操作进行监控的dll段代码,参考了玉海园的《Win32全局钩子在VC5中的实现》
#pragma data_seg("ShareDataName")
HWND glhPrevTarWnd=NULL;
HWND glhDisplayWnd=NULL;
HHOOK glhHook=NULL;
HINSTANCE glhInstance=NULL;
#pragma data_seg()
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam);
static AFX_EXTENSION_MODULE mouseHook2DLL = ...{ NULL, NULL }
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
...{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
...{
TRACE0("mouseHook2.DLL 正在初始化! ");
//MessageBox(NULL,"mouseHook2.DLL 正在初始化! ",NULL,MB_OK);
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(mouseHook2DLL, hInstance))
return 0
// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL(如 ActiveX 控件)隐式链接到
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。
new CDynLinkLibrary(mouseHook2DLL);
//
glhInstance = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
...{
TRACE0("mouseHook2.DLL 正在终止! ");
//MessageBox(NULL,"mouseHook2.DLL 正在终止! ",NULL,MB_OK);
// 在调用析构函数之前终止该库
AfxTermExtensionModule(mouseHook2DLL);
}
return 1 // 确定
}
Cmousehook2::Cmousehook2()
//类构造函数
...{
}
Cmousehook2::~Cmousehook2()
//类析构函数
...{
stophook();
}
BOOL Cmousehook2::starthook(HWND hWnd)
//安装钩子并设定接收显示窗口句柄
...{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if(glhHook!=NULL)
...{
//MessageBox(NULL,"mouseHook2.DLL! ",NULL,MB_OK);
bResult=TRUE;
}
//创建钩子不成功
else
...{
CHAR szBuf[80];
DWORD dw = GetLastError();
sprintf(szBuf, "failed: GetLastError returned %u ", dw);
MessageBox(NULL, szBuf, "Error", MB_OK);
}
glhDisplayWnd=hWnd;
//设置显示目标窗口标题编辑框的句柄
return bResult;
}
BOOL Cmousehook2::stophook()
//卸载钩子
...{
BOOL bResult=FALSE;
if(glhHook)
...{
bResult=UnhookWindowsHookEx(glhHook);
if(bResult)
...{
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
}
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
...{
//MessageBox(NULL,"haha",NULL,MB_OK);
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
if (nCode>=0)
...{
HWND glhTargetWnd=pMouseHook->hwnd;
//取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
...{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd);
//取应用程序主窗口句柄
}
if(glhTargetWnd!=glhPrevTarWnd)
...{
char szCaption[100];
GetWindowText(glhTargetWnd,szCaption,100);
// MessageBox(NULL,szCaption,NULL,MB_OK);
//取目标窗口标题
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_SETTEXT,0,
(LPARAM)(LPCTSTR)szCaption);
//::UpdateWindow(glhDisplayWnd);
glhPrevTarWnd=glhTargetWnd;
//保存目标窗口
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam);
//继续传递消xi
}
本文转自
http://blog.csdn.net/jerrycircle/archive/2006/11/07/1372070.aspx
新一篇: 我是怎么了
木马是如何获取别人密码的呢?方法有很多,比如欺骗法(伪造一个假的界面,来骗取对方的密码),监听对方的键盘鼠标操作,或者直接侵入到系统文件夹中,找到保存密码的文件,等等。这里,我着重研究的是关于键盘和鼠标监听的技术。
首先,我们必须了解windows的消息处理机制。在windows系统下,对于某一窗口,用户或者系统对它的操作都是一个消息,这些消息会放入到一个FIFO的队列中,该窗口会依次从队列中取出消息,从而做出相应的反应。当然,也有一些类型的消息是例外的,它们可以优先被取出。
那么,很自然的,要想截获键盘和鼠标的信息,也就是要截获相应的消息,并在将该消息传递给窗口前先做出处理,然后再传递给相应窗口或者停止传递。windows下有一个称为钩子(hook)的东西,它可以捕获windows的消息,下面,我们来看一下钩子到底该如何使用。
一、钩子的安装。
使用API函数SetWidowsHookEx()可以创建一个自定义的钩子。其具体参数如下:

HHOOK SetWindowsHookEx(

int idHook, // 钩子的类型,即它处理的消息类型

HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0

// 或是一个由别的进程创建的线程的标识,

// lpfn必须指向DLL中的钩子子程。

// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。

// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。

HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的DLL。

// 如果dwThreadId 标识当前进程创建的一个线程,

// 而且子程代码位于当前进程,hMod必须为NULL。

// 可以很简单的设定其为本应用程序的实例句柄。

DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。

// 如果为0,钩子子程与所有的线程关联,即为全局钩子。

);


其中,由于我们需要监视的是键盘和鼠标,所以,idHook可以设为WM_KEYBOARD或WM_MOUSE,钩子子程的函数形式为
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
其中,HookProc是应用程序定义的名字。nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
另外,别忘了我们的目的,我们要监视的可不是仅仅是自己进程的操作,因此,dwThreadId需要设为0。而且,这个钩子需要放入动态链接库,才能达到监视的作用。
二、资源的共享
仅仅放入动态链接库是没用的,我们要让这个钩子为多有的进程所共享,这样才能够监视鼠键的一举一动。所以,我们可以这么做:
#pragma data_seg("SharedData")
HHOOK hHook=NULL;
#pragma data_seg()
另外,在导出dll的*.def中加入
SETCTIONS
SharedData READ WRITE SHARED
注意第二行中的SharedData前不要有空格;或者可以在cpp文件中加入
#pragma comment(linker,"/section:.SharedDataName,rws")
两种方法的效果是一样的。
三、钩子的卸载
经过以上的准备,鼠键的操作可以说是全在自己的掌控之中了,那么,只差最后一步,当我监视完后,如何将钩子卸载了,以免影响系统速度。这个就相对很简单了,只需使用如下的函数即可
UnHookWindowsHookEx
(
HHOOK hhk;//需要卸载的钩子
);
(以上参考了MSDN的HOOK专题文章)
最后,附上一段对鼠标操作进行监控的dll段代码,参考了玉海园的《Win32全局钩子在VC5中的实现》


#pragma data_seg("ShareDataName")

HWND glhPrevTarWnd=NULL;

HWND glhDisplayWnd=NULL;

HHOOK glhHook=NULL;

HINSTANCE glhInstance=NULL;

#pragma data_seg()


LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam);


static AFX_EXTENSION_MODULE mouseHook2DLL = ...{ NULL, NULL }


extern "C" int APIENTRY

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)


...{

// 如果使用 lpReserved,请将此移除

UNREFERENCED_PARAMETER(lpReserved);


if (dwReason == DLL_PROCESS_ATTACH)


...{

TRACE0("mouseHook2.DLL 正在初始化! ");

//MessageBox(NULL,"mouseHook2.DLL 正在初始化! ",NULL,MB_OK);

// 扩展 DLL 一次性初始化

if (!AfxInitExtensionModule(mouseHook2DLL, hInstance))

return 0


// 将此 DLL 插入到资源链中

// 注意: 如果此扩展 DLL 由

// MFC 规则 DLL(如 ActiveX 控件)隐式链接到

// 而不是由 MFC 应用程序链接到,则需要

// 将此行从 DllMain 中移除并将其放置在一个

// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的

// 规则 DLL 然后应显式

// 调用该函数以初始化此扩展 DLL。否则,

// CDynLinkLibrary 对象不会附加到

// 规则 DLL 的资源链,并将导致严重的

// 问题。


new CDynLinkLibrary(mouseHook2DLL);

//

glhInstance = hInstance;


}

else if (dwReason == DLL_PROCESS_DETACH)


...{

TRACE0("mouseHook2.DLL 正在终止! ");

//MessageBox(NULL,"mouseHook2.DLL 正在终止! ",NULL,MB_OK);

// 在调用析构函数之前终止该库

AfxTermExtensionModule(mouseHook2DLL);

}

return 1 // 确定

}


Cmousehook2::Cmousehook2()

//类构造函数


...{

}

Cmousehook2::~Cmousehook2()

//类析构函数


...{

stophook();

}

BOOL Cmousehook2::starthook(HWND hWnd)

//安装钩子并设定接收显示窗口句柄


...{


BOOL bResult=FALSE;

glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);

if(glhHook!=NULL)


...{

//MessageBox(NULL,"mouseHook2.DLL! ",NULL,MB_OK);

bResult=TRUE;

}

//创建钩子不成功

else


...{

CHAR szBuf[80];

DWORD dw = GetLastError();


sprintf(szBuf, "failed: GetLastError returned %u ", dw);


MessageBox(NULL, szBuf, "Error", MB_OK);

}

glhDisplayWnd=hWnd;

//设置显示目标窗口标题编辑框的句柄

return bResult;

}


BOOL Cmousehook2::stophook()

//卸载钩子


...{

BOOL bResult=FALSE;

if(glhHook)


...{

bResult=UnhookWindowsHookEx(glhHook);

if(bResult)


...{

glhPrevTarWnd=NULL;

glhDisplayWnd=NULL;//清变量

glhHook=NULL;

}

}

return bResult;

}


LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)


...{

//MessageBox(NULL,"haha",NULL,MB_OK);

LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;

if (nCode>=0)


...{

HWND glhTargetWnd=pMouseHook->hwnd;

//取目标窗口句柄

HWND ParentWnd=glhTargetWnd;

while (ParentWnd !=NULL)


...{

glhTargetWnd=ParentWnd;

ParentWnd=GetParent(glhTargetWnd);

//取应用程序主窗口句柄

}

if(glhTargetWnd!=glhPrevTarWnd)


...{

char szCaption[100];

GetWindowText(glhTargetWnd,szCaption,100);

// MessageBox(NULL,szCaption,NULL,MB_OK);

//取目标窗口标题

if(IsWindow(glhDisplayWnd))

SendMessage(glhDisplayWnd,WM_SETTEXT,0,

(LPARAM)(LPCTSTR)szCaption);

//::UpdateWindow(glhDisplayWnd);

glhPrevTarWnd=glhTargetWnd;

//保存目标窗口

}

}

return CallNextHookEx(glhHook,nCode,wparam,lparam);

//继续传递消xi

}
本文转自
http://blog.csdn.net/jerrycircle/archive/2006/11/07/1372070.aspx