用VC2010以上版本编译可以在低版本XP和2003的运行程序的方法

2013-09-17   作者:佚名   来源:本站整理   浏览:2001   评论:1

一直以来倍受此事困拢,vc2010以上版本编译出的exe或dll总是会引用kernel32.dll的EncodePointer和DecodePointer两个api,这两个api在xp sp2以下版本上找不到,虽然这种版本用户较少,但总有人在用,微软这贱人又不考虑这种低端用,无奈之下,我用过3种方法,记录如下。

1、使用vc2008的库,用2010的编译器。这种方法需要先找一份vc2008的库,而且在工程设置里面把默认的引用路径改为2008库的路径就好。

2、安装一个vc2008版本,然后在2010的工程设置把平台工具集设为"v90"即可,这种方式兼容性最好,但不能用最新的c++语法,如auto等

3、这是刚发现的,长期以来用上面两种方法,很不方便,尤其是第二种,需要装两个vs,痛苦万分,今天下决心再找一种简单的方式,于是在stackoverflow上搜到了这篇文章

http://stackoverflow.com/questio ... udio-2008s-c-runtim

这种方法相对较简单,用fasm下面这段代码编译为一个obj,然后再用link链接成一个lib,最后在vc工程里最先引用这个lib即可


1

2

3

4

5

6

7

8

9

10

11

12

13

14

use32

format ms coff

section ".data" data

public [email protected]

[email protected] dd dummy

public [email protected]

[email protected] dd dummy

section ".text" code

dummy:

mov eax, [esp+4]

retn 4

这种方法简单多了,vs2010和vs2012都通用,再也不用带着一个巨大无比的vc2008库,并且可以使用最新的c++语法

附加方法:

首先生成一个crack.asm文件,内容如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

.model flat

.data

[email protected] dd dummy

[email protected] dd dummy

EXTERNDEF [email protected] : DWORD

EXTERNDEF [email protected] : DWORD

.code

dummy proc

mov eax, [esp+4]

ret 4

dummy endp

end

然后进入VS2010的命令行模式,一定要进入VS2010的命令行模式,不能简单的执行cmd,废话少说,继续,执行以下命令编译crack.asm:
ml -c crack.asm
编译完得到crack.obj

第三步,将得到的crack.obj添加到需要支持Windows 2000的项目里,直接添加即可,无需其他配置。编译后用depends看一下对kernel32的依赖,发现已经没有了EncodePointer和DecodePointer的依赖。

如果不习惯使用obj文件,也可以用以下命令将obj编成lib文件:
lib crack.obj
将得到的crack.lib文件添加到项目中即可,但必须确保链接顺序先于kernel32.lib。

如果运行时出现不是合法的Win32程序,注意以下两处:
1. targetver.h文件中的_WIN32_WINNT值,VS2010默认使用SDK的最高版本,需要手动改为需要的版本:
#define _WIN32_WINNT 0x0500
#include <SDKDDKVer.h>
2. Minimum Required Version,此设置影响PE文件头中的VERSION信息,VS2010默认设置为5.1,需要手动改为需要的版本:
对于Win2000为 5.0

时间: 2025-01-06 22:00:48

用VC2010以上版本编译可以在低版本XP和2003的运行程序的方法的相关文章

如何将access高版本数据库保存为低版本的?

打开高版本的access,点击打开,选择数据库文件,当前对话框中打开按钮旁边有个小的下拉三角形,点开,点击以独占的方式打开. 打开数据库后在[文件]/[保存并发布]选择低版本的数据库. #access 如何将access高版本数据库保存为低版本的?

SqlServer高版本数据本分还原到低版本方法

