我在我的机器上用C ++创建了一个library
注入方法,当我尝试将一个特定的dll注入一个进程时,它非常有效。但是,当我在我朋友的计算机上运行该程序时(其中未安装Visual Studio
的可再发行组件),我被警告我需要MSVCR
等...(可再发行组件)。
所以我使用Visual Studio 2012中的以下设置在release
模式下编译:{{1}}。现在,当我在我的朋友那里运行它
机器我被警告我只需要库Runtime Library : Multi-threaded /MT
(很奇怪,要求调试版本)(没有防病毒软件,UAC被禁用)。
我在发布路径中手动复制了所请求的库,但仍无法正常工作。
这是我制作的注射码:
MSVCP110D.dll
我在stackoverflow上找到了一些引用,但它们没有任何帮助。 喜欢 msvcp110.dll, how do I get around it?或Fixing the "MSVCP110D.dll is missing from your computer" issue
答案 0 :(得分:10)
很奇怪,要求调试版
告诉你你做错了什么,你不小心复制了DLL的Debug版本而不是Release版本。由于您只更改了发布版本的设置,因此仍需要msvcp110d.dll。通常,更改所有配置和所有平台的设置是明智的。单调乏味,所以经常会被跳过。
我在发布路径中手动复制了所请求的库,但仍无法正常工作
是的,自注入DLL以来,这是行不通的。一个不同的过程。因此,在加载时,会搜索游戏的安装目录以查找文件,而不是安装实用程序的目录。
答案 1 :(得分:3)
您的朋友需要Visual-C++ Redistributables
才能正确运行您的注入器,以及加载DLL。的然而强>
注入后,dll正在尝试LoadLibrary
(如果GetModuleHandle
失败)CRT dll。它们中有很多!
你有一些选择:
在您的Injector(资源,字节码等)中包含所需的DLL,并将它们写入目录
从互联网上的服务器下载DLL并将其放在目录中运行游戏
静态链接CRT(注入的DLL)也有效,但你必须确保你也得到所有的依赖!
您需要在运行游戏的文件夹中包含所需的DLL的原因是因为LoadLibrary
调用将从Game.exe
本身明确发出,并且它只会查找该目录中的DLL。
您可以选择将运行时调试程序(如WinDbg)附加到注入的DLL,在DLL入口点(无论您身在何处)设置断点。然后检查加载DLL时调用的LoadLibrary / GetModuleHandle调用类型,这将为您提供有关所需DLL的提示!
这里的问题是因为你的朋友没有安装Visual-C++ Redistributables
,许多CRT文件也有自己的依赖!您的注入器必须有一个Win-Installer,而Win-Installer又可以从Microsoft网站安装可再发行的MSI,这是一种适用于许多现代游戏(安装时)的技术。
答案 2 :(得分:2)
尝试按照项目设置进行操作
C / C ++运行时库:多线程/ MT - 正如您已经拥有的那样。
C / C ++代码生成 - >基本运行时检查 - >如果您的设置中还有其他内容,则为“默认”。
链接器 - >清单文件 - >生成清单“否”
清单工具 - >输入和输出 - >嵌入清单 - > “没有”。
还使用和Check with Dependency walker查找哪个DLL链接到您的EXE“调试DLL”。