首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

HOOK DLL注入的有关问题

2013-03-12 
HOOK DLL注入的问题本帖最后由 kxltsuperr 于 2013-02-27 21:37:57 编辑编写了一个用HOOK注入DLL的小程序,

HOOK DLL注入的问题
本帖最后由 kxltsuperr 于 2013-02-27 21:37:57 编辑 编写了一个用HOOK注入DLL的小程序,似乎是注入成功了,但是用XUETR和Windows优化大师的进程管理查看进程中的DLL模块,却没有发现我的dll模块...求各位大侠指点迷经...困扰了我一天了。(vc6.0+xp)。代码:
DLL模块代码(Win32 Dynamic-Link Library)

#include "stdafx.h"
//安装钩子函数
extern "C" __declspec(dllexport)  BOOL SetHook(DWORD dwThreadId);
//钩子函数
extern "C" __declspec(dllexport)  LRESULT CALLBACK MyProc(int nCode,WPARAM wParam,LPARAM lParam);

//钩子句柄
HHOOK hHook=NULL;
//当前DLL句柄
HINSTANCE hInst;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
hInst=(HINSTANCE)hModule;
    return TRUE;
}

// 安装钩子函数,dwThreadId是线程ID
extern "C" _declspec(dllexport) BOOL SetHook(DWORD dwThreadId) 

//如果线程ID不等于0,安装钩子
if (dwThreadId != 0) 
{
MessageBox(NULL, "DLL即将注入进程空间! ","DLL", MB_ICONINFORMATION + MB_OK); 
// 安装指定线程的钩子 
hHook =::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyProc, hInst,dwThreadId); 
if (hHook != NULL) 
return TRUE;
}
//如果进程ID等于0,卸载钩子
else 
{
MessageBox(NULL, "DLL即将从进程空间中撤出!","DLL", MB_ICONINFORMATION + MB_OK); 
return (::UnhookWindowsHookEx(hHook)); 

return TRUE; 


// 钩子函数 
extern "C" _declspec(dllexport) LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam) 

// 因为只是演示DLL注入,所以这里什么也不做,交给系统处理 
return (::CallNextHookEx(hHook, nCode, wParam, lParam)); 


把Test_Hook_Dll.lib和Test_Hook_Dll.dll都拷贝到执行程序的目录下,执行程序(MFC EXE Dialog)调用DLL
#pragma comment(lib,"Test_Hook_Dll.lib")

//按钮1---载入DLL
void CTest_Hook_Inject_ExeDlg::OnButton1() 

PROCESS_INFORMATION info; 
STARTUPINFO start={sizeof(start)}; 
// 为了简单起见,我在这里直接新创建了一个记事本进程,以便取得它的线程ID对其安装钩子,把我们的DLL注入到记事本进程中。 
BOOL bRet = ::CreateProcess(NULL,TEXT("C:\\WINDOWS\\SYSTEM32\\notepad.exe"), NULL, NULL, TRUE, 0, NULL, NULL, &start, &info); 
if (bRet != 0) 
{
if(SetHook(info.dwProcessId)==TRUE)
::AfxMessageBox("Sethook success");

else 
{
::AfxMessageBox("CreateProcess failed with error");
}

//按钮2---卸载钩子
void CTest_Hook_Inject_ExeDlg::OnButton2() 

SetHook(0);


执行结果,也显示了弹出框 Sethook success,但查看记事本的进程,没有发现我的Test_Hook_Dll.dll模块........这到底哪里出错了?
[解决办法]
hHook应该得设置成共享段
[解决办法]
在http://www.codeproject.com搜“hook”
[解决办法]
hHook =::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyProc, hInst,dwThreadId);



hInst句柄错了,而且是错了2次,自己想想,怎么错了2次,呵呵呵

热点排行