zoukankan      html  css  js  c++  java
  • 用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 __imp__DecodePointer@4
    __imp__DecodePointer@4 dd dummy
     
    public __imp__EncodePointer@4
    __imp__EncodePointer@4 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
    __imp__EncodePointer@4 dd dummy
    __imp__DecodePointer@4 dd dummy
    EXTERNDEF __imp__EncodePointer@4 : DWORD
    EXTERNDEF __imp__DecodePointer@4 : 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

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/aloneblog/p/6143304.html
Copyright © 2011-2022 走看看