奇怪的是,没有提到另外两种方法。据AppInit_DLLs
我所知,您提到的方法不再适用。至少没有那么容易,尤其是在启用 UEFI 安全启动时。
在这两种情况下,它都取决于目标二进制文件,所以让我们来看看它。
DLL 放置攻击
我过去曾在 Windows 7 上运行过此程序,但此后规则发生了变化。我使它工作的方式如下。我找到了一个由程序加载的(供应商提供的)DLL,没有完整路径(我选择了导入次数最少的那个)。然后我编写了一个存根 DLL,它会简单地将所有函数调用传递给真正的 DLL(通过完整路径加载)并为我打印出有用的信息。返回值将被简单地返回。
很容易弄清楚导出函数的函数原型,所以这对我来说是一个懒惰的选择。
ImageFileExecutionOptions
Process Explorer 使用此方法使自己成为任务管理器的替代品。下面是它的实际效果:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskmgr.exe]
"Debugger"="\"C:\\PATH\\TO\\PROCEXP.EXE\""
现在值名称可能已经泄露了,这以前用于完全不同的目的。
无论哪种方式,您都可以(ab)使用它来实现您想要的。您编写了一个小的存根加载器,充当“调试器”。没什么,您甚至不必实现任何调试器 API,尽管您可以。
您要做的就是使用CreateProcess
或类似方法创建一个进程,其主线程在“启动”时处于挂起状态。您可以随心所欲地传递命令行参数(尽管确实如此),但CreateProcess
与朋友们有一些关系。
暂停的主线程是您可以绕道到您自己的代码的地方……通常是一段简单的 shell 代码,除了加载您的DLL 然后返回到原始入口点之外什么都不做。等瞧,您已加载的DLL到应用程序中。
第二种方法的好处在于它可以很好地扩展,因为您基本上只需要编写一次这种“调试器”(加载器)。所以它可以保持通用。
这个方法相当于做(从命令行):
loader.exe C:\path\to\hijacked\application.exe argument1 argument2 and more arguments
...除了对用户来说这将是透明的。我认为在你的加载器中你甚至可以argv[0]
用来获取被劫持的可执行文件 IIRC 的路径。
现在您可能认为这是一些奇怪的安全问题,并想知道为什么它被忽视了。这不是安全问题,因为您必须首先获得特权ImageFileExecutionOptions
。
作为旁注:我认为甚至taskmgr.exe
可以使用要劫持的可执行文件的完整路径来命名包含密钥(在上述注册表文件中)。