吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 54279|回复: 110
收起左侧

[游戏安全] 关于某P对硬件断点做出的保护分析及对抗办法

    [复制链接]
Poner 发表于 2017-1-12 03:38
本帖最后由 Poner 于 2017-9-8 13:51 编辑

实验环境
操作系统:Windows 7 旗舰版 Sp1工具:OllyDbg、CheatEngine 6.5
前言: 对于某P,我已经研究了将近4年时间,但一直没有把自己所知贡献过一丁点给大家,在这里我表示非常抱歉!

正文:
           废话我就不多说了 直接进入正题,这次给大家贡献关于某P对硬件断点的保护是如何进行并且如何绕过的。
           首先,过掉驱动层保护,开Ollydbg附加好某P保护的游戏,这里我就拿XF来做个演示

           既然是硬件断点,那少不了跟异常打交道,附加好XF后直接跳到KiUserExceptionDispatcher(异常分发函数),发现如下图:
1.png
          为什么他会在这里下一个HOOK? 因为异常发生后 会先经过驱动层 然后驱动层无法处理这个异常直接往下面抛 到了应用层后会直接走KiUserExceptionDispatcher(异常分发函数),所以某P在这里下HOOK是为了接管应用层所有异常
          然后我们继续,先看下他自己给自己占的坑,如下图:
          2.png

           如图我们看到DR0、1、2、3全部都被下了断点,DR7=553(XP下面看到是455)
          他既然占了坑 那肯定要产生异常 不然的话 做这个硬件断点占坑根本没必要!
          所以我们跟进他在异常分发的HOOK:
         
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
101F8260    FC              CLD[/align]101F8261    51              PUSH ECX
101F8262    8B0C24          MOV ECX,DWORD PTR SS:[ESP]
101F8265    51              PUSH ECX
101F8266    8B0C24          MOV ECX,DWORD PTR SS:[ESP]
101F8269    898C24 04000000 MOV DWORD PTR SS:[ESP+4],ECX
101F8270    8B8C24 0C000000 MOV ECX,DWORD PTR SS:[ESP+C]
101F8277    890C24          MOV DWORD PTR SS:[ESP],ECX
101F827A    8B0C24          MOV ECX,DWORD PTR SS:[ESP]
101F827D    898C24 04000000 MOV DWORD PTR SS:[ESP+4],ECX
101F8284    53              PUSH EBX
101F8285    8B9C24 04000000 MOV EBX,DWORD PTR SS:[ESP+4]
101F828C    53              PUSH EBX
101F828D    8B9C24 04000000 MOV EBX,DWORD PTR SS:[ESP+4]
101F8294    899C24 08000000 MOV DWORD PTR SS:[ESP+8],EBX
101F829B    8B8C24 10000000 MOV ECX,DWORD PTR SS:[ESP+10]
101F82A2    898C24 04000000 MOV DWORD PTR SS:[ESP+4],ECX
101F82A9    E9 F8440C00     JMP crossf_1.102BC7A6

       因为这里是乱序(某P大多数代码都是乱序 基本上没有VM 所以很好分析),所以继续往下跟:
      
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
102C48F2    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
102C48F5    899C24 04000000 MOV DWORD PTR SS:[ESP+4],EBX
102C48FC    8B9C24 04000000 MOV EBX,DWORD PTR SS:[ESP+4]
102C4903    891C24          MOV DWORD PTR SS:[ESP],EBX
102C4906    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
102C4909    899C24 0C000000 MOV DWORD PTR SS:[ESP+C],EBX
102C4910    8B9C24 04000000 MOV EBX,DWORD PTR SS:[ESP+4]
102C4917    891C24          MOV DWORD PTR SS:[ESP],EBX
102C491A    8F0424          POP DWORD PTR SS:[ESP]
102C491D    5B              POP EBX
102C491E    9D              POPFD
102C491F    E8 3F0FF7FF     CALL crossf_1.10235863                  ; 某P的异常处理函数,我们可以称之他为RtlDispatchException
102C4924    50              PUSH EAX
102C4925    8B0424          MOV EAX,DWORD PTR SS:[ESP]
102C4928    50              PUSH EAX
102C4929    8B0424          MOV EAX,DWORD PTR SS:[ESP]
102C492C    898424 04000000 MOV DWORD PTR SS:[ESP+4],EAX
102C4933    8B8424 04000000 MOV EAX,DWORD PTR SS:[ESP+4]
102C493A    51              PUSH ECX

   跟进这个CALL 我们继续:
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
101EF52D    58              POP EAX
101EF52E    58              POP EAX
101EF52F    9C              PUSHFD
101EF530    50              PUSH EAX
101EF531    8B0424          MOV EAX,DWORD PTR SS:[ESP]
101EF534    310424          XOR DWORD PTR SS:[ESP],EAX
101EF537    8B8424 0C000000 MOV EAX,DWORD PTR SS:[ESP+C]
101EF53E    010424          ADD DWORD PTR SS:[ESP],EAX
101EF541    58              POP EAX
101EF542    9D              POPFD
101EF543    50              PUSH EAX
101EF544    9C              PUSHFD
101EF545    33C0            XOR EAX,EAX
101EF547    038424 04000000 ADD EAX,DWORD PTR SS:[ESP+4]
101EF54E    9D              POPFD
101EF54F    8138 04000080   CMP DWORD PTR DS:[EAX],80000004         ; 判断异常是否为0x80000004(硬件断点异常)
101EF555    8B8424 04000000 MOV EAX,DWORD PTR SS:[ESP+4]
101EF55C    890424          MOV DWORD PTR SS:[ESP],EAX
101EF55F    8F0424          POP DWORD PTR SS:[ESP]
101EF562    E8 526D0000     CALL crossf_1.101F62B9

