利用veh完成内存补丁功能,以躲避运行时内存检测
这事缘起于dota,前几天和同学在某vx平台dota,被一开挂黑店虐得不行。一气之下也找来个war3的挂,想报仇雪恨。结果游戏刚启动就被平台踢出来了,看来偷懒是不行的了,网上google了一番,该平台的反外挂主要基于黑名单和运行时内存检测。
黑名单就不说了,运行时内存检测是比较致命的,因为开图必然要改程序流程,改流程免不了要打内存补丁,打了补丁又不想被发现也是有办法的,比如shadowwalk,这是刚学到的新名词,详见http://bbs.pediy.com/showthread.php?t=58896
该方法简述就是模块重载,让读取和执行分离开来,不过要做的工作实在太多,而且不稳定,总之我真心认为硬碰硬不是好办法,也不是长久之计。其实简单的改改流程不被发现可以用异常处理来做,很安全稳定。
先复习一下异常处理流程,在没有调试器的情况下,用户层异常的分发由KiUserExceptionDispatcher完成,其中再调用RtlDispatchException分发异常,RtlDispatchException中首先RtlCallVectoredExceptionHandlers执行veh,如果此异常被处理则不再继续分发,未处理则展开seh链依次RtlExecuteHandlerForException执行seh,同样的,如果被处理则不再分发,否则继续,如果都没有处理则进程崩溃。这么看来只要抢在游戏本身seh之前捕获并处理异常游戏肯定是不会发现的。
简单说下怎么做,AddVectoredExceptionHandler给进程装上一个向量异常处理handler,然后在将drx寄存器设置为要打补丁的位置,也就是在补丁位置下一个硬件执行断点,执行到此处时抛出单步异常,异常处理捕获异常,在handler里模拟补丁功能。异常处理函数被调用时会传进来线程context指针,所以可以干的事情很多很多,这里可以发挥一下想象力。
就拿war3来举例吧,游戏就不用调了,网上找个开图工具,开图进游戏,扫扫进程钩子可以发现游戏被patch了两个地方
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
