首页
论坛
专栏
课程

[原创]利用VEH之给游戏添加检测(二)

AperOdry 2018-1-1 18:28 3920

一 . 简介

这款游戏就不介绍了,早被玩坏了,放一张检测的效果图:



这是一张调用种物CALL结果检测到堆栈错误的信息。

二 .设计思路及原理分析

  • 初认堆栈检测 (CallStack 检测)
众所周知,通常在进入一个CALL (函数) 时候会把下一条指令的地址压入 esp 寄存器中,后面随着各种指令的执行 esp 也会发生变化,例如(pushad,popad,push,pop )等指令堆栈都会发生改变,而 esp 中存放着栈顶的的地址当然也会跟着变化,知道遇到 retn 指令时候 [esp] 
的值为返回地址,这就是我们常说的堆栈平衡。  (以上内容纯属个人理解,如有错误还请多多指正。)

可以看到上图 [esp+0x24] 为第一层返回地址 [esp+0x48] 为第二层返回地址,当我们调用功能 CALL 的时候,这些返回地址肯定会发生变化。

  • VEH实现简单的HOOK

https://bbs.pediy.com/thread-190668.htm

这里有资料   @ 机械瞑衍 牛讲的很清晰.透彻.

  • 判断是否非法调用
这个很简单,无非就是拿现在的返回地址跟原始的返回地址做比较就好。

三 .收集数据和实现

  1. 寻找合适的HOOK位置

  1. 实现VEH HOOK

  1. 对比原返回地址

  1. 重新挂上INT3还原HOOK



这里给小白科普一下,大牛请无视:





TF(bit 8) [Trap flag]   将该位设置为1以允许单步调试模式,清零则禁用该模式。



TF位为单步调试,可用于简单的反调试及实现我们的重新挂钩上INT3,单步调试指令执行后TF位自动置0. 无需恢复

四 .小结及帮助


感觉这段时间对VEH的学习让我对调试体系有了一些基础的认识,另外也可以使用硬件断点来检测CALL调用是否合法,原理也一样的,还可以不用恢复INT3模拟被HOOK了的指令 "esp - =4;[esp]=edi"可以模拟 push edi 


另外小菜我想实现对阳光值写入的监控 判断写入的地址是否和合法地址时候遇到梗了,VirtualProtect()函数的第二个参数Size无论如何设置它改变的都是一个页的属性 我设置一个定时器循环写入不可写属性然后异常接管里面判断异常发生的地址,但无论如何我自己都不会判断它写入异常的地址是否为阳光地址   只有解析IA-32指令这种方法吗?小菜我只想的出来这种方法但无论如何功力都差了写火候。求各位赐教!


                                                                       各位元旦快乐!



                                                                                                                                                                                                          2018.1.1 
                                                                                                                                                                                                                            Aperodry




[推荐]看雪企服平台,提供APP等级保护加固等安全服务!

最后于 2019-1-11 19:07 被kanxue编辑 ,原因:
上传的附件:
最新回复 (13)
hzqst 2 2018-1-1 22:11
2

0

检测调用是否合法直接用RtlWalkfFrameChain就行了
柒雪天尚 2018-1-2 10:18
3

0

检测调用是否合法直接用RtlGetCallersAddress就行了 
AperOdry 2018-1-2 17:27
4

0

感谢各位分享,学到老活到老。
机械瞑衍 2018-1-3 18:15
5

0

竟然提到了我  混个脸熟吧    哈哈~
yber 2018-1-4 12:44
6

0

学习了
zylyy 2018-1-4 19:04
7

0

AperOdry 2018-1-6 19:24
8

0

机械瞑衍 竟然提到了我 混个脸熟吧 哈哈~
还请多多捧场,有空多多指教
聖blue 2018-1-6 21:49
9

0

不错!!
10

0

楼主用的什么工具和语言  大家介绍下  科普下小白一个
chow 2018-1-12 18:26
11

0

很多游戏都有CALL调用检测,  一般都是自己构造返回地址  自己的函数      PUSH  他自己的代码段的合法POP  RET这些地址  然后JMP  到CALL  函数头  堆栈平衡下
这样绕过检测
三十二变 2 2018-2-24 16:58
12

0

异常数据结构里面有个dword数组。里面前2个元素一个指示是读取异常还是写入异常,一个指示异常地址(在401000向22000写入异常,则该元素为后者)
修改一个页的属性,需要做边界检查,也就是常说的内存断点长度问题。故实际上内存断点效率非常之低下。
武装的蔷薇 2018-8-5 12:12
13

0

我想知道你下CC异常VEH接管之后修复CC然后EIP不需要-1重新执行正常指令吗
junkboy 2019-1-11 20:16
14

0

#寻宝大战#祝看雪19岁快乐!
返回