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就是通过更改函数表来实现改变函数流程的,可以自己写一个与原函数参数一模一样的函数,然后在这个函数里面做一些自己的事,然后在函数结束前调用原函数,正常返回,也是可以实现。但是前提是要将自己写的参数一样函数放在这个文件中。
3:同理, 我们也可以通过更改最前面的那张函数表,这样也可以更改函数的执行,IAT Hook就是通过更改函数表来实现改变函数流程的,可以自己写一个与原函数参数一模一样的函数,然后在这个函数里面做一些自己的事,然后在函数结束前调用原函数,正常返回,也是可以实现。但是前提是要将自己写的参数一样函数放在这个文件中。
4:同理,
也可以通过更改被调用函数里面的代码实现Hook,但是,这样需要注意里面代码改变后函数调用的正常性。例如:将里面某个地方记录下来,并改为jmp XXX,然后在这里做自己的事,做完后还需要执行记录的那一行指令。由于是在函数内部修改,不建议使用call,这样又需要考虑参数传递了,使用jmp会好点。