首页
论坛
课程
招聘
应用层反外挂技术实践
2013-6-26 13:56 37751

应用层反外挂技术实践

2013-6-26 13:56
37751
昨天看到了choday的帖子 应用层反外挂技术研究
里面解读了两个应用层反外挂技术
详细地址是 http://bbs.pediy.com/showthread.php?t=173897

“-------------------------
某日,突然想起应用层反外挂技术,自己不得其解,跑去问v校,
问:"应用层反外挂,有什么好点子没有,因为今天 x64大行其道 ,弄驱动,已不合时宜了?"
答:"Dllmain DLL_THREAD_ATTACH"
问:"怎么讲"
答:"阻止远程线程,不开线程,他能干什么?"
问:"如果是SetWIndowsHooks呢"
答:"WH_DEBUG"
问:"怎么讲"
答:"干掉其它进程来的HOOK"
...
-------------------------”

这样简短的对话,choday兄理解得十分详实,在他的讲解下帮助我也领悟了v校的含义。
于是今天实践了其中的技术1: 干掉远程线程,防止利用远程线程注入

领悟是有一个过程的,通过choday兄的帖子加上翻阅msdn
技术1的思想终于在我的脑子中融会贯通了,这篇帖子就想讲一讲理解的过程
里面的东西可能都很基础,但是请大牛莫笑

首先,v校指出应该以DllMain作为监视线程创建的回调函数
据此我去查询了msdn,上面写到:

DLL_THREAD_ATTACH

Indicates that the current process is creating a new thread. When this occurs, the system calls the entry-point function of all DLLs currently attached to the process. The call is made in the context of the new thread. DLLs can use this opportunity to initialize a TLS slot for the thread.

看到这些文字,于是我了解到一个事实,当进程中有新的线程被创建时,进程中包含的dll模块的DllMain函数会被系统调用,此时的调用参数就是DLL_THREAD_ATTACH,而且还有一点值得注意,就是DllMain是在新线程的上下文中运行的,也就是,是新创建的线程调用了DllMain函数

以上信息,结合choday兄的话

“DLLMain是一个回调,如果有新线程创建时,会收到一个DLL_THREAD_ATTACH,
这个时候 ,判断线程入口 点是不是为LoadLibraryA(W),如果 是的话,可以肯定是远程线程正在干注入这事,所以Kill之。至于 如何取得线程入口点QueryThreadInformation,自己百度去”

就可以大胆做一个推理,当进程中有新的线程创建时,首先是这个新线程调用进程中所有dll模块的入口函数,然后再执行这个线程的入口点。如果是这样,也就想到了choday兄所说的kill线程,方法其实就可以是在DllMain中ExitThread

为了证实这些猜测,我写了一个工程来进行验证,解决方案中
一个是exe工程,我把它模拟成游戏的主程序
一个是dll工程,也就是反外挂系统的保护组件

exe工程的窗口中,有3个按钮
装载保护DLL
卸载保护DLL
创建线程

当点击创建线程时,一个MessageBox以新线程的方式弹出



当点击装载保护DLL后,再点击创建线程,回先弹出DllMain中的MessageBox,如下



这时,
如果选择否,继续弹出线程中的MessageBox
如果选择是,则线程发生ExitThread,没有窗口弹出

也就是说,我们通过dllmain回调,阻止了新线程的运行。

至于外部进程对本地进程做CreateRemoteThread的情况,虽然未作测试,
不过我想应该也是和本地创建线程是一样的,希望有兴趣的同学可以去验证一下

恩没错,效果就是这样,至于代码,我就放附件里了

好了罗嗦了不少,终于讲完了,目的就是希望大家可以互动起来
毕竟IT这行业人多力量更大

这里只实践了v校的技术1,至于技术2,还没有实践,希望以后也可实践一下
希望与各位交流

工程附件
Game.rar

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班火热招生!!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (44)
雪    币: 788
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Nekoxiaoji 活跃值 2013-6-26 14:09
2
0
简单明了....很好哦
雪    币: 19
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
foolday 活跃值 2013-6-26 14:15
3
0
支持下,表示CreateRemoteThread也可以被阻止.
雪    币: 119
活跃值: 活跃值 (127)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Nermor 活跃值 1 2013-6-26 14:20
4
0
08年张静盛前辈在他的 windows 编程循序渐进 第377页 有代码和详解, tihty大牛可以参考下

