首页
论坛
课程
招聘
[病毒木马] [调试逆向] [原创]分析实战读书笔记9_恶意代码的隐蔽执行
2021-2-22 15:34 2563

[病毒木马] [调试逆向] [原创]分析实战读书笔记9_恶意代码的隐蔽执行

2021-2-22 15:34
2563

目录

0.前言

本章记录一下常见的恶意代码隐藏手段, 包含注入 劫持 hook等, 只有了解了这些技术手段才能在实战中快速定位核心代码, 否则可能将大量精力花费在释放器或注入器上.

1.常见恶意代码隐藏技术

1.1 启动器(Launcher)

image-20210220172427346

 

启动器也可以称为释放器,恶意程序常使用该技术达到隐藏核心代码的目的。如常听到的各种“千层饼”样本、多个家族使用的.NET框架的PEloader,他们大部分都将第一层代码加密或明文存储在资源节中,在运行时通过使用FindResource LoadResource SizeofResource LockResource等一系列对资源数据进行操作的API来达到释放恶意文件或者内存解密运行等目的.

 

由于启动器技术的需要, 因此一些启动器常常会涉及到提权的操作, 这也可以帮助我们识别启动器样本。

1.2 进程注入-dll注入

由于计算机技术的普及, 越来越多的用户学会了通过观察任务管理器中的可疑进程名来初步判断自己的机子是否遭到了破坏. 而恶意软件作者也发现了这一点后也将各式各样的隐藏进程技术应用到了自身的产品中.

 

dll注入则是很经典的一个注入方式, 通过将自身的黑dll注入到正常的白进程中, 使得用户无法通过进程名分辨出哪些是恶意进程哪些是系统正常进程, 而关于dll注入就有多种方式:

1.2.1 导入表注入

恶意程序作者可以在进程创建前通过修改PE映像中的导入表数据使得白文件在进行PE装载时加载自己的黑dll,这种方式只要求恶意代码作者有良好的PE知识即可, 因此也成为了很多PE-导入表课程中一个经典的练习作业. 但由于修改了PE数据, 导致该方式极容易被防护程序检测到, 因此这种技术已经慢慢的被淘汰.

1.2.2 shellcode远程线程注入

相比与导入表注入, 远程线程注入更加隐蔽, 相比之下对于防护人员的技术要求也更高.

 

常用的方法为通过VirtualAllocEx向目标进程开辟内存空间用于存储欲注入的dll字符串数据,然后通过CreateRemoteThread创建一个远程线程用于执行shellcode, 这段shellcode比较简单, 则是通过调用LoadLibrary来实现对恶意dll的动态加载

 

而检测手段也很容易, 通过扫描进程内加载的dll模块与预先设定好的白名单或黑名单进行比对即可, 因此也衍生出了一系列对于dll模块隐藏的技术手段, 这里就不赘述了

1.3 进程注入-shellcode注入

这个技术与远线程注入dll的技术思路相同, 都是通过在远程进程中创建一个线程来执行代码, 不同的是dll注入只需执行LoadLibrary即可, 而纯shellcode则执行一整段恶意代码, 也是比较高级的一个手段, 可以让恶意代码作者有更高的自由度, 可以执行自己想要的代码功能.

 

其中涉及到的几个API包含 CreateToolhelp32Snapshot Process32First Process32Next来遍历进程, OpenProcess来打开进程获取句柄, WriteProcessMemory向远程进程写入数据, CreateRemoteThread创建远程线程等

 

防护手段则是通过从内核到用户层的种种防护来使恶意程序无法打开自身程序获取句柄, 即使打开了也无法向自身进程写入内存数据等, 这样的对抗更为复杂与高级, 常用于各大游戏厂商与安全软件厂商的自身程序保护中

1.4 进程替换

进程替换顾名思义, 将某个进程替换为恶意程序, 与注入不同的是, 进程替换会掏空目标进程, 不保留原先的任何代码, 由于进程替换需要对PE知识掌握的十分牢固, 因此也成为了很多课程中PE知识的练习作业

 

进程替换的原理是系统在挂起创建进程时,用户有充足的时间与权限去修改这个进程, 而通过ZwUnmapViewOfSection可以实现对进程空间内已挂载的PE数据进行清空的操作, 在通过对恶意程序进行正确的PE拉伸与修改后, 通过ResumeThread来恢复目标进程的运行, 但此时虽然你在任务管理器等工具中看到的进程名为正常程序, 但其内部的所有代码都变成了恶意代码,这种技术隐藏自身十分有效, 但是也有一个简单的方式去检测, 那就是观察父进程, 通过此技术运行的傀儡进程, 父进程通常不是正常的Explorer或系统进程, 而是恶意程序的启动器进程

 

该技术的目标进程常为svchost.exe csrss.exe calc.exe notepad.exe cmd.exe lsass.exe等常见系统进程, 如果发现自己的机子中出现了一个父进程很奇怪的系统进程, 这时候就需要留意, 很可能是进程替换技术

1.5 HOOK注入

HOOK技术常用于监测、拦截一段代码, 这种技术的强大使其在各个领域都有广泛的应用, 恶意代码作者自然也非常喜欢HOOK, 常见的键盘记录器(木马盗号之类的)就包含这种HOOK技术, 通过微软官方提供的API或自己实现一个HOOK可以对键盘鼠标等事件进行监控, 从而恶意程序可以知道用户输入的密码是什么 , HOOK种类很多, 应用也很广泛, 但最关键的是识别HOOK代码

