石器sa_8001.exe的HOOK技术

  在很多反汇编里都会用到HOOK技术,在石器时代里,早期没有源码的情况下,大神们便利用HOOK技术对石器的登陆器sa_8001.exe进行HOOK来达到增加新功能和新外观,最具有代表性的就是32色下运行和分离补丁。对于石器的HOOK,通常是在sa_8001.exe加载一个DLL文件,这个DLL文件就是HOOK这个sa_8001.exe里的函数所用到的文件。

  下面大致说下,其实百度也能百度的到HOOK技术,更多的相关知识请百度。

  Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
  要实现钩子函数,有两个步骤:
    1. 利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)

    2.动态代理(使用所有场景)

  通过编译器VS(Microsoft Visual Studio)创建一个DLL或用大神写好的自动生成HOOK的DLL工具来创建,把自己的功能代码写入后,并通过找到相关函数的关键CALL来实现自己想要的功能。

下面举个非常简单的例子:

void INIT_GAMESPEED(int speed)
{
    if (speed >= 15) speed = 14;
    speed = 15 - speed;
    *(int *)0x004AB7CC = (int)(char *)speed;
}

  这个是我们自定义的一个石器游戏加速的函数,speed为速度值,很多人不太清楚0x004AB7CC是什么,这个是内存地址,有时候我们可以看到一些外挂教程里提到基址,有分不清地址和基址的区别。简单点就是地址=基址x16+偏移地址,我们可以不用详细的知道,只知道这个地址是存放加速值的地方即可。


  这个地址是怎么得到的?我们打开OD(Ollydbg一个反汇编工具)载入sa_8001.exe就可以看到地址一栏有很多,我们定位到4AB7CC处看看是什么

1.png
  0E就是速度值,在16进制里0E就是十进制里的14,这里的加速就是14.当我们利用上面的函数并通过sa_8001.exe加载DLL的时候加速则会变成14了。这通俗易懂的解说应该能看懂吧?往后会讲解更多的石器相关的HOOK知识。

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。