首页
社区
课程
招聘
[原创]ring3反作弊篇——基于EBP遍历调用栈及模块名
发表于: 2015-7-27 11:54 21055

[原创]ring3反作弊篇——基于EBP遍历调用栈及模块名

2015-7-27 11:54
21055
收藏
免费 3
支持
分享
最新回复 (41)
雪    币: 428
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
17楼已补下载地址
http://bbs.pediy.com/showpost.php?p=1385434&postcount=17
上传的附件:
2015-8-13 15:20
0
雪    币: 44
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
27
koma 你来了。。
2015-8-13 18:46
0
雪    币: 8
活跃值: (33)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
28
保存一下思路
2015-9-13 23:07
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
谢谢,终于下载了
2015-12-16 14:04
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
楼主的CSDN里面好多情感类文章,不错,我也一直想写,但是……懒。。。
2015-12-16 14:28
0
雪    币: 112
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
个人喜欢在代码段尾部写跳板
2015-12-17 09:31
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
32
膜拜!!
2015-12-29 20:22
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
33
要破坏你的检查,其实很简单的啊!使用调试寄存器,将需要HOOK的代码处设置硬件断点,然后自己截获硬件断点的事件,在那个事件中,我们在事件中会收到对应的寄存器值,通过这些值,我们自己构造参数,然后访问HOOK的过滤函数,等过滤完成,我们就修改事件返回时的寄存器,把它改回原来的值!我们模拟执行被HOOK的指令之后,将EIP指向下一个指令,然后返回事件,这样的话,系统就会在我们HOOK完成之后,自动恢复所有寄存器,然后执行被HOOK指令之后(实际上是我们在处理断点事件时模拟执行的)返回你的函数,这样的话,你调用栈来检测是否有HOOK的话,你就什么也检测不到,哈哈!因为,我的HOOK过滤函数返回时,已经修正了esp寄存器,也就是调用栈,哈哈!慢慢检测吧!调用栈已经修正,就算你把内存翻个遍,也不知道已经被HOOK!
2016-1-2 00:07
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
34
通过修改进程的PEB结构中的Ldr链表,我同样可以骗过你的程序,思路是这样的,你的程序是通过GetModuleFileNameExA来用HANDLE获取对应的文件名的吧!这就好办了!GetModuleFileNameExA函数是通过PEB结构的Ldr域位置的链表来取得模块文件名的,那我就这样,我通过NtQueryInformationProcess(函数在MSDN里面公开了的,请上MDSN取得函数原型,下载WDK取得函数的调用库)函数的ProcessBasicInformation命令,获取PEB结构(PEB结构部分公开,其在#include <Winternl.h>文件中已经声明了),然后通过PEB结构的Ldr域,取得我们自己模块的文件名的储存地址,哈哈,这回好戏开始了,我将我的模块的文件地址给改成系统的kernel32.dll的文件地址,嘿嘿!你通过调用栈来检测是不是合法调用的话,没错,你看到的是非法调用,可是,你获取非法调用的文件名时,返回的是系统的kernel32.dll的文件名,哈哈!这样非法调用的文件地址,就会被指向了kernel32.dll,嘿嘿!你的程序慢慢纠结到底是谁才是真正的非法调用吧!
2016-1-2 00:38
0
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
35
哪里用这样啊!设置一下调试寄存器,然后在调试事件中,我们自己构造参数调用对应的HOOK过滤函数,既然参数是我们在调试事件中构造的,我们就有机会保存堆栈指针,和各类寄存器,嘿嘿,然后我们自己构造堆栈,然后嘛,将返回地址指向正常模块中一个缝隙,在这个缝隙处同样加入一个硬件断点,在处理这个缝隙的断点事件时,修正EIP,将需要返回的地址放入这个EIP中,然后结束处理这个缝隙的硬件断点事件,这是,HOOK函数就会通过EIP返回到真正的需要返回的函数中去!待过滤函数调用完成以后,就会回到HOOK函数的调试事件中,然后我们就结合返回值以及保存好的堆栈,决定是否要继续调用原来的函数,要是,决定不调用了,那么,我们就取得HOOK函数的返回地址,修正堆栈和EIP寄存器后,我们就直接返回就行,系统会帮助我们返回到调用者那里去的,要是我们决定调用原函数,我们就需要模拟执行被HOOK的指令,然后将EIP修改为,EIP当前值加上HOOK的指令长度,把堆栈指针恢复,然后返回事件,这样,系统就会帮助我们条到被HOOK的下一条指令上,然后继续执行,由于堆栈的指针在过滤函数执行之后被恢复了,所以,被调用者根本就不知道已经被HOOK了
2016-1-2 01:02
0
雪    币: 1821
活跃值: (4035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
用Drx复杂了,随便构造下调用堆栈,就能伪造任意多的调用地址,只要返回地址是被hook进程code段的地址就行
2016-1-2 11:09
0
雪    币: 45
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
学习学习大神
2016-4-6 10:52
0
雪    币: 11
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
38
马克一下
2016-5-6 13:10
0
雪    币: 9
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
大神你还要不要人了  跟你混去啊
2017-7-31 14:27
0
雪    币: 9034
活跃值: (6255)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
40
在攻防的对弈中没有对错,只是看双方知识面而已。所以楼主不必在意上面的回复说怎么OOXX的,因为他知道你检测的方法说以能OOXX很正常。
2017-7-31 16:41
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
游戏攻防是一个长期的过程,不可能用固定的几种方法解决所有的问题,偶尔换一下方法就能坑死一大片人,所以方法的好坏还是其次,主要是要效率,尽量减少对游戏体验的影响才是好的方法,更好的方法是让进游戏的人都能开开心心的花钱才是游戏真正应该关心的,开发游戏不就是为了赚钱吗?赚谁的钱不是赚。。。
2017-8-2 12:31
0
雪    币: 870
活跃值: (2264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
学习一下~
2018-9-23 23:23
0
游客
登录 | 注册 方可回帖
返回
//