为什么要判断? 因为他自己占的坑需要处理,不然的话直接崩溃!
我们继续跟看他是如何处理这个异常的
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
101EB857    C78424 04000000>MOV DWORD PTR SS:[ESP+4],crossf_1.0F0DA392            ; 上面那个异常地址判断我直接跑飞了 到了这里 这句代码的意思是修改当前EIP为0F0DA392
101EB862    57              PUSH EDI
101EB863    8BBC24 04000000 MOV EDI,DWORD PTR SS:[ESP+4]
101EB86A    57              PUSH EDI
101EB86B    8BBC24 04000000 MOV EDI,DWORD PTR SS:[ESP+4]
101EB872    89BC24 08000000 MOV DWORD PTR SS:[ESP+8],EDI
101EB879    8B9424 0C000000 MOV EDX,DWORD PTR SS:[ESP+C]
101EB880    899424 04000000 MOV DWORD PTR SS:[ESP+4],EDX
101EB887    8B9424 04000000 MOV EDX,DWORD PTR SS:[ESP+4]
101EB88E    52              PUSH EDX
101EB88F    8B1424          MOV EDX,DWORD PTR SS:[ESP]
101EB892    899424 08000000 MOV DWORD PTR SS:[ESP+8],EDX
101EB899    8BBC24 0C000000 MOV EDI,DWORD PTR SS:[ESP+C]
101EB8A0    893C24          MOV DWORD PTR SS:[ESP],EDI
101EB8A3    8B3C24          MOV EDI,DWORD PTR SS:[ESP]
101EB8A6    89BC24 10000000 MOV DWORD PTR SS:[ESP+10],EDI
101EB8AD    8BBC24 08000000 MOV EDI,DWORD PTR SS:[ESP+8]
101EB8B4    50              PUSH EAX
101EB8B5    E8 01000000     CALL crossf_1.101EB8BB

[Asm] 纯文本查看 复制代码
1
2
3
4
5
1021FEF9    04 24           ADD AL,24
1021FEFB    59              POP ECX
1021FEFC    9D              POPFD
1021FEFD    FF15 1CF72C0F   CALL DWORD PTR DS:[F2CF71C]                           ; 然后直接调用ZwContinue 这个异常就处理完毕了
1021FF03    E9 E10B0100     JMP crossf_1.10230AE9

最近我看到很多人在问 为什么自己HOOK了异常分发函数 接管了所有异常 并且处理了ZwGetContextThread还是被检测到
这里我给你们一个答案:
1、替换了某P占的坑 从而某P自己下的断点没有触发 原来的代码直接往下执行 并没有实现某P自己用硬件断点做的JMP 所以会被检测。(继续往下执行的代码可能是直接往服务器发送数据请求封号 这里我没有往下分析)
解决方案:在某P下的4个断点位置自己直接写JMP 跳转到他异常分发处理后的EIP地址(如果怕CRC,可以直接修改游戏英文名称+base.dll这个文件 据我所知目前这个文件没有文件校验 修改了物理文件 CRC就不会报异常 因为他是直接根据文件内容来比对的)
2、有些线程某P是没有下断点的 但大部分都下了断点,如果是这样 那么在ZwGetContextThread这个函数处理的同时需要注意:清空某P的断点之前 记录好他在哪些线程下了断点 那些线程没下断点 ,他自己在Get的同时恢复之前的DR数据即可,还有就是需要在这里判断一下eax 有时候
      没有Get成功的话 不要返回数据 不然一样被检测!
3、RtlDispatchException这里return的时候需要注意Context里面的DR寄存器也要还原成原来线程的DR 不然一样被检测!
按照上面处理方式来直接处理 某P对硬件断点的保护基本上就废了


本篇文章就到这里 希望大家可以对某P实现保护的方式建立起新的认识。
本文仅供技术研究,请勿用于商业用途!
                                                                                                                                  如需转载 请注明原文出处:Poner Blog
                                                                                                                                                  原创:Poner

免费评分

