首页
社区
课程
招聘
[原创]再谈应用层反外挂技术
发表于: 2013-6-28 11:36 7709

[原创]再谈应用层反外挂技术

2013-6-28 11:36
7709
利用DllMain来阻止注入的想法其实很早就有了,msdn上已经把fdwReason讲的很清楚了,所以这个用法其实也是很直接就能想到了

不过在"应用层反外挂技术实践"(http://bbs.pediy.com/showthread.php?t=174292)出来后,我才真正的尝试了一下这个想法.毕竟别人都把源代码丢这了,自然拿来玩玩呗

但是在载入了保护DLL并且杀掉了第一个创建的线程后,再次点击创建线程却什么都没有发生.很明显代码是有问题的,不过我自己也没有去研究这个的打算,毕竟也没有啥程序需要这样反注入的,也就放在那里了.

不过我现在在写的一个程序里,对一个dll有一个很具体的要求:在载入时加载另一个dll.另一个dll并不是确定的,需要读取环境变量来获得.很自然的想到了在DllMain里面LoadLibrary,不过以前记得在DllMain里面执行LoadLibrary和CreateThread都会导致死锁,想来只有研究一下到底能够在DllMain里面干什么了

Google后找到了这么一篇"Best Practices for Creating DLLs"(http://msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx).我现在还只是看到个开头,但是这里面有这么一句引起了我的注意:

• Call ExitThread. Exiting a thread during DLL detach can cause the loader lock to be acquired again, causing a deadlock or a crash.


按照这个文章的说法,系统在加载DLL的时候首先会获取一个进程全局可重入的锁(ReactOS是用一个临界区实现的),然后在加载完成后释放掉.由于除了互斥量以外的锁在线程意外中止的情况下均不会释放,ExitThread后会导致死锁也就十分理所当然:再次LoadLibrary时将会永久的等待这个锁.对于这一点大家可以自己在那个帖子里的例子里点击"加载保护DLL"自己测试

而如果这个只是导致进程之后不能加载DLL也就罢了,我们可以先把所有需要加载的dll都加载好.不过按照上面说的那个微软文档,通过CoInitializeEx初始化COM线程在特定情况下会使用LoadLibraryEx;CreateProcess也可能加载dll.而在ReactOS中各dll中调用LoadLibrary近160次,这意味着这些函数将统统不能使用.而你永远也不能确保一个Win32API会不会在以后突然就有了LoadLibrary的需求.

所以如果真的需要在Ring3层反注入的话,还是inline hook LoadLibrary最为稳妥

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
ExitThread前,release掉全局锁就行了~~(非常简单!!)
2013-6-28 12:48
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
LoadLibrary..内射直接无视.再说了我早就说过了DllMain来阻止明显是鸡肋,把线程入口设置在你的程序代码段你根本就无法识别是不是正常线程还是被注入的线程
2013-6-28 14:44
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
但是在载入了保护DLL并且杀掉了第一个创建的线程后,再次点击创建线程却什么都没有发生. 我在测试的时候表示屡试屡爽,但是正如楼上所说的。非常鸡肋....如果是某个多线程程序的话,也可能会引发某些错误... 黑白名单Inline Hook LoadLibrary...
2013-6-28 14:54
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个锁存在于ntdll内部,首先你怎么找,然后你怎么保证下一个Windows版本不会修改锁的位置和性质
2013-6-28 21:36
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
符号文件,暴力搜索,根据ntdll的hash值 硬编码偏移,各种都可以~~
2013-6-29 08:39
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
读入口的方法不止一种,另外设置入口只能改那个win32start吧,zwsetinformationthread过去的吧,不是context的eax,话说,你如果说构造esp,构造地址...好吧,你写这个注入需要多少功力,现在大部分人有这个功力?
2013-6-29 08:43
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
loadlibrary可以避免,注入线程未必需要LoadLibrary....API什么倒是次要的,shellcode灵活多变,甚至可以先跳过对loadlibrary的hook进行load~MSF直接支持LdrLoadDLL的shellcode生成,亲~~
2013-6-29 08:45
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
所以现在我hook了自己的ntdll!ZwOpenFile来过滤,普通的DLL注入全死~
然后远程线程是通过对ntdll!LdrpInitialize处理。
唯一没防御的就是setcontextthread了~

不过hook明显不和谐,主要是需要写N套啊~~x86,x64,ia64自己撸有多少代码要搞~~

最后就陷入一个怪圈,不hook不行,hook又麻烦,于是最后还是果断驱动去了~。
2013-6-29 08:49
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呵呵,make一下,膜拜V校,学习了
2013-6-29 17:39
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
确实。。。。顶一个
2013-6-29 17:42
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
说的不清楚 简单道理被Vx说复杂了
直接鄙视它
2013-6-29 19:23
0
雪    币: 3559
活跃值: (1882)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
13
mark,顶v大
2013-6-29 19:33
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
“所以现在我hook了自己的ntdll!ZwOpenFile来过滤,普通的DLL注入全死~
然后远程线程是通过对ntdll!LdrpInitialize处理”
v大能简要说一下原理吗?最近想学一些应用层反外挂的东西...
2013-7-5 11:31
0
游客
登录 | 注册 方可回帖
返回
//