首页
社区
课程
招聘
应用层反外挂技术实践
发表于: 2013-6-26 13:56 40672

应用层反外挂技术实践

2013-6-26 13:56
40672

昨天看到了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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

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

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