【零基础破解辅助第一课】Lua脚本hook基础之浅述函数拦截机制
在教程开始之前,先简单介绍一下Lua语言的运行机制,以便于更为方便解释接下来的
Hook
操作
(一)介绍
Lua是一种解释型语言,代码在运行时才被解释器一行行动态翻译和执行。Lua的运行机制可以分为以下几个步骤:
(前言)Lua的运行机制
- 编译:Lua运行代码时,Lua脚本可以直接被Lua解释器解释执行,也可以先由Lua编译器编译为字节码,然后再交给Lua虚拟机执行
- 连接:Lua的编译阶段之后仅仅需要一个“打包”,真正的连接过程都是在运行之前才根据符号(如类名、模块名等等)被完成的
- 执行:Lua脚本跑在Lua虚拟机中,将Lua虚拟机源代码整合到某些开发环境,然后在其中启动虚拟机跑Lua代码
- 此外,Lua还运行了一个垃圾收集器来收集所有死对象(即在Lua中不可能再访问到的对象)来完成自动内存管理的工作
总的来说,Lua也需要编译和连接。编译可以单独完成,也可以在载入源代码的时候才完成。连接通常在运行期(调用之前 或者模块加载的时候)
希望如果对您有帮助请多多点赞关注支持一下,你的支持是我产出优质教程的动力!!
(二)开始教程
根据上面的介绍,我们已经初步了解到了Lua代码的运行机制,那么根据这个机制,我们知道了,Lua虚拟机是从上往下一行一行进行解释然后执行的.
根据这个机制,我们是不是可以把原有的函数重载,这样不就可以改变函数原意了么?
Hook概念举例
先给出一段示例代码,然后我们针对源代码进行分析
--lua代码
--当前时间20:09
print(os.data("%H:%M"));
输出
>>20:09
可以看到,这个方法把当前的时间获取,并且被print打印出来
那么,我们有没有一种办法可以修改打印的时间为自定义呢?
当然是有的
- Hook
os.data
方法 - Hook
print
方法
针对第一种 Hookos.data
方法
function os.data(...)
return "88:88";
end
print(os.data("%H:%M"));
>>88:88
可以看到,我们的值虽然被修改了,但是貌似函数的功能也彻底失效了
那要怎么办呢?我不想让原函数失效,但是又想让它在特定的时间内自动激活Hook机制?
这篇只是基础教程,我会制定一套体系系统化进行教学,请大家多多点赞关注,支持一下!
简单概述就是调用
请大家期待一下第二章
,后续会出实战hook破解Lua辅助教程!!!!
拦截exit函数
通过上面我们了解到,通过重写同名方法可以达到Hook的效果,那么我们直接照葫画瓢
function os.exit()
print("拦截退出!");
return;
end
好的,本期基础:浅述函数拦截机制 完成,后期将会逐步提升难度,希望我们共通加油!!!感谢您的耐心观看!!