1.6 APC注入

APC即异步过程调用, 看一下书中对APC的解释

 

image-20210222120809206

 

大体的意思就是如果有某个线程处于等待状态, 系统就会调用APC队列中的APC函数,全部调用结束后就会继续线程的执行. 鉴于这种类似hook的机制, 恶意代码作者可以通过指定APC的方式来是目标进程中的某个线程执行指定的函数.

1.6.1 用户模式下APC注入

用户模式下的APC注入需要用到一个函数QueueUserAPC, 查阅MSDN观察函数参数

 

image-20210222130525525

  • pfnAPC : 要执行的函数的指针
  • hThread : 目标线程的句柄
  • dwData : 要执行的函数的参数

通过对进程进行遍历, 找到其中的目标线程, 将该线程句柄, 恶意函数指针 , 恶意函数参数全部传入, 即可实现用户模式下的APC注入, 书中给出的例子如下:

 

image-20210222130737514

 

可以看到代码清单中, 作者通过将LoadLibraryA与恶意dll作为参数传入QueueUserAPC中, 实现了简单的APC注入

 

该恶意代码的目标进程为svchost.exe,因为该进程的线程通常处于等待状态, 因此可以保证恶意函数可以被很快的执行

1.6.2 内核模式下APC注入

由于笔者未系统学过内核方面知识, 因此此处知识点暂时记录, 等积累够了内核方面的知识再回来看

 

image-20210222131051964

 

image-20210222131107452

 

image-20210222131123364

2.总结

通过该章的知识学习, 可以发现很多技术都是通过对PE知识与内存知识的延申, 因此需要读者有扎实的基础, 此章列举的技术都是经典技术, 只有将学过的理论知识结合灵活运用才能发现新的对抗技术

3.课后练习

Lab 12-1

  1. 在你运行恶意代码可执行文件时,会发生什么?

    image-20210222140137936

    通过火绒剑的行为捕捉, 可以发现样本直接退出了,应该是系统不兼容,或许在XP上可以,目前没有XP的镜像

  2. 哪个进程会被注入

    image-20210222142822570

    通过观察IDA可以发现程序在遍历进程寻找explorer.exe 可以知道explorer会被注入

  3. 你如何能够让恶意代码停止弹出窗口

    image-20210222143037836

    观察代码发现是远线程注入, 这已经污染了原进程, 可以通过重启explorer进程或通过工具卸载Lab 12-1.dll来停止弹窗

  4. 这个恶意代码样本是如何工作的

    通过遍历进程寻找explorer.exe , 然后通过远程线程注入技术调用LoadLibrary记载Lab12-1.dll来实现循环弹窗

Lab 12-2

  1. 这个程序的目的是什么?

    image-20210222144300947

    监控按键消息, 获取用户的案件输入

  2. 启动器恶意代码是如何隐蔽执行的?

    image-20210222144337815

    通过上文中所说的进程替换技术来运行一个傀儡进程svchost.exe

  3. 恶意代码的负载存储在哪里?

    image-20210222144522189

    使用0x41进行亦或加密后存储在资源节中

  4. 恶意负载是如何被保护的?

    通过0x41亦或加密来保护

  5. 字符串列表是如何被保护的?

    通过0x41亦或加密来保护

Lab 12-3

  1. 这个恶意负载的目的是什么?

    记录用户的键盘输入

  2. 恶意负载是如何注入自身的?

    image-20210222150040740

    通过SetWindowsHookExA设置消息钩子

  3. 这个程序还创建了哪些文件?

    image-20210222150205156

    image-20210222150131812

    创建了一个日志文件用来记录

Lab 12-4

  1. 位置0x401000的代码完成了什么功能?

    image-20210222150733252

    image-20210222150805957

    遍历进程寻找winlogon.exe

  2. 代码注入了哪个进程?

    image-20210222151247701

    注入了所有名为winlogon.exe的进程

  3. 使用LoadLibraryA装载了哪个dll程序?

    image-20210222151404083

    装载了sfc_os.dll

  4. 传递给CreateRemoteThread调用的第4个参数是什么?

    image-20210222151514485

    是sfc_os.dll中导出序号为2的导出函数的函数指针

  5. 二进制主程序释放出了哪个恶意代码?

    image-20210222151919253

    image-20210222152011043

    释放出了资源节中名为bin:101的PE数据

  6. 释放出恶意代码的目的是什么?

    用于从远程服务器上下载文件来动态执行, 可能为恶意程序自我更新功能

4.章节总结

本章介绍了一些经典的隐藏手段, 都是十分实用的手段, 所有读者应在空闲时间尝试通过正向代码实现所有技术


[公告]名企招聘!

收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 1774
活跃值: 活跃值 (80)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
NoThx 活跃值 2021-2-22 16:45
2
0
谢谢分享,值得学习
雪    币: 4451
活跃值: 活跃值 (3948)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
SSH山水画 活跃值 1 2021-2-22 19:12
3
0
NoThx 谢谢分享,值得学习[em_67]
谢谢
游客
登录 | 注册 方可回帖
返回