vc2005 编译的程序将链接到msvcr80.dll,vc2008 编译的程序将链接到msvcr90.dll。程序在未安装vc2005或vc2008运行库的机器上将无法运行。
微软给出的答案是只能连接到msvcrxx.dll,而且必须安装运行库,拷贝的不行。
你可以使用vc6或是其他编译器,或者用汇编写程序。
或者你可以用下边的方法:
不管是下载还是拷贝得到WDK中的msvcrt_winxp.obj和msvcrt.lib,加入到项目/属性/连接器/输入/附加依赖项或直接加入到命令行,版本选Release(因为Debug版会从msvcr90.dll导入一个辅助函数),然后编译。使用工具查看文件的导入,只有msvcrt,没有了msvcr90。
但是这样编译的文件在没有vc2005或2008运行库的系统上仍然不能运行!
这是因为manifest文件的缘故,你可以有两种选择,一是不使用manifest文件,而是使用下面的清单资源RC文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="XP Style Manifest"
processorArchitecture="x86"
version="5.1.0.0"
type="win32"/>
<description>Windows Shell</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
这是一种较好的方法,可以保证最大的兼容性。VISTA中的MSvcrt.DLL已经实现了MSvcr80.dll中的大部分功能,包括很多带_s
的安全字符串处理函数,如果你在程序中使用了这些函数,则只能在vista中运行,否则会报错。
其他还有很多方法,比如用VC6中的Msvcrt.Lib替换vc2008中的msvcrt.lib,但需要手工加入CxxFrameHandler3和CheckCookie@4或者不使用这些特性。如果你想使用msvcr90.dll又不想安装它,可以通过删除manifest文件中的publicKeyToken字段使它可以放在程序目录中使用。如果你连manifest文件都不想要,可以自己编译一个运行库代替它,或者用二进制编辑软件修改
msvcr80.dll
00001D76 -> B8 01 00 00 00 C3
msvcr90.dll
000021be -> B8 01 00 00 00 C3
B8 01 00 00 00 C3 == mov eax,0001 retn
作用是取消了运行库的_check_manifest 函数
[课程]FART 脱壳王!加量不加价!FART作者讲授!