您的位置:首页 > 编程语言

20171005WindowsPrj08_02Hook是什么

2017-10-05 08:19 211 查看

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头相关信息。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息