本章记录一下常见的恶意代码隐藏手段, 包含注入 劫持 hook等, 只有了解了这些技术手段才能在实战中快速定位核心代码, 否则可能将大量精力花费在释放器或注入器上.
启动器也可以称为释放器,恶意程序常使用该技术达到隐藏核心代码的目的。如常听到的各种“千层饼”样本、多个家族使用的.NET框架的PEloader,他们大部分都将第一层代码加密或明文存储在资源节中,在运行时通过使用FindResource LoadResource SizeofResource LockResource
等一系列对资源数据进行操作的API来达到释放恶意文件或者内存解密运行等目的.
由于启动器技术的需要, 因此一些启动器常常会涉及到提权的操作, 这也可以帮助我们识别启动器样本。
由于计算机技术的普及, 越来越多的用户学会了通过观察任务管理器中的可疑进程名来初步判断自己的机子是否遭到了破坏. 而恶意软件作者也发现了这一点后也将各式各样的隐藏进程技术应用到了自身的产品中.
dll注入则是很经典的一个注入方式, 通过将自身的黑dll注入到正常的白进程中, 使得用户无法通过进程名分辨出哪些是恶意进程哪些是系统正常进程, 而关于dll注入就有多种方式:
恶意程序作者可以在进程创建前通过修改PE映像中的导入表数据使得白文件在进行PE装载时加载自己的黑dll,这种方式只要求恶意代码作者有良好的PE知识即可, 因此也成为了很多PE-导入表课程中一个经典的练习作业. 但由于修改了PE数据, 导致该方式极容易被防护程序检测到, 因此这种技术已经慢慢的被淘汰.
相比与导入表注入, 远程线程注入更加隐蔽, 相比之下对于防护人员的技术要求也更高.
常用的方法为通过VirtualAllocEx
向目标进程开辟内存空间用于存储欲注入的dll字符串数据,然后通过CreateRemoteThread
创建一个远程线程用于执行shellcode, 这段shellcode比较简单, 则是通过调用LoadLibrary
来实现对恶意dll的动态加载
而检测手段也很容易, 通过扫描进程内加载的dll模块与预先设定好的白名单或黑名单进行比对即可, 因此也衍生出了一系列对于dll模块隐藏的技术手段, 这里就不赘述了
这个技术与远线程注入dll的技术思路相同, 都是通过在远程进程中创建一个线程来执行代码, 不同的是dll注入只需执行LoadLibrary即可, 而纯shellcode则执行一整段恶意代码, 也是比较高级的一个手段, 可以让恶意代码作者有更高的自由度, 可以执行自己想要的代码功能.
其中涉及到的几个API包含 CreateToolhelp32Snapshot Process32First Process32Next
来遍历进程, OpenProcess
来打开进程获取句柄, WriteProcessMemory
向远程进程写入数据, CreateRemoteThread
创建远程线程等
防护手段则是通过从内核到用户层的种种防护来使恶意程序无法打开自身程序获取句柄
, 即使打开了也无法向自身进程写入内存数据
等, 这样的对抗更为复杂与高级, 常用于各大游戏厂商与安全软件厂商的自身程序保护中
进程替换顾名思义, 将某个进程替换为恶意程序, 与注入不同的是, 进程替换会掏空目标进程, 不保留原先的任何代码, 由于进程替换需要对PE知识掌握的十分牢固, 因此也成为了很多课程中PE知识的练习作业
进程替换的原理是系统在挂起创建进程时,用户有充足的时间与权限去修改这个进程
, 而通过ZwUnmapViewOfSection
可以实现对进程空间内已挂载的PE数据进行清空的操作, 在通过对恶意程序进行正确的PE拉伸与修改后, 通过ResumeThread
来恢复目标进程的运行, 但此时虽然你在任务管理器等工具中看到的进程名为正常程序, 但其内部的所有代码都变成了恶意代码,这种技术隐藏自身十分有效, 但是也有一个简单的方式去检测, 那就是观察父进程
, 通过此技术运行的傀儡进程, 父进程通常不是正常的Explorer或系统进程, 而是恶意程序的启动器进程
该技术的目标进程常为svchost.exe csrss.exe calc.exe notepad.exe cmd.exe lsass.exe
等常见系统进程, 如果发现自己的机子中出现了一个父进程很奇怪的系统进程, 这时候就需要留意, 很可能是进程替换技术
HOOK技术常用于监测、拦截一段代码, 这种技术的强大使其在各个领域都有广泛的应用, 恶意代码作者自然也非常喜欢HOOK, 常见的键盘记录器(木马盗号之类的)就包含这种HOOK技术, 通过微软官方提供的API或自己实现一个HOOK可以对键盘鼠标等事件进行监控, 从而恶意程序可以知道用户输入的密码是什么 , HOOK种类很多, 应用也很广泛, 但最关键的是识别HOOK代码
APC即异步过程调用, 看一下书中对APC的解释
大体的意思就是如果有某个线程处于等待状态, 系统就会调用APC队列中的APC函数,全部调用结束后就会继续线程的执行. 鉴于这种类似hook的机制, 恶意代码作者可以通过指定APC的方式来是目标进程中的某个线程执行指定的函数.
用户模式下的APC注入需要用到一个函数QueueUserAPC
, 查阅MSDN观察函数参数
通过对进程进行遍历, 找到其中的目标线程, 将该线程句柄, 恶意函数指针 , 恶意函数参数全部传入, 即可实现用户模式下的APC注入, 书中给出的例子如下:
可以看到代码清单中, 作者通过将LoadLibraryA与恶意dll作为参数传入QueueUserAPC中, 实现了简单的APC注入
该恶意代码的目标进程为svchost.exe
,因为该进程的线程通常处于等待状态, 因此可以保证恶意函数可以被很快的执行
由于笔者未系统学过内核方面知识, 因此此处知识点暂时记录, 等积累够了内核方面的知识再回来看
通过该章的知识学习, 可以发现很多技术都是通过对PE知识与内存知识的延申, 因此需要读者有扎实的基础, 此章列举的技术都是经典技术, 只有将学过的理论知识结合灵活运用才能发现新的对抗技术
在你运行恶意代码可执行文件时,会发生什么?
通过火绒剑的行为捕捉, 可以发现样本直接退出了,应该是系统不兼容,或许在XP上可以,目前没有XP的镜像
哪个进程会被注入
通过观察IDA可以发现程序在遍历进程寻找explorer.exe 可以知道explorer会被注入
你如何能够让恶意代码停止弹出窗口
观察代码发现是远线程注入, 这已经污染了原进程, 可以通过重启explorer进程或通过工具卸载Lab 12-1.dll来停止弹窗
这个恶意代码样本是如何工作的
通过遍历进程寻找explorer.exe , 然后通过远程线程注入技术调用LoadLibrary记载Lab12-1.dll来实现循环弹窗
这个程序的目的是什么?
监控按键消息, 获取用户的案件输入
启动器恶意代码是如何隐蔽执行的?
通过上文中所说的进程替换技术来运行一个傀儡进程svchost.exe
恶意代码的负载存储在哪里?
使用0x41进行亦或加密后存储在资源节中
恶意负载是如何被保护的?
通过0x41亦或加密来保护
字符串列表是如何被保护的?
通过0x41亦或加密来保护
这个恶意负载的目的是什么?
记录用户的键盘输入
恶意负载是如何注入自身的?
通过SetWindowsHookExA设置消息钩子
这个程序还创建了哪些文件?
创建了一个日志文件用来记录
位置0x401000的代码完成了什么功能?
遍历进程寻找winlogon.exe
代码注入了哪个进程?
注入了所有名为winlogon.exe的进程
使用LoadLibraryA装载了哪个dll程序?
装载了sfc_os.dll
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课