MFC DLL的问题
LRESULTCALLBACKKeyboardProc(intnCode,WPARAMwParam,LPARAMlParam){//以便正确的读取对话框的资源AFX_MA...
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pMainDlg = new CGameDllDlg();
pMainDlg->Create(IDD_DIALOG1, pCWnd);
pMainDlg->ShowWindow(SW_SHOW);
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMainDlg == NULL)
{
//更改当前有效模块状态到DLL中
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pMainDlg = new CGameDllDlg();
pMainDlg->Create(IDD_DIALOG1, pCWnd);
pMainDlg->ShowWindow(SW_SHOW);
}
else
{
//根据窗口的状态来显示或隐藏 pMainDlg->ShowWindow(pMainDlg->IsWindowVisible() ? SW_HIDE : SW_SHOW);
}
}
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}
extern "C" __declspec(dllexport) BOOL WINAPI InstallHook(DWORD dwID)
{
char szProcessId[64] ;
itoa ( dwID, szProcessId, 10 );
MessageBox ( NULL, szProcessId,"进程ID", MB_OK );
dwID=GetThreadIDByProcssID(dwID);
itoa ( dwID, szProcessId, 10 );
MessageBox ( NULL, szProcessId,"线程ID", MB_OK );
if (g_hhook == NULL)
{
g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, dwID);
if (g_hhook == NULL)
{
return FALSE;
}
MessageBox(NULL,"成功HOOK,请在远程进程上按F12测试","提示",MB_OK);
}
if (g_hhook>0)
MessageBox(NULL,"钩子有句柄了","提示",MB_OK);
return TRUE;
}
下面是初始化
CGameDllApp theApp;
CGameDllDlg *pMainDlg = NULL;
BOOL CGameDllApp::InitInstance()
{
CWinApp::InitInstance();
InstallHook(GetCurrentProcessId());//安装钩子
// CString str;
// str.Format("%d",GetThreadIDByProcssID(GetCurrentProcessId()));
return TRUE;
}
//从进程ID得线程ID
DWORD GetThreadIDByProcssID(DWORD dwProcessID)
{
DWORD dwThreadID = 0;
THREADENTRY32 te32 = {sizeof(te32)};
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);
if( Thread32First( hThreadSnap, &te32) )
{
do{
if( dwProcessID == te32.th32OwnerProcessID && te32.th32ThreadID==GetCurrentThreadId() )
{
dwThreadID = te32.th32ThreadID;
break;
}
}while( Thread32Next( hThreadSnap, &te32) );
}
return dwThreadID;
}
主程序
用WriteProcessMemory LoadLibrary 和CreateRemoteThread把DLL写入远程进程
问题:
按F12呼不出MFCDLL界面
(不用CreateRemoteThread等函数,把调用钩子函数InitInstance放在主程序调用时能F12呼出窗体)
还是说HOOK对当前进程无效?
要求:
1.不用全局钩子注入,比如 A.EXE(有一个以上的进程),当某一A.EXE前置时按F12呼出窗体
2.当关闭用来注入DLL的主程序时,还能完成1的功能.各进程间不共享HOOK句柄
---
哪位高人能给份原码或思路,感谢非常!!!分会及时打到您帐上,并追加50分!!! 展开
{
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pMainDlg = new CGameDllDlg();
pMainDlg->Create(IDD_DIALOG1, pCWnd);
pMainDlg->ShowWindow(SW_SHOW);
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMainDlg == NULL)
{
//更改当前有效模块状态到DLL中
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pMainDlg = new CGameDllDlg();
pMainDlg->Create(IDD_DIALOG1, pCWnd);
pMainDlg->ShowWindow(SW_SHOW);
}
else
{
//根据窗口的状态来显示或隐藏 pMainDlg->ShowWindow(pMainDlg->IsWindowVisible() ? SW_HIDE : SW_SHOW);
}
}
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}
extern "C" __declspec(dllexport) BOOL WINAPI InstallHook(DWORD dwID)
{
char szProcessId[64] ;
itoa ( dwID, szProcessId, 10 );
MessageBox ( NULL, szProcessId,"进程ID", MB_OK );
dwID=GetThreadIDByProcssID(dwID);
itoa ( dwID, szProcessId, 10 );
MessageBox ( NULL, szProcessId,"线程ID", MB_OK );
if (g_hhook == NULL)
{
g_hhook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, theApp.m_hInstance, dwID);
if (g_hhook == NULL)
{
return FALSE;
}
MessageBox(NULL,"成功HOOK,请在远程进程上按F12测试","提示",MB_OK);
}
if (g_hhook>0)
MessageBox(NULL,"钩子有句柄了","提示",MB_OK);
return TRUE;
}
下面是初始化
CGameDllApp theApp;
CGameDllDlg *pMainDlg = NULL;
BOOL CGameDllApp::InitInstance()
{
CWinApp::InitInstance();
InstallHook(GetCurrentProcessId());//安装钩子
// CString str;
// str.Format("%d",GetThreadIDByProcssID(GetCurrentProcessId()));
return TRUE;
}
//从进程ID得线程ID
DWORD GetThreadIDByProcssID(DWORD dwProcessID)
{
DWORD dwThreadID = 0;
THREADENTRY32 te32 = {sizeof(te32)};
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);
if( Thread32First( hThreadSnap, &te32) )
{
do{
if( dwProcessID == te32.th32OwnerProcessID && te32.th32ThreadID==GetCurrentThreadId() )
{
dwThreadID = te32.th32ThreadID;
break;
}
}while( Thread32Next( hThreadSnap, &te32) );
}
return dwThreadID;
}
主程序
用WriteProcessMemory LoadLibrary 和CreateRemoteThread把DLL写入远程进程
问题:
按F12呼不出MFCDLL界面
(不用CreateRemoteThread等函数,把调用钩子函数InitInstance放在主程序调用时能F12呼出窗体)
还是说HOOK对当前进程无效?
要求:
1.不用全局钩子注入,比如 A.EXE(有一个以上的进程),当某一A.EXE前置时按F12呼出窗体
2.当关闭用来注入DLL的主程序时,还能完成1的功能.各进程间不共享HOOK句柄
---
哪位高人能给份原码或思路,感谢非常!!!分会及时打到您帐上,并追加50分!!! 展开
2个回答
展开全部
键盘钩子?
要求:
1.不用全局钩子注入,比如 A.EXE(有一个以上的进程),当某一A.EXE前置时按F12呼出窗体
★如果采用全局钩子,就不需要特别的注入。因为全局钩子会自动加载钩子DLL。这也是为什么全局钩子必须写在DLL中原因。如果不采用全局钩子,因为你要HOOK远进程,所以你必须注入。但是注入之后,就不能直接操作DLL了,因为他和你不在一个进程。解决的方法是,使用DllMain函数。但是DllMain中,不能有引起线程阻塞的代码。变通的方法是,首先禁止线程通知消息,然后创建一个新的线程,在这个新的线程中创建一个窗口,并且,对创建窗口的线程下局部键盘挂钩,检测到F12就ShowWindow...这种方法,根本不需要特意去判断是不是最上面的窗口,因为只有处于焦点的窗口才会收到键盘消息,而你只是下了一个局部挂钩。只有你下了挂钩并且收到键盘消息的窗口,才会去调用你的挂钩。没有收到消息的窗口不会无缘无故出来的。
2.当关闭用来注入DLL的主程序时,还能完成1的功能.各进程间不共享HOOK句柄
★这个相当简单。一旦注入,就是等待LoadLibrary或者说DLLMAIN返回,用来注入的程序就可以返回了。没什么不可以。各进程间不共享HOOK句柄,晕。只要你不把他们放到共享段,那么他们本来就不会共享的。
要求:
1.不用全局钩子注入,比如 A.EXE(有一个以上的进程),当某一A.EXE前置时按F12呼出窗体
★如果采用全局钩子,就不需要特别的注入。因为全局钩子会自动加载钩子DLL。这也是为什么全局钩子必须写在DLL中原因。如果不采用全局钩子,因为你要HOOK远进程,所以你必须注入。但是注入之后,就不能直接操作DLL了,因为他和你不在一个进程。解决的方法是,使用DllMain函数。但是DllMain中,不能有引起线程阻塞的代码。变通的方法是,首先禁止线程通知消息,然后创建一个新的线程,在这个新的线程中创建一个窗口,并且,对创建窗口的线程下局部键盘挂钩,检测到F12就ShowWindow...这种方法,根本不需要特意去判断是不是最上面的窗口,因为只有处于焦点的窗口才会收到键盘消息,而你只是下了一个局部挂钩。只有你下了挂钩并且收到键盘消息的窗口,才会去调用你的挂钩。没有收到消息的窗口不会无缘无故出来的。
2.当关闭用来注入DLL的主程序时,还能完成1的功能.各进程间不共享HOOK句柄
★这个相当简单。一旦注入,就是等待LoadLibrary或者说DLLMAIN返回,用来注入的程序就可以返回了。没什么不可以。各进程间不共享HOOK句柄,晕。只要你不把他们放到共享段,那么他们本来就不会共享的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询