#firefox #dll #firefox-addon #pkcs#7 #nss
#firefox #dll #firefox-дополнение #pkcs #7 #nss
Вопрос:
Я новичок в разработке расширений Firefox.
Мы получили расширение firefox, которое подписывает PDF (инкапсулированная подпись), работающее для всех версий Firefox до 22 (22 не включены) С использованием NSS 3.12. После этой версии Firefox в используемом им NSS происходит модификация. Это расширение является расширением JS, вызывающим функции C с использованием ctypes.
Моя цель — заставить это расширение работать на версии firefox, превосходящей 22.
Я получил в своих библиотеках расширений nspr4.dll , nss3.dll , nssutil3.dll , plc4.dll , plds4.dll сгенерировано с помощью mozilla-сборки из выпуска NSS.
полученный нами код очень похож на тот, что вы можете найти здесь :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_PKCS7Encode, используя пустой SEC_PKCS7ContentInfo (с помощью SEC_PKCS7CreateData()), и это не привело к сбою. Сбой происходит только при заполнении SEC_PKCS7ContentInfo.
После некоторых проверок я нахожу эту проблему: https://bugzilla.mozilla.org/show_bug.cgi?id=702307 Я не знаю, является ли эта проблема причиной сбоя моего Firefox.
Я пытался использовать другую версию NSS (3.12, 3.15, 3.16.2), результаты точно такие же.
Есть ли какой-нибудь способ избежать этой проблемы? есть ли способ закодировать мой SEC_PKCS7ContentInfo без использования SEC_PKCS7Encode?
заранее спасибо.
РЕДАКТИРОВАТЬ 07.11.2014
Как упоминал nmaier в is response, проблема, по-видимому, заключается в использовании двух разных NSS (даже если это одна и та же версия nss, потому что, например, в mozilla разные зависимости).
Подпись (и другие процессы) выполняются в проекте C (Dll, используемая моим расширением, сгенерирована из этого проекта с помощью Visual studio 2013). Но для компиляции и сборки DLL проект должен иметь библиотеки NSS и includes (это вполне нормально, я использую методы NSS в своем проекте). Главный вопрос в том, как я могу ссылаться на библиотеки NSS MOZILLA FIREFOX и включать. Я скомпилировал NSS той же версии NSS Firefox, но зависимости разные. Я также пытался получить исходные файлы FireFox и скомпилировать его NSS с помощью mozilla build, но я получил ошибки. Если я смогу получить библиотеки NSS Firefox, я мог бы просто загрузить NSS dll Firefox в свое расширение.
Как я могу использовать библиотеки NSS Mozilla Firefox в моем проекте на C для создания моей пользовательской библиотеки DLL с использованием правильных библиотек?
Комментарии:
1. Вы, конечно, имеете в виду
C
функции, а неC
functions (ctypes не поддерживает последнее)?
Ответ №1:
Я бы ожидал, что это будет неправильно: Firefox уже загружает nss и зависимые библиотеки. Попытка загрузить «ту же» DLL снова, но в другой версии приведет к тому, что загрузчик DLL разрешит зависимый импорт, используя экспорт из первоначально загруженной DLL, поставляемой с Firefox, а не ваши копии более старых версий той же библиотеки DLL. И эта смесь нового и старого затем ломается и вылетает.
Вы должны:
- В первую очередь не создавать и отправлять библиотеки DLL…
- но используйте библиотеки DLL, с которыми Firefox уже поставляется. (например, см.
WeaveCrypto.js
) - Обновите свои
ctypes
вызовы, если используемый им nss API изменился за это время. - Убедитесь, что ваши
ctypes
объявления верны и по-прежнему актуальны.
Комментарии:
1. Спасибо за ваш ответ. На самом деле у меня уже есть проект на C , который использует NSS и выполняет весь процесс, который я хочу. Моя среда разработки — Visual Studio 2010. Проблема в том, что я не знаю, как ссылаться на NSS Firefox в моем проекте, который генерирует DLL. Он принимает только библиотеки NSS, которые включены в мой проект, поэтому я могу ссылаться только на самодельные встроенные NSS (с помощью mozilla build) (у меня нет библиотек и включений встроенной NSS DLL firefox).
2. Я не уверен, что я это понял… У вас есть пользовательская DLL, которая связывает библиотеки nss. И ctypes будут взаимодействовать с этой пользовательской DLL, но не с библиотеками nss напрямую?
3. Точно, пользовательская DLL выполняет всю подпись и спецификацию процесса, вызывающего NSS, но для сборки этой DLL я должен ссылаться в visual Studio (мой инструмент сборки) на библиотеки NSS.
Ответ №2:
Я сделал это.
Чтобы указать NSS firefox в моем проекте, мне пришлось собрать весь Firefox с помощью mozilla-build tool, а затем восстановить библиотеки и включить for внутри каталога OBJ.
это сгенерирует мой проект как DLL, который ссылается на исправную версию DLL.
(я думаю, это не лучшее решение, поскольку между Firefox 21 и 22 происходит изменение NSS NSS, поэтому мое решение будет работать только для firefox между 22 и следующей версией Firefox, которые включают изменения NSS.)