昨天看到了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
[课程]Linux pwn 探索篇!
上传的附件: