首页
社区
课程
招聘
[原创]恶意代码分析之APC进程注入学习
发表于: 2020-5-23 11:12 7273

[原创]恶意代码分析之APC进程注入学习

2020-5-23 11:12
7273

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条件满足时会不断的调用。



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-5-23 11:14 被jishuzhain编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
简洁明了 谢谢分享
2020-5-23 13:19
0
雪    币: 796
活跃值: (2034)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
补充一点可有可无的,Sleep无法用于APC,需要通过SleepEx的第二个参数让线程进入可警醒才可以,大家请注意。
2020-5-24 10:23
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
for  (DWORD threadId : threadIds) 
这个是啥语法?
2020-5-24 13:37
0
雪    币: 7373
活跃值: (4075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
lhglhg for (DWORD threadId : threadIds) 这个是啥语法?
C++11
2020-5-26 09:53
0
雪    币: 256
活跃值: (382)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
htpidk C++11
这个语法不是c++17吗
2020-12-11 18:08
0
游客
登录 | 注册 方可回帖
返回
//