2014-07-04 92 views
1

我是Firefox擴展開發的新手。Firefox擴展崩潰使用NSS

我們得到了一個firefox擴展,在22(22不包括)使用NSS 3.12之前,爲所有版本的firefox簽署PDF(封裝簽名)。在那之後的Firefox版本中,它所使用的NSS被修改了。 這個擴展是一個使用ctypes調用C++函數的JS擴展。

我的目標是讓Firefox的版本優於此擴展工作22

我在擴展庫得到nspr4.dll,nss3.dll,nssutil3.dll,plc4.dll,plds4.dll與生成從NSS發佈mozilla構建。

我們得到的代碼非常相似,你可以找到在這裏:https://github.com/metajack/nss/blob/master/cmd/p7sign/p7sign.c

代碼工作井(它成功地獲取證書的信息,創建SEC_PKCS7ContentInfo與SEC_PKCS7CreateSignedData(...),設置它的內容與SEC_PKCS7SetContent(..),包括證書鏈) 直到SEC_PKCS7Encode的調用。當使用這種方法時,fireFox崩潰。

我用WinDBG中獲得堆棧跟蹤,這裏是我得到了什麼:

******************************************************************************* 
*                    * 
*       Exception Analysis        * 
*                    * 
******************************************************************************* 


FAULTING_IP: 
plds4!PL_HashTableLookupConst+c 
721b1c7c 8b4f0c   mov  ecx,dword ptr [edi+0Ch] 

EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) 
.exr 0xffffffffffffffff 
ExceptionAddress: 00000000721b1c7c (plds4!PL_HashTableLookupConst+0x000000000000000c) 
    ExceptionCode: c0000005 (Access violation) 
    ExceptionFlags: 00000000 
NumberParameters: 2 
    Parameter[0]: 0000000000000000 
    Parameter[1]: 000000000000000c 
Attempt to read from address 000000000000000c 

CONTEXT: 0000000000000000 -- (.cxr 0x0;r) 
.cxr 0x0;r 
eax=063e7b90 ebx=00000000 ecx=dd4c128b edx=063e7c98 esi=063e7b90 edi=00000000 
eip=721b1c7c esp=0067c1e8 ebp=063e7898 iopl=0   nv up ei pl nz na pe nc 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00210206 
plds4!PL_HashTableLookupConst+0xc: 
721b1c7c 8b4f0c   mov  ecx,dword ptr [edi+0Ch] ds:002b:0000000c=???????? 
.cxr 

FAULTING_THREAD: 00000000000016cc 

PROCESS_NAME: firefox.exe 

ERROR_CODE: (NTSTATUS) 0xc0000005 - L 

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - L 

EXCEPTION_PARAMETER1: 0000000000000000 

EXCEPTION_PARAMETER2: 000000000000000c 

READ_ADDRESS: 000000000000000c 

FOLLOWUP_IP: 
plds4!PL_HashTableLookupConst+c 
721b1c7c 8b4f0c   mov  ecx,dword ptr [edi+0Ch] 

APPLICATION_VERIFIER_FLAGS: 0 

APP: firefox.exe 

ANALYSIS_VERSION: 6.3.9600.17029 (debuggers(dbg).140219-1702) amd64fre 

BUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_READ_ZEROED_STACK 

PRIMARY_PROBLEM_CLASS: NULL_CLASS_PTR_READ 

DEFAULT_BUCKET_ID: NULL_CLASS_PTR_READ 

LAST_CONTROL_TRANSFER: from 00000000716b9231 to 00000000721b1c7c 

STACK_TEXT: 
WARNING: Stack unwind information not available. Following frames may be wrong. 
0067c1f4 716b9231 00000000 063e7b90 063e7ca0 plds4!PL_HashTableLookupConst+0xc 
00000000 00000000 00000000 00000000 00000000 nssutil3!SECOID_FindOIDTag_Util+0x11 


STACK_COMMAND: .cxr 0x0 ; kb 

SYMBOL_STACK_INDEX: 0 

SYMBOL_NAME: plds4!PL_HashTableLookupConst+c 

FOLLOWUP_NAME: MachineOwner 

MODULE_NAME: plds4 

IMAGE_NAME: plds4.dll 

DEBUG_FLR_IMAGE_TIMESTAMP: 53a04c1e 

FAILURE_BUCKET_ID: NULL_CLASS_PTR_READ_c0000005_plds4.dll!PL_HashTableLookupConst 

