你必须知道到的Hook!

Hook是什么?

 

   
好!说了这几个,大家想想借使你写了一个hook,在别人的总结机上阻挠了这一个音讯,操作系统就不亮堂那几个信息,你能够把那些音讯通过网络发到你的计算机,那一个那台微型总计机的举止你都清楚….(当然作者教大家那些不是愿意您们做坏事,而是同过hook更加深切学习总结    机    和保卫安全本身电脑),上面我来同过1个简练的先后来让我们明白hook。

 

图片 1

                 
最终,操作系统会把那么些事件传给相应的程序,那么,你就足以看到你操作游戏的规范了。

 1 int WINAPI myMSG( HWND hWnd,
 2                   LPCTSTR IpText, 
 3                   LPCTSTR IpCaption,
 4                   UINT uType)
 5 {
 6 
 7     printf("哈哈你的消息被我截断了"); 
 9     return 1;
10 }

图片 2

   
举个例证:若是你是一名玩耍热衷者,在玩游戏时,你要释放技能那么您就会对键盘鼠标实行操作,表面上您是平昔操作游戏,其实个中经过了多少个环节。

 1  #include <stdio.h>
 2  #include <Windows.h>
 3  
 4  int WINAPI myMSG( HWND hWnd,
 5                     LPCTSTR IpText, 
 6                    LPCTSTR IpCaption,
 7                     UINT uType)
 8   {
 9       printf("哈哈你的消息被我截断了");
10      return 1;
11  }
12  
13  bool Hook()
14  {
15       //获取调用代码的首地址
16       PROC p = GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxW");
17       if (!p) return 0;
18   
19              BYTE b[5] = { 0 };
20       //0xE9无条件跳转(学过汇编的同学应该知道)
21       b[0] = 0xE9;
22         //计算偏移地址。 偏移地址 = 跳转地址-MessageBox的地址 
23      *(DWORD*)(b + 1) = (DWORD)myMSG - (DWORD)p - 5;
24         /*通过上面三行代码,这个数组储存的代码意思是(无条件跳转到我的函数地址位置)*/
25  
26          //在计算位置的内存中写入数据
27      WriteProcessMemory(GetCurrentProcess(), p, b, 5, NULL);
28      return 1;
29  }
30  int main() 
31 { 
32      Hook(); 
33      MessageBox(NULL, L"Hello world", L"this",MB_OK);         system("pause");
34      return 0; 
35     }

                  然后,那些驱动会把音信传个操作系统。

   
 那是自家写的八个函数(注意:函数再次回到值和参数一定要和MessageBox1样,那样接口才能对上,不然会报错),大家要让程序执行大家的函数,那么大家将要写三个钩子。

 

 
那是壹段不难的程序,其效果是为着体现一个对话窗口。这几个对话窗口操作系统已经帮大家写好了,大家其实是在调用那段代码。好!大家想转手我们能或不能够在调用那一个函数在此之前截断那一个调用,让程序调用自个儿的函数。(想想做插件是还是不是这么些原理)答案是一定的,我们能够截断那一个信息并让他调用本人的函数。上边我们来代码达成一下。

做要好的Hook!

 1 bool Hook()
 2 {
 3     //获取调用代码的首地址
 4     PROC p = GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxW");
 5     if (!p) return 0;
 6 
 7            BYTE b[5] = { 0 };
 8     //0xE9无条件跳转(学过汇编的同学应该知道)
 9     b[0] = 0xE9;
10        //计算偏移地址。 偏移地址 = 跳转地址-MessageBox的地址 
11     *(DWORD*)(b + 1) = (DWORD)myMSG - (DWORD)p - 5;
12        /*通过上面三行代码,这个数组储存的代码意思是(无条件跳转到我的函数地址位置)*/
13 
14         //在计算位置的内存中写入数据
15     WriteProcessMemory(GetCurrentProcess(), p, b, 5, NULL);
16     return 1;
17 }

 
 通过这几个例子相信大家对hook有了1部分打听,今后大家肯能会有1个疑点,作者能跳转,能还是不能够回去吧,答案是能的。作者也给大家提供贰个点思路ReadProcessMemory()用这几个api来保存原来的段地址和内部存款和储蓄器中的代码,回去时在利用WriteProcessMemory()再跳转3遍,就足以会到原来调用的代码处了,这个是或不是很棒,我们能够回家自行试验,也能够巩固一下后天所学的学问。

 
 
 hook翻译之后是钩子的情趣,hook的用处主借使用来堵住新闻的,看到此间大家莫不会盲目,What is a
hook?所以那时候就只可以普及一下操作系统的原理。

     笔者1度写好了三个钩子,下边我放出完全程序的代码

                 
首先,你操作键盘鼠标,那么总结机底层键盘鼠标的驱动就会收下1个新闻。

                  其次,操作系统会判定这几个音信是职能在哪些程序上。

   
 怎么样加上hook,你会发觉一件令人高兴的工作,并不曾弹出对话框。运维结果如下

    首先大家把Hook注释掉运转。运营结果如下。

1 int main()
2 {
3     MessageBox(NULL, L"Hello world", L"this",MB_OK);
4     system("pause");
5     return 0;
6 }

相关文章