MFC hook注入dll,远程线程注入dll

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <atlstr.h>  
  3. //很多人在vs2010找不到dllmain的文件,都倍封装好了,其实就在新建项目--win32--win32项目完后选择dll  
[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #define  WM_HOOKDLL WM_USER+2013  
  2. #pragma data_seg(".Share")    
  3. HWND g_hMainWnd=NULL;//主窗口句柄;    
  4. HHOOK hhkHook=NULL; //鼠标钩子句柄;    
  5. HINSTANCE hInstDll=NULL;//本dll实例句柄;   
  6. DWORD g_dwHookPid=-1;//要HOOK的进程的PID  
  7. BOOL g_bIsFirstLoad=TRUE;//判断是否是第一次加载本dll  
  8. #pragma data_seg()    
  9. #pragma comment(linker, "/section:.Share,rws")   
  10. struct ProcessWindow    
  11. {    
  12.     DWORD dwProcessId;    
  13.     HWND hwndWindow;    
  14.     DWORD dwThreadID;  
  15. };    
  16.   
  17. BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam) ;  
  18.   
  19.   
  20. BOOL CheckPid()  
  21. {  
  22.     if (g_bIsFirstLoad)  
  23.     {  
  24.         return TRUE;//这里第一次直接返回不运行下面的,当starthook执行后 吧这个dll加载到别的指定进程中  又会再一次执行下面的不执行这里了  因为已经true了  
  25.     }  
  26.     DWORD pid=GetCurrentProcessId();  
  27.     if (pid==g_dwHookPid)  
  28.     {  
  29.         return TRUE;  
  30.     }   
  31.     else  
  32.     {  
  33.         return FALSE;  
  34.     }  
  35. }  
  36.   
  37.   
  38. //鼠标钩子过程,目的是加载本dll到使用鼠标的程序    
  39. //鼠标钩子的作用:当鼠标在某程序窗口中时,其就会加载我们这个dll    
  40. LRESULT CALLBACK MouseProc(    
  41.     int nCode,      // hook code    
  42.     WPARAM wParam,  // message identifier    
  43.     LPARAM lParam   // mouse coordinates    
  44.     )    
  45. {    
  46.     return CallNextHookEx(hhkHook,nCode,wParam,lParam);    
  47. }    
  48.   
  49. //安装钩子    
  50. BOOL WINAPI StartHook(HWND hWnd,DWORD dwPid)    
  51. {    
  52.     g_hMainWnd=hWnd;  //保存主窗口句柄  
  53.     //g_dwHookPid=dwPid;//要HOOK的进程的PID  
  54.     /*hhkHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,hInstDll,0);   
  55.     if (hhkHook==NULL)   
  56.     {   
  57.         CString err; 
  58.         err.Format(_T("设置钩子失败 error code=%d"),GetLastError()); 
  59.         MessageBox(g_hMainWnd,err.GetString(),L"err",0); 
  60.         return FALSE;   
  61.     }    
  62.     else   
  63.     {   
  64.         return TRUE;   
  65.     }  */  
  66.     ProcessWindow procwin;    
  67.     procwin.dwProcessId = dwPid;   
  68.      procwin.hwndWindow = NULL;   
  69.      procwin.dwThreadID = NULL;  
  70.      EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);   
  71.     g_dwHookPid = procwin.dwThreadID;  
  72.     if(g_dwHookPid == NULL)  
  73.     {  
  74.         CString err;  
  75.         err.Format(_T("设置钩子失败 error code=%d"),GetLastError());  
  76.         MessageBox(g_hMainWnd,err.GetString(),L"err",0);  
  77.         return FALSE;  
  78.     }  
  79.     else  
  80.         return TRUE;  
  81. }    
  82.   
  83.   
  84. BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)    
  85. {    
  86.     ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;    
  87.   
  88.     DWORD dwProcessId;    
  89.     GetWindowThreadProcessId(hWnd, &dwProcessId);    
  90.   
  91.     // 判断是否是指定进程的主窗口    
  92.     if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)    
  93.     {    
  94.         DWORD proId;  
  95.         pProcessWindow->hwndWindow = hWnd;    
  96.         pProcessWindow->dwThreadID = GetWindowThreadProcessId(hWnd,&proId);  
  97.         return FALSE;    
  98.     }    
  99.   
  100.     return TRUE;    
  101. }    
  102. //卸载钩子    
  103. VOID WINAPI StopHook()    
  104. {    
  105.     //HookOff();//记得恢复原API入口哈    
  106.     //主程序调用该函数时,恢复的只是主程序原API的入口,    
  107.     //其它程序的API入口还没有被恢复,所以我们必须处理    
  108.     //dll退出过程,即在函数ExitInstance()中,调用恢复    
  109.     //API入口的函数HookOff(),只有这样,其它程序再次调用    
  110.     //原API时,才不会发生错误喔。    
  111.     //当我们HOOK所有程序的某个系统API时,千万要注意在    
  112.     //ExitInstance()中调用HookOff(),血的教训哈。    
  113.   
  114.     if (hhkHook!=NULL)    
  115.     {    
  116.         UnhookWindowsHookEx(hhkHook);    
  117.         FreeLibrary(hInstDll);    
  118.     }    
  119. }    
  120.   
  121. BOOL APIENTRY DllMain( HMODULE hModule,  
  122.                        DWORD  ul_reason_for_call,  
  123.                        LPVOID lpReserved  
  124.                      )  
  125. {  
  126.     switch (ul_reason_for_call)  
  127.     {  
  128.     case DLL_PROCESS_ATTACH:  
  129.         {  
  130.             if (!CheckPid())  
  131.             {  
  132.                 return FALSE;  
  133.             }  
  134.   
  135.             hInstDll=GetModuleHandle(0);//这行不能少  
  136.             g_bIsFirstLoad = FALSE;  
  137.             MessageBox(NULL,L"注入成功",L"信息",MB_ICONINFORMATION);  
  138.             break;  
  139.         }  
  140.     case DLL_THREAD_ATTACH:  
  141.         /*{ 
  142.  
  143.  
  144.         MessageBox(NULL,L"注入线程成功!",L"通知",MB_ICONINFORMATION); 
  145.         break; 
  146.         }*/  
  147.     case DLL_THREAD_DETACH:  
  148.         //{  
  149.         //  //MessageBox(NULL,L"注入线程卸载成功!",L"通知",MB_ICONINFORMATION);  
  150.         //  //break;  
  151.         //}  
  152.     case DLL_PROCESS_DETACH:  
  153.         {  
  154.               
  155.             SendMessage(g_hMainWnd,WM_HOOKDLL,8,0);  
  156.             break;  
  157.         }  
  158.     }  
  159.     return TRUE;  
  160. }  

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // TestDlg.h : 头文件  
  2. //  
  3.   
  4. #pragma once  
  5. #include "afxcmn.h"  
  6. #include "DlgProcess.h"  
  7.   
  8. //#define  WM_HOOKDLL WM_USER+2013  
  9. #define  WM_HOOKDLL WM_USER+2013  
  10. typedef struct  
  11. {  
  12.     CString strProcessName;  
  13.     DWORD dwPid;  
  14. }PROCESSINFO;  
  15.   
  16. // CTestDlg 对话框  
  17. class CTestDlg : public CDialogEx  
  18. {  
  19. // 构造  
  20. public:  
  21.     CTestDlg(CWnd* pParent = NULL); // 标准构造函数  
  22.   
  23. // 对话框数据  
  24.     enum { IDD = IDD_DIALOG1 };  
  25.   
  26.     protected:  
  27.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持  
  28.   
  29.   
  30. // 实现  
  31. protected:  
  32.     HICON m_hIcon;  
  33.   
  34.     // 生成的消息映射函数  
  35.     virtual BOOL OnInitDialog();  
  36.     afx_msg void OnPaint();  
  37.     afx_msg HCURSOR OnQueryDragIcon();  
  38.     afx_msg LRESULT OnHookDll(WPARAM wParam, LPARAM lParam);  
  39.     DECLARE_MESSAGE_MAP()  
  40. public:  
  41.        
  42. //  afx_msg void OnBnClickedButton1();  
  43. //  CString m_ShowHwnd;  
  44.       
  45. private:  
  46.     // 窗口是否在显示  
  47. //  BOOL m_visible;  
  48. public:  
  49.     afx_msg void OnDestroy();  
  50. //  CString m_ProcessId;  
  51. //  afx_msg void OnBnClickedButton2();  
  52. //  HWND hwnd;  
  53. //  CString m_ProcessHandle;  
  54. //  afx_msg void OnBnClickedButton3();  
  55. //  DWORD process_Id;  
  56. //  DWORD processID;  
  57. private:  
  58.     HWND gameHwnd;  
  59.     DWORD processID;  
  60.     INT gameAdress;  
  61. public:  
  62.     //afx_msg void OnBnClickedButton1();  
  63.     CString m_SNumber;  
  64. private:  
  65.     HANDLE processHandle;  
  66. public:  
  67.     //afx_msg void OnTimer(UINT_PTR nIDEvent);  
  68.     //  
  69.     //CString m_threadHandle;  
  70.     //CString m_threadID;  
  71.     //afx_msg void OnBnClickedButton2();  
  72.     //BOOL EnumThreadInfo(DWORD proID);  
  73. private:  
  74.     CDWordArray dwArray;  
  75.     DWORD threadId;  
  76. public:  
  77.     //afx_msg void OnBnClickedButton3();  
  78. private:  
  79.     HANDLE threadHandle;  
  80. public:  
  81.     //afx_msg void OnBnClickedButton4();  
  82.   
  83. //  CListCtrl m_List;  
  84.     PROCESSINFO m_ProcessInfo;  
  85.     afx_msg void OnBnClickedButton2();  
  86.     afx_msg void OnBnClickedButton1();  
  87.     afx_msg void OnBnClickedButton3();  
  88.   
  89.     CString m_wndTitle;  
  90.     void EnableDebugPriv(void);  
  91.     CListCtrl m_List;  
  92.     afx_msg void OnClose();  
  93. };  

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // TestDlg.cpp : 实现文件  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "Test.h"  
  6. #include "TestDlg.h"  
  7. #include "afxdialogex.h"  
  8. #include <tlhelp32.h>   
  9. #include<iostream>  
  10.   
  11.   
  12. using namespace std;  
  13. #ifdef _DEBUG  
  14. #define new DEBUG_NEW  
  15. #endif  
  16.   
  17.   
  18. // CTestDlg 对话框  
  19.   
  20.   
  21.   
  22.   
  23. CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)  
  24.     : CDialogEx(CTestDlg::IDD, pParent)  
  25.   
  26.     , processID(0)  
  27.       
  28.     ,gameHwnd(NULL)  
  29.     , gameAdress(0)  
  30.       
  31.     , threadId(0)  
  32.     , threadHandle(0)  
  33.     , m_wndTitle(_T(""))  
  34. {  
  35.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
  36.   
  37.     //  m_ShowHwnd = _T("");  
  38.     //  m_ProcessId = _T("");  
  39.     //  m_ProcessHandle = _T("");  
  40.     m_SNumber = _T("");  
  41.     /*m_threadHandle = _T(""); 
  42.     m_threadID = _T("");*/  
  43.   
  44.     m_ProcessInfo.dwPid=-1;  
  45.     m_ProcessInfo.strProcessName=_T("未选择任何进程");  
  46. }  
  47.   
  48. void CTestDlg::DoDataExchange(CDataExchange* pDX)  
  49. {  
  50.     CDialogEx::DoDataExchange(pDX);  
  51.   
  52.     //  DDX_Text(pDX, IDC_EDIT2, m_ShowHwnd);  
  53.     //  DDX_Text(pDX, IDC_EDIT3, m_ProcessId);  
  54.     //  DDX_Text(pDX, IDC_EDIT4, m_ProcessHandle);  
  55.     /*DDX_Text(pDX, IDC_EDIT1, m_SNumber); 
  56.     DDX_Text(pDX, IDC_EDIT2, m_threadHandle); 
  57.     DDX_Text(pDX, IDC_EDIT3, m_threadID);*/  
  58.     DDX_Control(pDX, IDC_LIST1, m_List);  
  59. }  
  60.   
  61. BEGIN_MESSAGE_MAP(CTestDlg, CDialogEx)  
  62.     ON_WM_PAINT()  
  63.     ON_WM_QUERYDRAGICON()  
  64.       
  65.     ON_WM_HOTKEY()  
  66.     ON_WM_DESTROY()  
  67.       
  68.     /*ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)*/  
  69.     ON_WM_TIMER()  
  70.       
  71.     /*ON_BN_CLICKED(IDC_BUTTON2, &CTestDlg::OnBnClickedButton2) 
  72.     ON_BN_CLICKED(IDC_BUTTON3, &CTestDlg::OnBnClickedButton3) 
  73.     ON_BN_CLICKED(IDC_BUTTON4, &CTestDlg::OnBnClickedButton4)*/  
  74.     ON_BN_CLICKED(IDC_BUTTON2, &CTestDlg::OnBnClickedButton2)  
  75.     ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)  
  76.     ON_BN_CLICKED(IDC_BUTTON3, &CTestDlg::OnBnClickedButton3)  
  77.     ON_MESSAGE(WM_HOOKDLL,OnHookDll)  
  78.     ON_WM_CLOSE()  
  79. END_MESSAGE_MAP()  
  80.   
  81.   
  82. // CTestDlg 消息处理程序  
  83.   
  84. BOOL CTestDlg::OnInitDialog()  
  85. {  
  86.     CDialogEx::OnInitDialog();  
  87.   
  88.     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动  
  89.     //  执行此操作  
  90.     SetIcon(m_hIcon, TRUE);         // 设置大图标  
  91.     SetIcon(m_hIcon, FALSE);        // 设置小图标  
  92.   
  93.     // TODO: 在此添加额外的初始化代码  
  94.      gameHwnd = ::FindWindow(L"TXGuiFoundation",L"QQ");  
  95.       
  96.     ::GetWindowThreadProcessId(gameHwnd,&processID);  
  97.   
  98.     GetWindowText(m_wndTitle);  
  99.     GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);  
  100.     GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);  
  101.   
  102.     m_List.InsertColumn(0,_T("窗口"));  
  103.     m_List.SetColumnWidth(0,300);  
  104.     m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);  
  105.   
  106.     EnableDebugPriv();//提升权限  
  107.   
  108.   
  109.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE  
  110. }  
  111.   
  112. // 如果向对话框添加最小化按钮,则需要下面的代码  
  113. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,  
  114. //  这将由框架自动完成。  
  115.   
  116. void CTestDlg::OnPaint()  
  117. {  
  118.     if (IsIconic())  
  119.     {  
  120.         CPaintDC dc(this); // 用于绘制的设备上下文  
  121.   
  122.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  
  123.   
  124.         // 使图标在工作区矩形中居中  
  125.         int cxIcon = GetSystemMetrics(SM_CXICON);  
  126.         int cyIcon = GetSystemMetrics(SM_CYICON);  
  127.         CRect rect;  
  128.         GetClientRect(&rect);  
  129.         int x = (rect.Width() - cxIcon + 1) / 2;  
  130.         int y = (rect.Height() - cyIcon + 1) / 2;  
  131.   
  132.         // 绘制图标  
  133.         dc.DrawIcon(x, y, m_hIcon);  
  134.     }  
  135.     else  
  136.     {  
  137.         CDialogEx::OnPaint();  
  138.     }  
  139. }  
  140.   
  141. //当用户拖动最小化窗口时系统调用此函数取得光标  
  142. //显示。  
  143. HCURSOR CTestDlg::OnQueryDragIcon()  
  144. {  
  145.     return static_cast<HCURSOR>(m_hIcon);  
  146. }  
  147.   
  148.   
  149.   
  150. //void CTestDlg::OnBnClickedButton1()  
  151. //{  
  152. //  // TODO: 在此添加控件通知处理程序代码  
  153. //  if(m_ShowHwnd == CString(L""))  
  154. //  {  
  155. //        
  156. //      CString str;  
  157. //      hwnd = ::FindWindow(_T("TXGuiFoundation"),L"QQ");  
  158. //      str.Format(L"窗口句柄是:%x",hwnd);  
  159. //      m_ShowHwnd = str;  
  160. //      UpdateData(FALSE);  
  161. //  }  
  162. //    
  163. //}  
  164.   
  165.   
  166.   
  167. void CTestDlg::OnDestroy()  
  168. {  
  169.     CDialogEx::OnDestroy();  
  170.   
  171.   //KillTimer(1001);  
  172.     // TODO: 在此处添加消息处理程序代码  
  173. }  
  174.   
  175.   
  176. //void CTestDlg::OnBnClickedButton2()  
  177. //{  
  178. //  // TODO: 在此添加控件通知处理程序代码  
  179. //  if(m_ProcessId == L"")  
  180. //  {  
  181. //        
  182. //      DWORD dw =   GetWindowThreadProcessId(hwnd,&process_Id);  
  183. //      TRACE(L"the hwnd is:%x",hwnd);  
  184. //      CString str;  
  185. //      str.Format(L"进程ID是:%x",process_Id);  
  186. //      m_ProcessId = str;  
  187. //      UpdateData(FALSE);  
  188. //         
  189. //  }  
  190. //    
  191. //}  
  192.   
  193.   
  194. //void CTestDlg::OnBnClickedButton3()  
  195. //{  
  196. //  // TODO: 在此添加控件通知处理程序代码  
  197. //  if(m_ProcessHandle == L"")  
  198. //  {  
  199. //  
  200. //    
  201. //      HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,process_Id);  
  202. //      CString str;  
  203. //      str.Format(L"进程句柄是:%x",handle);  
  204. //      m_ProcessHandle = str;  
  205. //      UpdateData(FALSE);  
  206. //  }  
  207. //}  
  208.   
  209. //  
  210. //void CTestDlg::OnBnClickedButton1()  
  211. //{  
  212. //  // TODO: 在此添加控件通知处理程序代码  
  213. //  gameHwnd = ::FindWindow(L"#32770",L"对对碰角色版");  
  214. //  if(gameHwnd == NULL)  
  215. //  {  
  216. //      SetWindowText(L"程序未运行!");  
  217. //  }  
  218. //  else  
  219. //  {  
  220. //      SetWindowText(L"程序运行中!");  
  221. //      SetTimer(1001,1000,NULL);  
  222. //        
  223. //  }  
  224. //}  
  225. //  
  226. //  
  227. //void CTestDlg::OnTimer(UINT_PTR nIDEvent)  
  228. //{  
  229. //  // TODO: 在此添加消息处理程序代码和/或调用默认值  
  230. //  switch (nIDEvent)  
  231. //  {  
  232. //      case 1001:  
  233. //          {  
  234. //  
  235. //              LPCVOID addr = (LPCVOID)0x48F128;  
  236. //              LPVOID gameBuffer =new LPVOID;  
  237. //              DWORD bt;  
  238. //              CString str;  
  239. //              /*gameHwnd = ::FindWindow(L"#32770 (对话框)",L"对对碰角色版");*/  
  240. //              ::GetWindowThreadProcessId(gameHwnd,&processID);  
  241. //              processHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);  
  242. //              ReadProcessMemory(processHandle,addr,&gameBuffer,4,&bt);  
  243. //              str.Format(L"%d",(DWORD *)gameBuffer);  
  244. //              m_SNumber = str;  
  245. //              UpdateData(FALSE);  
  246. //              delete gameBuffer;  
  247. //          }  
  248. //  }  
  249. //  CDialogEx::OnTimer(nIDEvent);  
  250. //}  
  251. //  
  252. //  
  253. //  
  254. //  
  255. //void CTestDlg::OnBnClickedButton2()  
  256. //{  
  257. //  // TODO: 在此添加控件通知处理程序代码  
  258. //  if(threadId == NULL)  
  259. //  {  
  260. //      MessageBox(L"请先获取线程id!");  
  261. //      return;  
  262. //  }  
  263. //  threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId);  
  264. //    
  265. //  CString str;  
  266. //  str.Format(L"%d",threadHandle);  
  267. //  m_threadHandle = str;  
  268. //  UpdateData(FALSE);  
  269. //}  
  270. //  
  271. //  
  272. //BOOL CTestDlg::EnumThreadInfo(DWORD proID)  
  273. //{  
  274. //  // 定义线程信息结构    
  275. //  THREADENTRY32 te32 = {sizeof(THREADENTRY32)} ;    
  276. //  
  277. //  //创建系统线程快照    
  278. //  HANDLE hThreadSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPTHREAD, 0 ) ;    
  279. //  if ( hThreadSnap == INVALID_HANDLE_VALUE )    
  280. //      return FALSE ;    
  281. //  
  282. //  // 输出线程信息到文件    
  283. //    
  284. //  
  285. //  // 循环枚举线程信息    
  286. //  if ( Thread32First ( hThreadSnap, &te32 ) )    
  287. //  {    
  288. //      do{    
  289. //            
  290. //          if(te32.th32OwnerProcessID == proID)  
  291. //          {  
  292. //              cout << '\t' << "OwnerProcessID : " << te32.th32OwnerProcessID << endl ;    
  293. //              cout << '\t' << "Usage          : " << te32.cntUsage << endl ;    
  294. //              cout << '\t' << "Delta Priority : " << te32.tpDeltaPri << endl ;    
  295. //              cout << '\t' << "Base Priority  : " << te32.tpBasePri << endl ;   
  296. //              dwArray.SetSize(100,100);  
  297. //              INT index = 0;  
  298. //              dwArray.SetAt(index,te32.th32ThreadID);  
  299. //              index++;  
  300. //          }  
  301. //      }while ( Thread32Next ( hThreadSnap, &te32 ) ) ;    
  302. //  }    
  303. //  
  304. //    
  305. //  CloseHandle ( hThreadSnap ) ;    
  306. //  return TRUE ;    
  307. //}  
  308. //  
  309. //  
  310. //void CTestDlg::OnBnClickedButton3()  
  311. //{  
  312. //  // TODO: 在此添加控件通知处理程序代码  
  313. //    
  314. //  if(!EnumThreadInfo(processID))  
  315. //      MessageBox(L"查找进程出现未知错误");  
  316. //  INT index = 0;  
  317. //  threadId = dwArray.GetAt(index++);  
  318. //  CString str;  
  319. //  str.Format(L"%ld",threadId);  
  320. //  
  321. //  m_threadID = str;  
  322. //  UpdateData(FALSE);  
  323. //}  
  324. //  
  325. //  
  326. //void CTestDlg::OnBnClickedButton4()  
  327. //{  
  328. //  // TODO: 在此添加控件通知处理程序代码  
  329. //}  
  330.   
  331. HINSTANCE g_hInstDll=NULL;  
  332. void CTestDlg::OnBnClickedButton2()  
  333. {  
  334.     // TODO: 在此添加控件通知处理程序代码  
  335.   
  336.     g_hInstDll=LoadLibrary(_T("hook2.dll"));  
  337.     if (g_hInstDll==NULL)  
  338.     {  
  339.         CString err;  
  340.         err.Format(_T("加载dll失败 error code=%d"),GetLastError());  
  341.         AfxMessageBox(err);  
  342.         return;  
  343.     }  
  344.   
  345.     typedef BOOL (WINAPI *StartHook)(HWND hWnd,DWORD dwPid) ;  
  346.     StartHook Hook=NULL;  
  347.     Hook=(StartHook)::GetProcAddress(g_hInstDll,"StartHook");  
  348.     if (Hook==NULL)  
  349.     {  
  350.         AfxMessageBox(_T("获取dll函数失败"));  
  351.         return;  
  352.     }  
  353.   
  354.     //开始注入  
  355.     if (Hook(m_hWnd,m_ProcessInfo.dwPid))  
  356.     {  
  357.         AfxMessageBox(_T("hook sucess"));  
  358.     }   
  359.     else  
  360.     {  
  361.         AfxMessageBox(_T("hook failed"));  
  362.         return;  
  363.     }  
  364.   
  365.   
  366.     GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);  
  367.     GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);  
  368.     GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);  
  369.   
  370.      FreeLibrary(g_hInstDll);  
  371.   
  372.     const DWORD dwThreadSize = 5 * 1024;  
  373.     DWORD dwWriteBytes;  
  374.     // 提升进程访问权限  
  375.     EnableDebugPriv();  
  376.     // 等待输入进程名称,注意大小写匹配  
  377.     //std::cout << "Please input the name of target process !" << std::endl;  
  378.     //char szExeName[MAX_PATH] = { 0 };  
  379.     //std::cin >> szExeName;  
  380.     DWORD dwProcessId =m_ProcessInfo.dwPid;  
  381.     if( dwProcessId == 0 )  
  382.     {  
  383.         MessageBox(   
  384.             L"The target process have not been found !",L"Notice",MB_ICONINFORMATION|MB_OK);  
  385.       
  386.         return ;  
  387.     }  
  388.   
  389.     // 根据进程ID得到进程句柄  
  390.     HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);  
  391.     if( !hTargetProcess )  
  392.     {  
  393.         MessageBox(   
  394.             L"Open target process failed !",  
  395.             L"Notice",  
  396.             MB_ICONINFORMATION | MB_OK  
  397.             );  
  398.         return ;  
  399.     }  
  400.   
  401.     // 在宿主进程中为线程体开辟一块存储区域  
  402.     // 在这里需要注意MEM_COMMIT内存非配类型以及PAGE_EXECUTE_READWRITE内存保护类型  
  403.     // 其具体含义请参考MSDN中关于VirtualAllocEx函数的说明。  
  404.     void* pRemoteThread = VirtualAllocEx(   hTargetProcess,  
  405.         0,  
  406.         dwThreadSize,  
  407.         MEM_COMMIT , PAGE_EXECUTE_READWRITE);  
  408.     if( !pRemoteThread )  
  409.     {  
  410.         MessageBox( L"Alloc memory in target process failed !",  
  411.             L"notice",  
  412.             MB_ICONINFORMATION | MB_OK  
  413.             );  
  414.         return;  
  415.     }  
  416.     // 设置需要注入的DLL名称  
  417.     char szDll[256];  
  418.     memset(szDll, 0, 256);  
  419.     strcpy(szDll, "D:\\My Documents\\Visual Studio 2010\\Projects\\Test\\Debug\\hook2.dll");  
  420.     // 拷贝注入DLL内容到宿主空间  
  421.     if( !WriteProcessMemory(    hTargetProcess,  
  422.         pRemoteThread,  
  423.         (LPVOID)szDll,  
  424.         dwThreadSize,  
  425.         0) )  
  426.     {  
  427.         MessageBox( L"Write data to target process failed !",  
  428.             L"Notice",  
  429.             MB_ICONINFORMATION | MB_OK  
  430.             );  
  431.         return ;  
  432.     }  
  433.   
  434.     LPVOID pFunc = LoadLibraryA;  
  435.     //在宿主进程中创建线程  
  436.     HANDLE hRemoteThread = CreateRemoteThread(  hTargetProcess,  
  437.         NULL,  
  438.         0,  
  439.         (LPTHREAD_START_ROUTINE)pFunc,  
  440.         pRemoteThread,  
  441.         0,  
  442.         &dwWriteBytes);  
  443.     if( !hRemoteThread )  
  444.     {  
  445.         MessageBox( L"Create remote thread failed !",  
  446.             L"Notice",  
  447.             MB_ICONINFORMATION | MB_OK  
  448.             );  
  449.         return ;  
  450.     }  
  451.     // 等待LoadLibraryA加载完毕  
  452.     WaitForSingleObject(hRemoteThread, INFINITE );  
  453.     VirtualFreeEx(hTargetProcess, pRemoteThread, dwThreadSize, MEM_COMMIT);  
  454.     CloseHandle( hRemoteThread );  
  455.     CloseHandle( hTargetProcess );  
  456.     return ;  
  457. }  
  458.   
  459.   
  460.   
  461.   
  462.   
  463.   
  464.   
  465.   
  466.   
  467. void CTestDlg::OnBnClickedButton1()  
  468. {  
  469.     // TODO: 在此添加控件通知处理程序代码  
  470.     CDlgProcess dlg;  
  471.     dlg.DoModal();  
  472.   
  473.     //显示获取到的进程信息  
  474.     CString s,tmp;  
  475.     s=_T("        Hook进程:");  
  476.     s.Append(m_ProcessInfo.strProcessName);  
  477.     s.Append(_T("  PID="));  
  478.     tmp.Format(_T("%d"),m_ProcessInfo.dwPid);  
  479.     s.Append(tmp);  
  480.     SetWindowText(m_wndTitle+s);  
  481.   
  482.     if (m_ProcessInfo.dwPid<0||m_ProcessInfo.strProcessName.Find(_T(".exe"))<0)  
  483.     {  
  484.         return;  
  485.     }  
  486.     GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);  
  487. }  
  488.   
  489.   
  490. void CTestDlg::OnBnClickedButton3()  
  491. {  
  492.     // TODO: 在此添加控件通知处理程序代码  
  493.   
  494.     if (g_hInstDll==NULL)  
  495.     {  
  496.         return;  
  497.     }  
  498.   
  499.   
  500.     typedef VOID (WINAPI *StopHook)();  
  501.     StopHook Hook=NULL;  
  502.     Hook=(StopHook)::GetProcAddress(g_hInstDll,"StopHook");  
  503.     if (Hook==NULL)  
  504.     {  
  505.         AfxMessageBox(_T("获取dll函数失败"));  
  506.         FreeLibrary(g_hInstDll);  
  507.         g_hInstDll=NULL;  
  508.         return;  
  509.     }  
  510.     Hook();//Stop Hook  
  511.     FreeLibrary(g_hInstDll);  
  512.     g_hInstDll=NULL;  
  513.     AfxMessageBox(_T("Stop Hook Ok"));  
  514.   
  515.     GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);  
  516.     GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);  
  517.     GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);  
  518.   
  519.   
  520. }  
  521.   
  522.   
  523. void CTestDlg::EnableDebugPriv(void)  
  524. {  
  525.     HANDLE hToken;    
  526.     LUID sedebugnameValue;    
  527.     TOKEN_PRIVILEGES tkp;    
  528.   
  529.     if (!OpenProcessToken(GetCurrentProcess(),    
  530.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {    
  531.             return;    
  532.     }    
  533.     if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {    
  534.         CloseHandle(hToken);    
  535.         return;    
  536.     }    
  537.     tkp.PrivilegeCount = 1;    
  538.     tkp.Privileges[0].Luid = sedebugnameValue;    
  539.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;    
  540.     if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {    
  541.         CloseHandle(hToken);    
  542.         return;    
  543.     }     
  544. }  
  545. LRESULT CTestDlg::OnHookDll(WPARAM wParam, LPARAM lParam)  
  546. {  
  547.     CString str;  
  548.     str.Format(L"结果是%d",(int)wParam);  
  549.     AfxMessageBox(str);  
  550.     return 1;  
  551. }  
  552.   
  553. void CTestDlg::OnClose()  
  554. {  
  555.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  556.     OnBnClickedButton3();  
  557.     CDialogEx::OnClose();  
  558. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值