最近遇见一个问题: 想要将Sqlserver高版本备份的数据还原到低版本SqlServer上去,但是这在SqlServer中是没法直接还原数据库的,所以经过一系列的请教总结出来一下可用方法. 首先.你得在电脑上装有你将要操作的高版本以及低版本的SqlServer或者你能够连上SqlServer高版本所在的数据库(便于后面拷贝数据), 第二步.打开高版本数据库中你需要备份的数据库,将你备份的数据库相关的登录名或者用户删除.右键数据库->任务->生成脚本.在生成脚本的“选择对象”步骤选择“编写整个

如何把高版本的sqlserver 还原到低版本的 sqlserver

原文:如何把高版本的sqlserver 还原到低版本的 sqlserver 本例为sql2012 还原到sql2008. 要实现的功能是把sql2012的数据库备份到sql2008,数据库名字为Test,并且这两个数据库在不同的电脑中. 微软的软件设计方案基本上都是新版本兼容旧版本,旧版本不兼容新版本 步骤如下: 1.首先把要把sql2012中要备份的数据库设置为兼容2008. 右键sql2012中的数据库Test-属性-选项  看到如下图: 2.右键Test-任务-生成脚本,下一步-下一步到达

Lua501版本编译tolua5.2.4版本的问题解决记录

mac系统自带的lua501,位于/usr/local/include和/usr/local/lib下. tolua5.2.4是在官网上下载的,其中需要修改以下几个地方: 打开/usr/local/include/lua.h,增加一行: 42 /* thread status; 0 is OK */ 43 #define LUA_OK 0 //新增的一行 44 #define LUA_YIELD 1 45 #define LUA_ERRRUN 2 46 #define LUA_ERRSYNTAX

Oracle 数据迁移(从Oracle11G高版本迁移到Oracle10G低版本)

1,数据库状况    生产环境是11G,linux系统,测试环境是10G,windows系统,需要从生产环境导出一个用户下所有的数据,导入测试环境中.    因为数据量比较小,准备采用EXP和IMP工具来做. 2,在生产环境上导出用户数据    命令:       exp \'system/syspl as sysdba\' owner=PLAS buffer=10240000 FILE=/tmp/PLAS_20141113.DMP 执行过程:[[email protected] ~]$  ex

高版本的xcode使用低版本的Simulator

1.打开xcode5.0的目录:Finder中点击“应用程序”,找到xcode,右击选择“显示包内容”,进入“Contents—Developer—Platforms—iPhoneOS.platform—Developer—SDKs”2.加载xcode4.6的安装包,同样“显示包内容”,定位到与上方(1)相同目录,将其中的“iPhoneOS6.1.sdk”,复制到xcode5.0的上方目录中3.打开xcode5.0的Contents—Developer—Platforms—iPhoneSimul

xcode7/ios9中 低版本app运行时,屏幕上下出现黑边的问题

xcode从低版本升级至 7.0或更高版本后,某些低版本app再次编译运行后,发现app在设备上运行时,会在上端和底部 出现黑边的现象.这导致app的展示界面跟缩水了一样,变得十分丑陋. 对于这一问题,找度娘,没找到类似的解决方案.有人说 将低版本中的xcode包内容里的 platform 添加至高版本的xcode的platform中,即可解决.但本人亲自测试后,发现依然没有生效. 现给出一个自己成功解决的方案: 选中target——>general——>app icons and launc

matchesSelector及低版本IE中对该方法的实现

matchesSelector用来匹配dom元素是否匹配某css selector.它为一些高级方法的实现提供了基础支持,比如事件代理,parent, closest等. W3C在2006年就提出了该方法草案,Firefox和Safari相继实现,比如 ? 1 2 3 4 5 6 <div id="wraper" class="item"></div> <script>     wraper.mozMatchesSelector(

自动检测ie低版本,并显示升级浏览器的自定义页面,当用f12再把浏览器版本提高的时候,又会自动显示正常的页面。

代码: <!--[if lte IE 9 ]> <div class=""> 这里面可以添加自己定义的内容 </div> <script type="text/javascript"> 这里也可以添加自定义的js alert("浏览器版本过低"); window.stop ? window.stop() : document.execCommand("Stop"); </s