MyMSDN

MyMSDN记录开发新知道

如何编译TrueCrypt源码

相关配置

       
  • Intel x86 Core 2 Duo
  •    
  • Windows 7 Ultimate x86 version
  •    
  • Windows Driver Develop Kit 7600.16385.0
  •    
  • TrueCrypt 6.3a Source.zip
  •    
  • Microsoft Visual Studio 2008 SP1 (VC++ 2008)
  •    
  • Microsoft Visual Studio VC++ 1.52
  •    
  • NASM version 2.07 compiled on Jul 19 2009
  •    
  • gzip 1.2.4 Win32 (02 Dec 97)
  •    
  • ......

配置TrueCrypt

  1. 下载MSVC++ 1.52,安装在C盘下:C:\MSVC
  2. 下载NASM,也安装在C盘下:C:\NASM
    http://www.nasm.us/pub/nasm/releasebuilds/2.07/win32/
  3. 下载GZIP,也安装在C盘下:C:\gzip
  4. 下载并安装WINDDK,http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
    我将它们安装在D盘,路径:D:\WinDDK
  5. 设置系统变量((WIN7)控制面板\所有控制面板项\系统\高级系统设置\环境变量):系统变量中,新增:
    变量1:MSVC16_ROOT    值:C:\MSVC
    变量2:WINDDK_ROOT    值:D:\WinDDK\7600.16385.0
    其中7600.16385.0为WinDDK的第二级目录名,同时也是版本号,7600是Windows7的发行版本号。
    双击变量:PATH,在其值的末尾补上:C:\NASM;C:\gzip
    目的是为了让我们可以直接在命令行实用nasm以及gzip作为命令行。
  6. 下载PKCS11,三个文件,右键另存为即可。
    http://svn.openvpn.net/projects/openvpn/test/time/openvpn/pkcs11-headers/
    将三个文件(pkcs11.h、pkcs11f.h、pkcs11t.h)拷贝到源码下的Common文件夹下,我的源码放在D盘根目录,三个源码我就放在“D:\TrueCrypt\Common”文件夹中。
  7. 编译,会发现有两个错误。
    CKR_NEW_PIN_MODE和CKR_NEXT_OTP未定义,补充定义一下即可。
    在d:\TrueCrypt\Common\pkcs11t.h文件里(请根据您自己的路径进行复制)
    这里将它们设置为:
    #define CKR_NEW_PIN_MODE      0x000001B0
    #define CKR_NEXT_OTP          0x000001B1
    我的方法是找到实用它的语句附近的同类语句,找到相同的定义,在其下方添加。
    比如:
                TC_TOKEN_ERR (CKR_MUTEX_NOT_LOCKED)
                TC_TOKEN_ERR (CKR_NEW_PIN_MODE)
                TC_TOKEN_ERR (CKR_NEXT_OTP)
    这三句话放在一起,后两句有问题,但第一句正常,则查找CKR_MUTEX_NOT_LOCKED的存放位置,在其下方添加如上两句,其中定义的值参考
    http://www.cryptsoft.com/pkcs11doc/STANDARD/include/v220/otp-pkcs11.h,这里的值只不过是一种错误码,只要它不重复,就可以了。
  8. 再编译,可能会遇到一些警告:
    1. nasm.exe正在停止,而因为没有正确执行,又导致“fatal error LNK1136: invalid or corrupt file”错误。
      遇到这个可能是因为你的nasm正在试图编译ase_amdX64.asm文件,而nasm对64位的asm编译对你可能意义不大,起码对我而言是这样的,于是,我就将它转成编译x86体系架构的,也许是因为参数配置的问题,你可以尝试别的方案,如果有更好的话,请告诉我。
      这里我搜索:x64、asm等关键字,修改d:\TrueCrypt\Crypto\Makefile.inc文件为下面这样即可:
      行1    !if "$(TC_ARCH)" == "x86"
      行2    TC_OBJ_FORMAT = win32
      行3    !else
      行4    #TC_OBJ_FORMAT = win64
      行5    #edit by gocool, if the x64 system need the nasm.exe use the x64 format parameters for executing.
      行6    #abort the x64 system here for building.
      行7    #2009/12/23
      行8    TC_OBJ_FORMAT = win32
      行9    TC_ARCH = x86
      行10    !endif
      行11   
      行12    "$(OBJ_PATH)\$(O)\Aes_$(TC_ARCH).obj": Aes_$(TC_ARCH).asm
      行13        nasm.exe -Xvc -f $(TC_OBJ_FORMAT) -Ox -D DLL_EXPORT -o "$@" -l "$(OBJ_PATH)\$(O)\Aes_$(TC_ARCH).lst" Aes_$(TC_ARCH).asm
      其中,为了减少变化量,也利于以后恢复,第4-7行为注释,第8、9行我将非x86的情况也定义成x86的情况,这样无论如何下面第13行的语句都将执行以x86体系为结构的设置,而这样的设置通常是正确的。
    2. fatal error LNK1000: Internal error during IncrBuildImage
      据说是Microsoft Visual Studio 2008的一个BUG。http://blog.csdn.net/just_one_two/archive/2009/10/05/4634391.aspx
      听说有两种方法,一种是方法1,需要下载补丁,我没有尝试。第二种通过修改配置的方法我成功了,步骤如下:
      方法:项目->属性->链接器->常规   下面的“启用增量链接”,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”。
      不过这又引入了另外一个警告:3>FormatCom.obj : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/INCREMENTAL:NO”规范)
      选择项目,属性->配置属性->C/C++,修改“调试信息格式”为“程序数据库(/Zi)”即可。
    3. 警告:未找到下列环境变量
      4>项目 : warning PRJ0018 : 未找到下列环境变量:
      4>$(PKCS11_INC)
      由于项目属性里设置有附加包含目录“$(PKCS11_INC)”,因此编译的时候会在系统变量里寻找PKCS11_INC项目,如果找不到,则给出警告,因此,我们需要手动补充这个项。方法同步骤5,增加一个变量为PKCS11_INC,值:D:\TrueCrypt\Common,其中,值就是之前我们拷贝三个文件(pkcs11.h、pkcs11f.h、pkcs11t.h)的目录。
    4. 如果不出意外的话,你可能还会得到一个使用了PKEY_AppUserModel_ID未定义的声明符的错误。这个是用于标识用户态应用程序的唯一标识。你可以在Setup.h文件中定义:
      /*---region add by gc---*/
      #include "wtypes.h"
          const PROPERTYKEY PKEY_AppUserModel_ID = {
              {
                  (unsigned long)2009,/*unsigned long  Data1;*/
                  (unsigned short)12,/*unsigned short Data2;*/
                  (unsigned short)23,/*unsigned short Data3;*/
                  0x44,0x55,0x55,0x55,0x55,0x55,0x55,0x55
              },/*GUID fmtid;*/
              (DWORD)PID_FIRST_USABLE /*DWORD pid;*/
          };
      /*---endregion---*/
      其中,这个结构体是由GUID和PID共同组成的。

