这篇文章收录于《取证实录》第四季中。
注册表隐藏技术通常用于恶意软件、后门程序或攻击者企图在系统中保持隐蔽,绕过安全检查和防御系统。
常见的隐藏技术有:使用非法字符隐藏注册表项(如PlugX、TDL4/Alureon(Rootkit))、利用默认键值(空字符串)隐藏(如Adwind RAT)、使用深度嵌套的注册表项(如Zlob (DNSChanger)、Rovnix (Rootkit))、重命名标准注册表项(如TrickBot、Dridex)、注册表反射技术(如Zeus(Zbot))、通过注册表权限进行隐藏(如Carberp)、使用模糊键名或随机化键值(如Qakbot、Ursnif)、滥用镜像注册表键(如Rovnix)、注册表软链接(如Necurs(Rootkit)、Max++(Rootkit))、滥用组策略(GPO)注册表项等。
这里,我们通过研究源代码来了解其中的两项技术,通过代码探究它背后的细节,达到知已知彼。
第一部分 创建Unicode空字节
空字节,就是“0x0000”,就是“ ”。对于Windows系统,”” (0x0000)会被识别为字符串的结束符,所以在使用Regedit对该字符串读取的过程中,遇到开头的””,会被解析成结束符,提前截断,导致读取错误。
以SharpHide开源工具为例,“一个很好的后门持久性技巧,用来混淆DFIR调查。使用NtSetValueKey本机API创建隐藏(以空结尾)注册表项。这是通过在UNICODE_STRING键值名称前面添加一个空字节来实现的”。程序运行后,显示有三个功能:在Run下创建一个键值:“keyvalue=bla.exe”或带参数的“keyvalue=bla.exe argument=arg1 arg2”,以及delete该键。
当程序以sharphide action=create keyvalue="c:windowstempbla.exe"运行时创建成功了键名为“Software”+键值为“c:windowstempbla.exe”的注册表项。用regedit却看不到它的内容并报错,阻止查看;分别对应着HKCU和HKLM的一般用户和管理员权限,均在SoftwareMircosoftWindowsCurrentVersionRun。
(一)源码部分:
UIntPtr regKeyHandle = UIntPtr.Zero;
string runKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
string runKeyPathTrick = "
评论