-
-
[原创]恶意代码分析之APC进程注入学习
-
发表于:
2020-5-23 11:12
7259
-
APC队列:每个线程都有一个APC队列,在线程处于可警醒状态时,线程会执行APC队列中APC函数。
1、线程已经创建,系统在调用线程函数时会检查APC队列,如果不为空,则调用APC队列中的apc函数,直到队列为空后,才开始调用线程函数。
2、线程通过WaitForSingleObjectEx等函数进入可警醒状态时,会先检查APC队列,如果不为空,则调用APC队列中的apc函数,直到队列为空后,才开始等待要等待的对象,此时如果要等待的对象没有进入激发态且没有超时,WaitForSingleObjectEx不会返回。
3、线程通过WaitForSingleObjectEx等函数进入可警醒状态时,APC队列为空,且要等待的对象没有进入激发态,也没有超时,则线程进入睡眠等待状态,此时往该APC队列添加APC函数后,该线程会被唤醒执行完所有APC队列中的函数,然后不去看要等待的对象是否进入激发态,立即从WaitForSingleObjectEx中返回,返回值是WAIT_IO_COMPLETION。往线程APC队列添加APC,系统会产生一个软中断。在线程下一次被调度的时候就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC。
shellcode示例如下:
将shellcode的16进制数据copy到ollydbg工具的反汇编窗口中,即可完成。例如在ollydbg中打开任意一个exe文件,在反汇编窗口中选中足够的行数,鼠标右击-二进制-二进制粘贴。经测试这段shellcode的作用是会弹出计算器,如下。
以下C#代码中出现的@与任何方法无关,作用是无需在符号后的字符串中转义特殊字符。例如,@"c:\temp" 等于"c:\\temp"。
完整代码,示例采用C#编写。
以上适用的是x64环境,实际演示如下。
采用C++编写的APC注入示例,如下。
实际演示如下,进驻explorer.exe条件满足时会不断的调用。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-5-23 11:14
被jishuzhain编辑
,原因: