如何编译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

猜你喜欢

转载自blog.csdn.net/bruce135lee/article/details/80541234