BUCKET_ID: 
APPLICATION_FAULT_NULL_CLASS_PTR_READ_ZEROED_STACK_plds4!PL_HashTableLookupConst+c 

ANALYSIS_SOURCE: UM 

FAILURE_ID_HASH_STRING:       um:null_class_ptr_read_c0000005_plds4.dll!pl_hashtablelookupconst 

FAILURE_ID_HASH: {2f7bb160-6820-dd99-35e3-03bb56e8aca4} 

Followup: MachineOwner 
--------- 

這意味着調用SEC_PKCS7Encode時,它調用PLDS4.DLL了一種方法,讓Firefox崩潰。

我試圖使用一個空的SEC_PKCS7ContentInfo(與SEC_PKCS7CreateData())調用SEC_PKCS7Encode並且它沒有崩潰。它僅在SEC_PKCS7ContentInfo被填充時崩潰。

經過一番研究,我發現這個問題:https://bugzilla.mozilla.org/show_bug.cgi?id=702307 我不知道這個問題是什麼讓我的Firefox崩潰。

我試圖使用不同版本的NSS(3.12,3.15,3.16.2),結果是完全一樣的。

有沒有辦法避免這個問題?有沒有辦法編碼我的SEC_PKCS7ContentInfo而不使用SEC_PKCS7Encode?

在此先感謝。

編輯2014年11月7日

如前所述的是響應nmaier,該probleme似乎是兩個不同的NSS(的利用率,即使它是NS的相同版本,因爲一個在Mozilla已經不同例如依賴關係)。

簽名(和其他進程)在C++項目中完成(我的擴展使用的Dll是使用visual studio 2013從此項目生成的)。但爲了編譯和構建DLL,項目必須具有NSS庫幷包含(這很正常,我在我的項目中使用了NSS方法)。 主要問題是我如何參考MOZILLA FIREFOX NSS庫和包括。我編譯了相同版本Firefox的NSS的NSS,但是依賴關係不同。 我也嘗試獲取FireFox源代碼並使用mozilla編譯編譯它的NSS,但是出現錯誤。如果我能得到Firefox的NSS庫,我可以在我的擴展中加載Firefox的NSS dll。

如何在我的C++項目中引用Mozilla firefox的NSS庫以使用正確的庫構建我的自定義DLL?

+0

你當然是指C函數,而不是'C++'函數(ctypes不支持後者)? – nmaier

回答

1

我做到了。

爲了在我的項目中指定firefox的NSS,我必須使用mozilla-build工具構建一個完整的Firefox,然後恢復這個Lib幷包含在OBJ目錄中。

這將生成我的項目作爲DLL,它引用了良好的DLL版本。 (這不是我認爲的最好的解決方案,因爲Firefox 21和22之間存在NSS的NSS變化,所以我的解決方案只適用於22和包含NSS更改的Firefox的下一個版本之間的Firefox。 )

+0

感謝分享:) – Noitidart

1

我認爲這會變得不合時宜:Firefox已經加載了nss和依賴庫。試圖再次加載「相同的」DLL,但使用不同的版本將導致DLL加載程序使用Firefox自帶的最初加載的DLL的導出來解析相關的導入,而不是同一個DLL的舊版本的副本。而這些新東西和舊東西的混合則會打破並崩潰。

您應該:

  • 不建在首位船的DLL ...
  • ,但使用的Firefox已經自帶的DLL文件。 (例如,參見WeaveCrypto.js
  • 如果在此期間使用的nss API發生更改,則更新您的​​調用。
  • 確保您的​​聲明正確並且仍然是最新的。
+0

感謝您的回覆。事實上,我已經有了一個C++項目,它使用NSS並完成我想要的所有過程。我的IDE是Visual Studio 2010.問題是我不知道如何在生成DLL的項目中引用Firefox NSS。它只接受NSS庫中的dans包含在我的項目中,所以我只能引用自制的內置NSS(帶有mozilla構建)(我沒有libs幷包含firefox內置的NSS DLL)。 – brosini

+0

我不知道我是那麼...你有一個自定義的DLL鏈接nss庫。 ctypes會與該自定義DLL進行交互,但不會直接與nss庫進行交互? – nmaier

+0

準確地說,自定義DLL會執行所有調用NSS的簽名和特定過程,但爲了構建該DLL,我必須在Visual Studio(我的構建工具)中引用NSS庫。 – brosini