我最近用C++编写了一个DLL-注入器,其要求如下
我很快注意到,Injector中的GetProcAddress("LoadLibraryA")调用返回一个“不可用”句柄,因为32位目标有另一个内核32.dll加载,并且函数的地址不同,因此注入失败(不能使用返回的地址/句柄启动远程线程)。此外,32位进程将内核32.dll加载到不同的基址,这使得创建远程线程变得更加不可能。
为了明确我的意思,会发生以下情况:
当从64位进程注入64位进程,从32位注入32位进程时,通常没有问题,因为内核32.dll(很可能)加载在相同的基址上,并且可以使用相同的函数地址--到目前为止,这就是我的错误所在。然而,在这种情况下,情况不同。
为了克服这个问题,我执行了以下步骤:
这种方法实际上运行得很好,但我无法摆脱这样的想法:这是总开销,必须有一个更简单的解决方案,从64位注入器中注入32位目标。
我有两个问题,如果能在这里得到答复,我将非常感激:
任何答案都是非常感谢的,谢谢!
编辑:哦,天哪.我刚刚意识到,我在最初的帖子中描述了错误的情况。注入器是64位,目标是32位(最初是相反的,但我已经更正了)。Ben在下面的评论是完全正确的,对EnumProcessModulesEx的调用将失败。一个大的,大的,抱歉的,对这种混乱:
发布于 2012-01-08 15:24:23
我认为您可以使用调试符号API来保存自己,解析PE头和导出表。这个路由应该为32位注入器提供所需的信息;64位目标情况也是如此,尽管我仍然不知道您将如何将64位地址传递给CreateRemoteThread
。
通常,这些调试符号函数需要一个.pdb或.sym文件来操作,但是我确信它们也会从DLL导出表中获得信息(只是从调试器对没有符号的文件显示的经验来看)。
发布于 2012-10-30 04:12:28
我无意中发现了这条线索,正在寻找解决同样问题的方法。
到目前为止,我倾向于使用另一个更简单的解决方案。要获得32位内核proc地址,64位进程只需执行一个32位程序,该程序将为我们查找proc地址:
#include <Windows.h>
int main(int argc, const char**)
{
if(argc > 1)
return (int) LoadLibraryA;
else
return (int) GetProcAddress;
}
发布于 2012-01-08 09:39:20
这个答案解决了这个问题的早期版本,它基本上与64位注入器的情况无关。
你是说这种方法有效吗?因为根据文献资料,您无法从WOW64获得有关64位进程的信息:
如果在WOW64下运行的32位应用程序调用该函数,则忽略dwFilterFlag选项,该函数提供与EnumProcessModules函数相同的结果。
(EnumProcessModules
进一步解释了这一限制)
如果该函数是从运行在WOW64上的32位应用程序调用的,它只能枚举32位进程的模块。如果进程是64位进程,则此函数将失败,最后一个错误代码是ERROR_PARTIAL_COPY (299)。
但是,由于kernel32.dll
的存在,您确实需要找到加载ASLR的基地址。
https://stackoverflow.com/questions/8776437
复制相似问题