20171005WindowsPrj08_02Hook是什么
2017-10-05 08:19
260 查看
Windows Hook:
Hook是什么:
1:Hook可以改变软件的执行流程,是对于计算机编程当中的编程技法的描述。2:Hook可以在不改变源代码的情况下给软件添加一些新的功能,能修改源程序执行流程。
3:能够达到上面功能的都可以称为Hook。它类似于回调函数,但又与之不同。
4:Hook可以实现改变未知源代码程序的执行流程,Hook能做的是来修改软件执行,前提是拿不到源代码的情况下,如果能拿到源代码,用Hook就没必要了。例如:Windows系统,我们没有源代码,但是很多安全软件可以改变程序的执行,起到保护系统的作用,很多都是通过Hook来实现的。
Hook是如何改变程序执行流程的:
1:程序块:在C#中,认为每个程序都是由不同模块构成,每个都称为程序块,程序块结构,但是我们说的程序块是一个业务逻辑。
对我们来说,每个函数块,流程块都称为一个程序块。
2:反汇编:
我们写的程序,可以在ollydbg工具下查看其汇编源码,例如:
#include <iostream> void Func() { printf("Func"); } void Funcpgy() { printf("蒲公英"); } int main() { Func(); getchar(); return 0; }
在ollydbg工具下,查看其汇编代码:
在程序的最前面部分,可以看到很多的jmp(E9),这个是个函数表,其中,我们写的两个函数在以下这个地方:
在程序执行的时候,会最开始执行013F127B > /E9 304C0000 jmp HookTest.mainCRTStartupBasechar,std::char_traits<char>,std::allocator>函数,然后执行main函数:013F12E4 /E9 A7400000 jmp HookTest.main:_Generic_error_category::message
deleting destructor'_G>。
小提示:ollydbg工具快捷键,F7:步入,F8:单步,F9:全速执行。
在main函数里面,代码如下:
013F5390 > 55 push ebp 013F5391 8BEC mov ebp,esp 013F5393 81EC C0000000 sub esp,0xC0 013F5399 53 push ebx 013F539A 56 push esi 013F539B 57 push edi 013F539C 8DBD 40FFFFFF lea edi,dword ptr ss:[ebp-0xC0] 013F53A2 B9 30000000 mov ecx,0x30 013F53A7 B8 CCCCCCCC mov eax,0xCCCCCCCC 013F53AC F3:AB rep stos dword ptr es:[edi] 013F53AE E8 5FBEFFFF call HookTest.013F1212 013F53B3 8BF4 mov esi,esp 013F53B5 FF15 80014001 call dword ptr ds:[<&MSVCR120D.getchar>] ; msvcr120.getchar 013F53BB 3BF4 cmp esi,esp 013F53BD E8 1DBFFFFF call HookTest.013F12DF 013F53C2 33C0 xor eax,eax 013F53C4 5F pop edi ; HookTest.013F5CC9 013F53C5 5E pop esi ; HookTest.013F5CC9 013F53C6 5B pop ebx ; HookTest.013F5CC9 013F53C7 81C4 C0000000 add esp,0xC0 013F53CD 3BEC cmp ebp,esp 013F53CF E8 0BBFFFFF call HookTest.013F12DF 013F53D4 8BE5 mov esp,ebp 013F53D6 5D pop ebp ; HookTest.013F5CC9 013F53D7 C3 retn
其中:内存地址为013F53AE的地方为调用Func函数的地方,我们可以直接双击,然后修改跳转的地址(0x013F53AE),修改为Funcpyg函数的地址(0x013F1055),然后将这个程序另存一份,在执行,即可改变程序的执行结果。
另存为方法:右键->复制到可执行文件->选择,然后在弹出窗口上:右键->保存文件,命名后保存,就是修改完成的文件了。
3:同理,我们也可以通过更改最前面的那张函数表,这样也可以更改函数的执行,IAT Hook就是通过更改函数表来实现改变函数流程的,可以自己写一个与原函数参数一模一样的函数,然后在这个函数里面做一些自己的事,然后在函数结束前调用原函数,正常返回,也是可以实现。但是前提是要将自己写的参数一样函数放在这个文件中。
4:同理,也可以通过更改被调用函数里面的代码实现Hook,但是,这样需要注意里面代码改变后函数调用的正常性。例如:将里面某个地方记录下来,并改为jmp XXX,然后在这里做自己的事,做完后还需要执行记录的那一行指令。由于是在函数内部修改,不建议使用call,这样又需要考虑参数传递了,使用jmp会好点。
IAT表:
1:上面所说的函数表,实际上就是IAT表,他在NT头里面,具体百度了解IAT表,查看NT头相关信息。以下为PE结构的DOS头和PE头相关信息。相关文章推荐
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 20171005WindowsPrj08_02Hook是什么
- 10-02-03 今天干什么了?
- 20171011WindowsPrj08_03IAT Hook
- [置顶] 【Hadoop--02】Hadoop HDFS是什么?
- 20171011WindowsPrj08_03IAT Hook
- 02 AE脚本开发使用什么编辑器
- JAVA设计模式是个什么玩意儿_02_抽象工厂模式
- 20171011WindowsPrj08_03IAT Hook
- 【02】什么是微信公众平台?
- 什么是火星坐标系(GCJ-02)
- 20171011WindowsPrj08_03IAT Hook
- 【虫师--系列02】在做性能测试之后需要知道些什么
- 编程中老有人问hook是什么