如何編譯TrueCrypt源碼
相關(guān)配置
- 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
- 下載MSVC++ 1.52,安裝在C盤(pán)下:C:\MSVC
- 下載NASM,也安裝在C盤(pán)下:C:\NASM
http://www.nasm.us/pub/nasm/releasebuilds/2.07/win32/ - 下載GZIP,也安裝在C盤(pán)下:C:\gzip
- 下載并安裝WINDDK,http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
我將它們安裝在D盤(pán),路徑:D:\WinDDK - 設(shè)置系統(tǒng)變量((WIN7)控制面板\所有控制面板項(xiàng)\系統(tǒng)\高級(jí)系統(tǒng)設(shè)置\環(huán)境變量):系統(tǒng)變量中,新增:
變量1:MSVC16_ROOT 值:C:\MSVC
變量2:WINDDK_ROOT 值:D:\WinDDK\7600.16385.0
其中7600.16385.0為WinDDK的第二級(jí)目錄名,同時(shí)也是版本號(hào),7600是Windows7的發(fā)行版本號(hào)。
雙擊變量:PATH,在其值的末尾補(bǔ)上:C:\NASM;C:\gzip
目的是為了讓我們可以直接在命令行實(shí)用nasm以及gzip作為命令行。 - 下載PKCS11,三個(gè)文件,右鍵另存為即可。
http://svn.openvpn.net/projects/openvpn/test/time/openvpn/pkcs11-headers/
將三個(gè)文件(pkcs11.h、pkcs11f.h、pkcs11t.h)拷貝到源碼下的Common文件夾下,我的源碼放在D盤(pán)根目錄,三個(gè)源碼我就放在“D:\TrueCrypt\Common”文件夾中。 - 編譯,會(huì)發(fā)現(xiàn)有兩個(gè)錯(cuò)誤。
CKR_NEW_PIN_MODE和CKR_NEXT_OTP未定義,補(bǔ)充定義一下即可。
在d:\TrueCrypt\Common\pkcs11t.h文件里(請(qǐng)根據(jù)您自己的路徑進(jìn)行復(fù)制)
這里將它們?cè)O(shè)置為:#define CKR_NEW_PIN_MODE 0x000001B0我的方法是找到實(shí)用它的語(yǔ)句附近的同類語(yǔ)句,找到相同的定義,在其下方添加。
#define CKR_NEXT_OTP 0x000001B1
比如:TC_TOKEN_ERR (CKR_MUTEX_NOT_LOCKED)這三句話放在一起,后兩句有問(wèn)題,但第一句正常,則查找CKR_MUTEX_NOT_LOCKED的存放位置,在其下方添加如上兩句,其中定義的值參考
TC_TOKEN_ERR (CKR_NEW_PIN_MODE)
TC_TOKEN_ERR (CKR_NEXT_OTP)
http://www.cryptsoft.com/pkcs11doc/STANDARD/include/v220/otp-pkcs11.h,這里的值只不過(guò)是一種錯(cuò)誤碼,只要它不重復(fù),就可以了。 - 再編譯,可能會(huì)遇到一些警告:
- nasm.exe正在停止,而因?yàn)闆](méi)有正確執(zhí)行,又導(dǎo)致“fatal error LNK1136: invalid or corrupt file”錯(cuò)誤。
遇到這個(gè)可能是因?yàn)槟愕膎asm正在試圖編譯ase_amdX64.asm文件,而nasm對(duì)64位的asm編譯對(duì)你可能意義不大,起碼對(duì)我而言是這樣的,于是,我就將它轉(zhuǎn)成編譯x86體系架構(gòu)的,也許是因?yàn)閰?shù)配置的問(wèn)題,你可以嘗試別的方案,如果有更好的話,請(qǐng)告訴我。
這里我搜索:x64、asm等關(guān)鍵字,修改d:\TrueCrypt\Crypto\Makefile.inc文件為下面這樣即可:行1 !if "$(TC_ARCH)" == "x86"其中,為了減少變化量,也利于以后恢復(fù),第4-7行為注釋,第8、9行我將非x86的情況也定義成x86的情況,這樣無(wú)論如何下面第13行的語(yǔ)句都將執(zhí)行以x86體系為結(jié)構(gòu)的設(shè)置,而這樣的設(shè)置通常是正確的。
行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 - fatal error LNK1000: Internal error during IncrBuildImage
據(jù)說(shuō)是Microsoft Visual Studio 2008的一個(gè)BUG。http://blog.csdn.net/just_one_two/archive/2009/10/05/4634391.aspx
聽(tīng)說(shuō)有兩種方法,一種是方法1,需要下載補(bǔ)丁,我沒(méi)有嘗試。第二種通過(guò)修改配置的方法我成功了,步驟如下:
方法:項(xiàng)目->屬性->鏈接器->常規(guī) 下面的“啟用增量鏈接”,將“是(/INCREMENTAL)”改為“否(/INCREMENTAL:NO)”。
不過(guò)這又引入了另外一個(gè)警告:3>FormatCom.obj : warning LNK4075: 忽略“/EDITANDCONTINUE”(由于“/INCREMENTAL:NO”規(guī)范)
選擇項(xiàng)目,屬性->配置屬性->C/C++,修改“調(diào)試信息格式”為“程序數(shù)據(jù)庫(kù)(/Zi)”即可。 - 警告:未找到下列環(huán)境變量4>項(xiàng)目 : warning PRJ0018 : 未找到下列環(huán)境變量:由于項(xiàng)目屬性里設(shè)置有附加包含目錄“$(PKCS11_INC)”,因此編譯的時(shí)候會(huì)在系統(tǒng)變量里尋找PKCS11_INC項(xiàng)目,如果找不到,則給出警告,因此,我們需要手動(dòng)補(bǔ)充這個(gè)項(xiàng)。方法同步驟5,增加一個(gè)變量為PKCS11_INC,值:D:\TrueCrypt\Common,其中,值就是之前我們拷貝三個(gè)文件(pkcs11.h、pkcs11f.h、pkcs11t.h)的目錄。
4>$(PKCS11_INC) - 如果不出意外的話,你可能還會(huì)得到一個(gè)使用了PKEY_AppUserModel_ID未定義的聲明符的錯(cuò)誤。這個(gè)是用于標(biāo)識(shí)用戶態(tài)應(yīng)用程序的唯一標(biāo)識(shí)。你可以在Setup.h文件中定義:/*---region add by gc---*/其中,這個(gè)結(jié)構(gòu)體是由GUID和PID共同組成的。
#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---*/
- nasm.exe正在停止,而因?yàn)闆](méi)有正確執(zhí)行,又導(dǎo)致“fatal error LNK1136: invalid or corrupt file”錯(cuò)誤。
下載鏈接
參考鏈接
- 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 閱讀(5950) 評(píng)論(10) 編輯 收藏 引用 所屬分類: 知識(shí)庫(kù)(KnowledgeLibrary) 、C/C++