参与人数 45吾爱币 +50 热心值 +44 收起 理由
四夕人云 + 1 + 1 谢谢@Thanks!
XiaoBao20 + 1 用心讨论,共获提升!
Lokavid + 1 我很赞同!
heimu360 + 1 我很赞同!
浅时光倾城丶 + 1 + 1 我很赞同!
迷茫小白 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lapop + 1 + 1 热心回复!
yuxing818 + 1 热心回复!
aipanpann + 1 + 1 热心回复!
18611429192 + 1 + 1 谢谢@Thanks!
2864095098 + 1 热心回复!
wkcjll + 1 + 1 用心讨论,共获提升!
Cyrus_xxx + 1 + 1 谢谢@Thanks!
zl6511130 + 1 + 1 热心回复!
seoke + 1 + 1 谢谢@Thanks!
luozheng97 + 1 + 1 我很赞同!
qwe1035135872 + 1 + 1 谢谢@Thanks!
yunzl + 1 + 1 已答复!
yo4yo + 1 + 1 谢谢@Thanks!
a5112075 + 1 + 1 谢谢@Thanks!
zzzmxrxl + 1 + 1 我很赞同!
soyiC + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
EVGA + 1 + 1 用心讨论,共获提升!
笑江湖 + 1 + 1 我很赞同!
q74330 + 1 + 1 我很赞同!
黑龍 + 3 + 1 用心讨论,共获提升!
gxhayxj + 1 + 1 用心讨论,共获提升!
37566454 + 1 + 1 说明了大概 部分没有详细说明
KaQqi + 3 + 1 我很赞同!
siuhoapdou + 1 + 1 谢谢@Thanks!
精华帖 + 1 + 1 谢谢@Thanks!
xyuetao + 1 + 1 我很赞同!
zouxm2008 + 1 + 1 热心回复!
wcj1997 + 1 + 1 已答复!
珍惜幸福涙 + 1 + 1 厉害,学习了!期待下一篇!
海底总动员 + 1 + 1 我很赞同!
DnewvoillC + 1 + 1 热心回复!
回归自然 + 1 + 1 热心回复!
NULL + 1 + 1 我很赞同!
wnagzihxain + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gogogo2000 + 1 + 1 用心讨论,共获提升!
墨血 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Jr丶新一 + 3 + 1 非常厉害
王小雨 + 1 + 1 不错,前排兜售瓜子、可乐~~~~
610100 + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

win_cheating 发表于 2018-6-3 13:36
大神您好,现在某P的一些软件好像都取消这个在KiUserExceptionDispatcher HOOK的方法,使用VEH的办法,我在内核层分析了他的步骤。
第一步:使用ZwSetContextThread把DR0-DR3寄存器设置4个不同的值
第二步:触发DR0硬件异常(这个硬件异常地址就是DR0-DR3的值)
第三步:使用ZwGetContextThread读取DR0-DR3寄存器(我估计是触发异常后效验值)
-----
-----
之后返回第一步继续循环(但异常地址是从DR0-DR3轮流切换的)
而且每次使用ZwSetContextThread设置DR0-DR3的值都是一样的

用OD附加过了几秒以后就崩溃了,还没下断呢,在内核层还触发了一个0x80000001(还是0x80000002,不记得了)异常

大神能否提示一下怎么破解,因为其他的一些游戏也有这东西。

点评

1、OD附加会清空DR0-DR3 而清空后原本游戏DR0-DR3的硬件断点地址位置执行会向下执行 不会触发异常 所以崩溃是正常的 2、还有一种可能是你strongOD没有正常加载驱动,被游戏检测  详情 回复 发表于 2018-6-4 07:19
win_cheating 发表于 2018-6-4 12:26
Poner 发表于 2018-6-4 07:19
1、OD附加会清空DR0-DR3   而清空后原本游戏DR0-DR3的硬件断点地址位置执行会向下执行 不会触发异常  所 ...

伟大的版主

可以怎么说吧

第一:就算OD清空了也没什么事吧,因为他触发之前,使用ZwSetContextThread把DR0-DR3寄存器设置4个不同的值,之后才触发的
第二:不需要strongOD,调试器是我自己写的,除了TP其他都能过,就是这个VEH触发硬断异常没有过。

点评

清空了他的DR 原本TP自己用硬件断点实现的JMP等同于失效了 那么代码继续向下执行会怎么样? 另外我记得他的VEH里面好像也有检测 其他现在都2018年了具体又新增了什么我就不知道了  详情 回复 发表于 2018-6-4 13:56
一生挚爱 发表于 2017-1-12 08:57
wanwanwanwan 发表于 2017-1-12 09:09
好像很厉害的样子
cwz 发表于 2017-1-12 10:56
很厉害,佩服。
交王飞也不行 发表于 2017-1-12 11:16 来自手机
大神厉害
交王飞也不行 发表于 2017-1-12 11:16 来自手机
感谢大佬的分享
three 发表于 2017-1-12 11:24
*讯的TenP*么?
好厉害的样子。
墨血 发表于 2017-1-12 11:24
虽然不懂,但看起来好厉害啊!!
释然 发表于 2017-1-12 13:51
哈哈,分析的不错
gogogo2000 发表于 2017-1-12 13:51
分析的非常棒
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-19 03:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表