我向现有应用程序添加了一些功能,这些功能可以通过dll注入进行工作-我的dll加载并修补了一些东西。

我希望将其永久添加到此应用程序中,因此我不必每次都手动注入它-我知道有一些解决方案,例如:


加载程序-另一个运行目标应用程序的应用程序,然后注入dll
补丁EP-目标应用程序的补丁程序条目,以便它在执行rest之前先加载我的dll
AppInit_DLL-使其通过几乎所有进程加载此寄存器条目,然后检查我们是否在正确的寄存器条目中,否则将其卸载

,但是那些选项最优化吗?第一和第二项需要一些工作(也许有些我不知道并允许使用的现有工具?因此我不必自己准备所有工具),而第三项似乎有点过分。
只是为了扩展我的知识-还有其他选择吗?

#1 楼

您也可以将DLL添加到EXE的导入表中。这样的好处是不会将DLL加载到每个加载user32.dll的进程中(这是#3的问题),并且您可以使用IIDKing之类的工具轻松地执行此导入表添加操作:



评论


chrome告诉我该链接包含恶意软件

– Suici Doga
17年5月1日在10:29

备用链接:reteam.org/tools/tf23.zip

–詹森·格夫纳(Jason Geffner)
17年5月10日下午4:02

当我尝试添加dll时,该工具崩溃了。任何想法可能导致此问题?

– SampleTime
19年6月2日在14:18

@SampleTime是的,当您创建dll时,请使用__declspec(dllexport)关键字标记功能之一:docs.microsoft.com/en-us/cpp/build/…。此IIDKing程序将dll添加到您选择的PE文件的导入表中,并将该dll中的功能添加到您选择的PE文件的导入地址表(IAT)中。因此,您需要具有dll并需要它来导出函数(在导出地址表(EAT)中具有条目),以便IIDKing可以在您的IAT中添加条目,这就是IIDKing崩溃的原因:在EAT中找不到任何条目您的dll。

–库拉金
20年6月19日在11:29

#2 楼

这是我前一段时间遇到问题时所做的。


使用依赖遍历器查找由主要可执行文件导入的DLL,.exe仅从其中导入一个或两个函数。举个例子,假设您的应用程序someprog.exe使用了一个dll vendor.dll,它从其中导入了ShowCopyright函数。
使用十六进制编辑器,将可执行文件中的字符串vendor.dll更改为hacker.dll
在启动时DLL中,使用LoadLibrary("vendor.dll")GetProcAddress("ShowCopyright")获取指向真正的ShowCopyright函数的函数指针。
此外,在您的DLL中,提供ShowCopyright导出,除了跳转到您刚刚检索到的ShowCopyright地址外,什么也没做。重命名您的DLL hacker.dll并将其放入应用程序的搜索路径。几十个API条目或资源,或可以链接到dll的任何东西。

编辑:

完成我的文章后,我找到了Jason的答案,这似乎更加专业和容易。但是,至少,除了十六进制编辑器之外,我的解决方案不需要任何工具:-)

#3 楼

正如Jason Geffner所说,您可以将DLL添加到.exe的导入表中。除了IIDKing之外,可以将您的dll添加到PE文件的导入表中的其他工具称为Stud_PE,与IIDKing不同,如果您的dll在导出地址表(EAT)中没有任何条目,则该工具不会崩溃:


#4 楼

尽管很奇怪,但没有提到其他两种方法。据我所知,您提到的AppInit_DLLs方法不再有效。至少不那么容易,尤其是在启用UEFI安全启动时。

DLL放置攻击
ImageFileExecutionOptions

在两种情况下,它都取决于目标二进制文件,因此让我们
DLL放置攻击
我过去在Windows 7上运行过此攻击,但此后规则已更改。我的工作方式如下。我找出了一个由程序加载的DLL(由供应商提供),但没有完整路径(我选择了导入次数最少的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\""

现在值名称可能已经泄漏了它,以前用于完全不同的目的。
您可以(滥用)任何一种方式来使用它实现您想要的。您编写一个小的存根加载器,充当“调试器”。它没有太多,甚至可以实现,甚至不必实现任何调试器API。
您要做的就是使用CreateProcess或类似的东西来创建一个带有其主要内容的进程启动后线程处于挂起状态。您可以根据需要传递命令行参数(尽管它确实是),但与CreateProcess和朋友有关。除了加载您的DLL,然后返回原始入口点外,外壳代码什么也没有做。等等,您已经将DLL加载到了应用程序中。
关于第二种方法的好处是,它可以很好地扩展,因为您基本上只需要编写一次这种“调试器”(加载器)即可。因此,它可以保持通用。
(从命令行)此方法等同于做:而且我认为您可以在加载程序内部甚至使用argv[0]来获取被劫持的可执行文件IIRC的路径。
现在您可能会认为这是一些奇怪的安全问题,并且想知道为什么它没有被注意。就必须首先设置ImageFileExecutionOptions的特权而言,这不是安全问题。
作为侧面说明:我认为甚至可以用以下命令命名包含项(在上面的注册表文件中为taskmgr.exe)要劫持的可执行文件的完整路径。

#5 楼

另一个可以满足您需求的程序是CFF Explorer: