• 用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

  • 相关阅读:
    hdu 2176 取(m)石子游戏
    hdu 3549 Flow problem
    hdu 3665 Seaside floyd+超级汇点
    hdu 六度分离 floyd
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1963 Investment 多重背包
    初探数据结构
    Java IO 类一览表
    Java 代码重用:功能与上下文重用
    Java Try-with-resources
  • 原文地址:https://www.cnblogs.com/aloneblog/p/6143304.html
Copyright © 2020-2023  润新知