我第一次看到的时候也跟楼主一样惊奇, DllMain这么神奇功能~
雪    币: 281
活跃值: 活跃值 (15)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
evilor 活跃值 2013-6-26 15:04
5
0
Windows核心编程上也讲的很清楚
雪    币: 5087
活跃值: 活跃值 (242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PPTV 活跃值 2013-6-26 19:59
6
0
的确是这样,MARK一下
雪    币: 46
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
永驻零一 活跃值 2013-6-26 21:09
7
0
那你没问V 外挂怎么办 难道就此死了?
雪    币: 241
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
exediy 活跃值 1 2013-6-26 21:17
8
0
鸡肋功能,小软件还可以但是大型软件不可取.为什么捏.因为线程入口是可以改变的.可以把入口放到程序的任意一个地方.然后你跟你的小伙伴们都惊呆了...
雪    币: 8670
活跃值: 活跃值 (583)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2013-6-27 11:32
9
0
大的的软件里做个记录,然后云来云,然后你就懂了。
雪    币: 241
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
exediy 活跃值 1 2013-6-27 15:33
10
0
不给你上传或者直接把上传的东西直接KILL.掉..目测云也没用
雪    币: 8670
活跃值: 活跃值 (583)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2013-6-27 18:00
11
0
是可以,但是大部分人没这个水平。
雪    币: 141
活跃值: 活跃值 (12)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
山村野人 活跃值 1 2013-6-27 20:01
12
0
应用层防,必须防shellcode和thread context,还有apc等等,方法也不难,用vista开始的dll载入通知函数,apc和上下文用ki和ntcountinue这些,都在ntdll里。。
雪    币: 1101
活跃值: 活跃值 (484)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
lynnux 活跃值 2013-6-27 20:12
13
0
上传是什么,不懂。另外线程入口像c  这类程序都是统一的吧,因为做了封装。
雪    币: 46
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
badboyck 活跃值 2013-6-27 23:55
14
0
作为外挂,用户是乐意提供任何适合外挂运行的环境及配置的。
那么,安装一个proxy dll,然后xxxxxxxxxxxxxxx如何?
雪    币: 66
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
流逝时光 活跃值 2013-6-28 00:16
15
0
刚买这本书,:,唉,慢慢看吧
雪    币: 1115
活跃值: 活跃值 (16)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
pencil 活跃值 5 2013-6-28 08:19
16
0
14楼说到点子上了,呵呵。这个点做监控还行
雪    币: 290
活跃值: 活跃值 (14)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
raigeki 活跃值 7 2013-6-28 08:28
17
0
DLL反调试,前段见过QQ游戏大厅的xxx.dll,貌似……
雪    币: 19
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Artmiss 活跃值 2013-6-28 10:06
18
0
是一种方法,但注入的方式很多种,就像前面说的shellcode式注入就拦截不了
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MONKEYiiD 活跃值 2013-6-28 12:11
19
0
mark,这个有些用处。
雪    币: 816
活跃值: 活跃值 (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zyicai 活跃值 2013-6-28 17:19
20
0
这个需要标记
雪    币: 100
活跃值: 活跃值 (234)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nanhai 活跃值 2013-6-28 18:28
21
0
留个印记 以后看
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xmagic 活跃值 2013-6-29 11:34
22
0
学习下,一直在找类似技术,原来入口在这里,读书不精啊。。。。
雪    币: 11245
活跃值: 活跃值 (373)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
diasstudy 活跃值 2013-6-30 19:54
23
0
思路不错,至少将DllMain函数和线程创建及拦截联系起来了,思路宽了,自然技术就通了。
雪    币: 218
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
执一 活跃值 2013-6-30 20:17
24
0
也许方法可行,但是如何防别人打开进程,再修改内存代码把你的HOOK摘掉?
雪    币: 100
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lxmls 活跃值 2013-7-1 05:13
25
0
mark!!!!!!!!!
游客
登录 | 注册 方可回帖
返回