下载链接

  • TrueCrypt下载:http://www.sfr-fresh.com/windows/misc/TrueCrypt-6.2a-Source.zip:a/Boot/Windows/Makefile
  • WinDDK下载:http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
  • PKCS11下载:http://svn.openvpn.net/projects/openvpn/test/time/openvpn/pkcs11-headers/
  • GZip下载:http://www.gzip.org/ 或者 http://www.gzip.org/gz124src.zip
  • Nasm下载:http://www.nasm.us/pub/nasm/releasebuilds/2.07/win32/
  • MSVC1.52下载:http://download.csdn.net/source/620960 (15.02MB)(似乎网上很多人都在找1.52(最后一个可以编译16bit程序的VC编译器),但官方网站上没有公开下载的链接,实在非常郁闷,我从MSDN订阅下载(收费的噢,杯具)则有67.6MB),如果大家实在找不到下载或者15.02MB的不可用,可以联系我。

  • 参考链接

    • http://blog.csdn.net/skyremember/archive/2009/09/17/4562090.aspx
    • http://blog.sina.com.cn/s/blog_4758691d0100d8mc.html
    • http://lll332.blog.163.com/blog/static/1553692220093404635752/
    • http://msdn.microsoft.com/en-us/library/aa373931%28VS.85%29.aspx
    • http://hi.baidu.com/hhacker/blog/item/2fc5b3fb0b24132a4f4aea1d.html
    • http://blog.csdn.net/just_one_two/archive/2009/10/05/4634391.aspx
    • http://blog.csdn.net/liufei_learning/archive/2009/12/21/5047632.aspx
    • http://msdn.microsoft.com/zh-cn/library/958x11bc%28VS.80%29.aspx
    • http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=22&topic=498

    posted on 2009-12-23 23:47 volnet 阅读(5832) 评论(10)  编辑 收藏 引用 所属分类: 知识库(KnowledgeLibrary)C/C++

    评论

    # re: 如何编译TrueCrypt源码 2010-02-26 10:08 gengjl

    我build solution是出现错误:

    1>Linking...
    1>'gzip.exe' 不是内部或外部命令,也不是可运行的程序
    1>或批处理文件。
    1>NMAKE : fatal error U1077: 'gzip.exe' : return code '0x1'
    1>Stop.

    我在http://www.gzip.org/找不到windows版的exe,只有MSDOS版的,我下载了,放到C:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录,编译通过。这样做对吗?

      回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-03-07 13:48 jeffreyLi

    参考我写的文章
    http://blog.csdn.net/arrowrain  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-03-12 14:23 azunite

    这里为什么会去自声明一个PKEY_AppUserModel_ID ? 是不是我们编译还有那块没加进来 ,, ??  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-03-12 16:19 volnet

    @azunite
    这个是一个GUID,这个ID需要我们自行定义  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-03-12 16:19 volnet

    @gengjl
    这样做没错  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-03-23 14:11 aa

    ------ Building truecrypt.sys: Debug x86 ------
    1>Crypto.lib(aes_x86.obj) : error LNK2026: module unsafe for SAFESEH image.
    1> Creating library c:\truecrypt\driver\obj_driver_debug\i386\truecrypt.lib and object c:\truecrypt\driver\obj_driver_debug\i386\truecrypt.exp
    1>c:\truecrypt\driver\obj_driver_debug\i386\truecrypt.sys : fatal error LNK1281: Unable to generate SAFESEH image.
    1>BuildDriver.cmd: error: Cannot copy target.


    如何解决  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-03-23 15:11 楼主

    @aa
    试试在源码中搜索一下:SAFESEH  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-06-03 21:56 如此冷清

    学习了~~~  回复  更多评论   

    # re: 如何编译TrueCrypt源码 2010-08-01 14:40 nero

    我下载的是7.0的源码,一大堆错误,该怎么办啊?
    ==========================================

    错误 1 error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行自定义生成步骤" Crypto Crypto
    错误 2 fatal error U1077: “nasm.exe”: 返回代码“0x1” NMAKE Boot
    错误 3 fatal error U1077: “nasm.exe”: 返回代码“0x1” NMAKE Boot
    错误 4 fatal error LNK1104: 无法打开文件“..\Crypto\Debug\crypto.lib” Format Format
    错误 5 fatal error LNK1104: 无法打开文件“..\Crypto\Debug\crypto.lib” Mount Mount
    错误 6 fatal error LNK1181: cannot open input file 'd:\truecrypt7.0source\crypto\obj_driver_debug\i386\aes_x86.obj' Driver Driver
    错误 7 fatal error LNK1181: cannot open input file 'd:\truecrypt7.0source\crypto\obj_driver_debug\i386\aes_x86.obj' Driver Driver
    错误 8 fatal error LNK1181: cannot open input file 'd:\truecrypt7.0source\crypto\obj_driver_debug\amd64\aes_x64.obj' Driver Driver
    错误 9 fatal error LNK1181: cannot open input file 'd:\truecrypt7.0source\crypto\obj_driver_debug\amd64\aes_x64.obj' Driver Driver
      回复  更多评论   

    # re: 如何编译TrueCrypt源码 2012-02-08 14:55 cdld

    对于问题“PKEY_AppUserModel_ID“,做如下修改即可

    #define INITGUID
    #include <propkey.h>
    #undef INITGUID  回复  更多评论   


    只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


    特殊功能