天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧安全 >> 正文

黑客系列教程之暴力注入Explorer

2008-2-18赛迪网佚名

  向一个运行中的进程注入自己的代码,最自然莫过于使用CreateRemoteThread,如今远线程注入已经是泛滥成灾,同样的监测远线程注入、防止远线程注入的工具也举不胜举,一个木马或后门启动时向Explorer或IE的注入操作就像在自己脸上写上“我是贼”一样。

  用户态代码想要更隐蔽地藏身于别的进程,就应该在注入的环节隐蔽自己的行为。下面就介绍一种非常简单不过比较暴力的方法,给出的示例为在Explorer里加载自己的dll。

  首先提到的就是一个API:QueueUserAPC

  

DWORD QueueUserAPC( PAPCFUNC pfnAPC, // APC function HANDLE hThread, // handle to thread ULONG_PTR dwData // APC function parameter ;

  

  大家对这个API应该并不陌生,它直接转入了系统服务NtQueueApcThread从而利用KeInsertQueueApc向给出的目标线程的APC队列插入一APC对象。倘若KiDeliverApc顺利的去构造apc环境并执行我们的代码那一切就OK了,只可惜没有那么顺利的事,ApcState中UserApcPending是否为TRUE有重要的影响,结果往往是你等到花儿都谢了你的代码还是没得到执行。在核心态往往不成问题,自己动手赋值,可是用户态程序可不好做,怎么办?其实最简单的,不好做就不做啰,让系统去干。

  实际上应用程序在请求“alertable”的等待时系统就会置UserApcPending为TRUE(当KeDelayExecutionThread/KeWaitForMultipleObjects/KeWaitForSingleObject 使用TestForAlertPending时就有可能,此外还有KeTestAlertThread等,机会还是有的),最简单的例子,目标线程调用SleepEx(***, TRUE)后我们插入APC代码就会乖乖执行了。

  比较幸运的是Explorer进程中一般情况下总有合我们意的线程,于是最简单但并不优美的办法就是枚举Explorer中所有线程,全数插入,示意如下:

  

  

...... DWORD ret; char *DllName = "c:\\MyDll.dll"; int len = strlen(DllName) + 1; PVOID param = VirtualAllocEx(hProcess, NULL, len, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE); if (param != NULL) { if (WriteProcessMemory(hProcess, param, (LPVOID)DllName, len, &ret)) { for (DWORD p = 0; p < NumberOfThreads; p ++) { hThread = OpenThread(THREAD_ALL_ACCESS, 0, ThreadId[p]); if (hThread != 0) { InjectDll(hProcess, hThread, (DWORD)param); CloseHandle(hThread); } } } ...... 其中InjectDll: void InjectDll(HANDLE hProcess, HANDLE hThread, DWORD param) { QueueUserAPC( (PAPCFUNC)GetProcAddress(GetModuleHandle("kernel32.dll", "LoadLibraryA", hThread, (DWORD)param ; }

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛https://bbs.txwb.com

关注天下网吧微信,了解网吧网咖经营管理,安装维护:


本文来源:赛迪网 作者:佚名

声明
本文来源地址:0
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系Email:support@txwb.com.,本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行