реверсинг формата хранения учетных записей EmFTP

Discussion in 'Реверсинг' started by ProTeuS, 19 Mar 2008.

  1. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    забыл пас на один акк. надо было "вспомнить". вот и решил, 4то самым простым и эффективным способо будет проресер4ить

    алго хранения учетных записей и написать свой расшифровщик. исследуеммый софт: http://emftp.com/.
    при запуске ftp-клиента у4етки с сохраненными пасами автомати4ески коннектятся, зна4ит: 1. код сохранения и

    расшифровки пасов в исследуемом софте присутсует, 4то уже радует; 2. пасы где-то сохраняются и 4итаются при загрузке

    выполняемого файла софта.
    итого, проверяем в реестре и, не долго искав, находим клю4 HKEY_CURRENT_USER\Software\Emurasoft\Emftp\Config, в

    котором хранятся подклю4и, каждый из которых соотвествует нужному аккаунту (т.е., 4исло подклю4ений = коли4еству

    у4еток, который созданы и сохранены у вас в программе). заходим в любой подклю4 и сразу бросается в глаза Binary

    Value 'Cust' размером 0x6F8, по определенным смещениям в котором вбиты имя фтп, логин и еще какие-то данные.

    предположил, 4то это именно шифрованый пас. открываем ехе, ставим бряки на с4итывание реестра и стопаемся при 4тении

    только этого зна4ения 'Cust' тут
    Code:
    .text:0041E669 sub_41E669      proc near               ; CODE XREF: sub_41E76F+15p
    .text:0041E669
    .text:0041E669 Src             = byte ptr -704h
    .text:0041E669 var_C           = dword ptr -0Ch
    .text:0041E669 Type            = dword ptr -8
    .text:0041E669 cbData          = dword ptr -4
    .text:0041E669 hKey            = dword ptr  8
    .text:0041E669
    .text:0041E669                 push    ebp
    .text:0041E66A                 mov     ebp, esp
    .text:0041E66C                 sub     esp, 704h
    .text:0041E672                 push    ebx
    .text:0041E673                 push    esi
    .text:0041E674                 mov     ebx, 6F8h       ; выделение памяти для 4итаемого буфера
    .text:0041E679                 push    ebx             ; Size
    .text:0041E67A                 xor     esi, esi
    .text:0041E67C                 push    esi             ; Val
    .text:0041E67D                 push    edi             ; Dst
    .text:0041E67E                 call    _memset
    .text:0041E683                 add     esp, 0Ch
    .text:0041E686                 mov     eax, edi
    .text:0041E688                 call    sub_407366
    .text:0041E68D                 cmp     [ebp+hKey], esi
    .text:0041E690                 jz      loc_41E767
    .text:0041E696                 lea     eax, [ebp+cbData]
    .text:0041E699                 push    eax             ; lpcbData
    .text:0041E69A                 push    esi             ; lpData
    .text:0041E69B                 lea     eax, [ebp+Type]
    .text:0041E69E                 push    eax             ; lpType
    .text:0041E69F                 push    esi             ; lpReserved
    .text:0041E6A0                 push    off_462E78      ; lpValueName
    .text:0041E6A6                 push    [ebp+hKey]      ; hKey
    .text:0041E6A9                 call    ds:RegQueryValueExA
    .text:0041E6AF                 test    eax, eax
    .text:0041E6B1                 jnz     loc_41E767
    .text:0041E6B7                 cmp     [ebp+Type], 3
    .text:0041E6BB                 jnz     loc_41E767
    .text:0041E6C1                 cmp     [ebp+cbData], ebx
    .text:0041E6C4                 jz      short loc_41E6D3
    .text:0041E6C6                 cmp     [ebp+cbData], 5F4h
    .text:0041E6CD                 jnz     loc_41E767
    .text:0041E6D3
    .text:0041E6D3 loc_41E6D3:                             ; CODE XREF: sub_41E669+5Bj
    .text:0041E6D3                 lea     esi, [ebp+Src]
    .text:0041E6D9                 call    sub_4073C0
    .text:0041E6DE                 lea     eax, [ebp+cbData]
    .text:0041E6E1                 push    eax             ; lpcbData
    .text:0041E6E2                 lea     eax, [ebp+Src]
    .text:0041E6E8                 push    eax             ; lpData
    .text:0041E6E9                 lea     eax, [ebp+Type]
    .text:0041E6EC                 push    eax             ; lpType
    .text:0041E6ED                 push    0               ; lpReserved
    .text:0041E6EF                 push    off_462E78      ; lpValueName
    .text:0041E6F5                 push    [ebp+hKey]      ; hKey
    .text:0041E6F8                 call    ds:RegQueryValueExA
    .text:0041E6FE                 mov     [ebp+var_C], eax
    .text:0041E701                 push    ebx             ; Size
    .text:0041E702                 lea     eax, [ebp+Src]
    .text:0041E708                 push    eax             ; Src
    .text:0041E709                 push    edi             ; Dst
    .text:0041E70A                 call    _memcpy
    .text:0041E70F                 mov     eax, [edi+5A0h] ; смещение шифрованого паса в с4итаном буфере
    .text:0041E715                 add     esp, 0Ch
    .text:0041E718                 lea     esi, [edi+258h] ; смещение заголовка
    .text:0041E71E                 lea     ebx, [ebp+hKey]
    .text:0041E721                 mov     [ebp+hKey], eax
    .text:0041E724                 call    decrypt         ; расшифровываем
    .text:0041E729                 test    eax, eax
    .text:0041E72B                 jnz     short loc_41E73C
    .text:0041E72D                 push    104h            ; Size
    .text:0041E732                 push    eax             ; Val
    .text:0041E733                 push    esi             ; Dst
    .text:0041E734                 call    _memset
    .text:0041E739                 add     esp, 0Ch
    .text:0041E73C
    .text:0041E73C loc_41E73C:                             ; CODE XREF: sub_41E669+C2j
    .text:0041E73C                 and     dword ptr [edi+5A0h], 0
    .text:0041E743                 cmp     [ebp+cbData], 5F4h
    .text:0041E74A                 jnz     short loc_41E75D
    .text:0041E74C                 mov     dword ptr [edi+5A8h], 16h
    .text:0041E756                 mov     byte ptr [edi+5E8h], 1
    .text:0041E75D
    .text:0041E75D loc_41E75D:                             ; CODE XREF: sub_41E669+E1j
    .text:0041E75D                 xor     eax, eax
    .text:0041E75F                 cmp     [ebp+var_C], eax
    .text:0041E762                 setz    al
    .text:0041E765                 jmp     short loc_41E769
    .text:0041E767 ; ---------------------------------------------------------------------------
    .text:0041E767
    .text:0041E767 loc_41E767:                             ; CODE XREF: sub_41E669+27j
    .text:0041E767                                         ; sub_41E669+48j ...
    .text:0041E767                 xor     eax, eax
    .text:0041E769
    .text:0041E769 loc_41E769:                             ; CODE XREF: sub_41E669+FCj
    .text:0041E769                 pop     esi
    .text:0041E76A                 pop     ebx
    .text:0041E76B                 leave
    .text:0041E76C                 retn    4
    .text:0041E76C sub_41E669      endp
    
    
    Code:
    .text:00403053 decrypt         proc near               ; CODE XREF: sub_41E669+BBp
    .text:00403053
    .text:00403053 Size            = dword ptr -10h
    .text:00403053 Dst             = dword ptr -0Ch
    .text:00403053 hProv           = dword ptr -8
    .text:00403053 hKey            = dword ptr -4
    .text:00403053
    .text:00403053                 push    ebp
    .text:00403054                 mov     ebp, esp
    .text:00403056                 sub     esp, 10h
    .text:00403059                 push    edi
    .text:0040305A                 xor     edi, edi
    .text:0040305C                 push    edi             ; dwFlags
    .text:0040305D                 push    1               ; dwProvType
    .text:0040305F                 push    edi             ; szProvider
    .text:00403060                 push    edi             ; szContainer
    .text:00403061                 lea     eax, [ebp+hProv]
    .text:00403064                 push    eax             ; phProv
    .text:00403065                 mov     [ebp+hProv], edi
    .text:00403068                 mov     [ebp+hKey], edi
    .text:0040306B                 call    ds:CryptAcquireContextA
    .text:00403071                 test    eax, eax
    .text:00403073                 jz      short loc_4030C5
    .text:00403075                 push    4               ; Size
    .text:00403077                 lea     eax, [ebp+Dst]
    .text:0040307A                 push    esi             ; Src
    .text:0040307B                 push    eax             ; Dst
    .text:0040307C                 call    _memcpy
    .text:00403081                 add     esp, 0Ch
    .text:00403084                 lea     eax, [ebp+hKey]
    .text:00403087                 push    eax             ; phKey
    .text:00403088                 push    edi             ; dwFlags
    .text:00403089                 push    edi             ; hPubKey
    .text:0040308A                 push    [ebp+Dst]       ; dwDataLen
    .text:0040308D                 lea     eax, [esi+4]
    .text:00403090                 push    eax             ; pbData
    .text:00403091                 push    [ebp+hProv]     ; hProv
    .text:00403094                 call    ds:CryptImportKey
    .text:0040309A                 test    eax, eax
    .text:0040309C                 jz      short loc_4030C5
    .text:0040309E                 mov     eax, [ebp+Dst]
    .text:004030A1                 mov     ecx, [ebx]
    .text:004030A3                 sub     ecx, eax
    .text:004030A5                 sub     ecx, 4
    .text:004030A8                 mov     [ebp+Size], ecx
    .text:004030AB                 lea     ecx, [ebp+Size]
    .text:004030AE                 push    ecx             ; pdwDataLen
    .text:004030AF                 lea     eax, [eax+esi+4]
    .text:004030B3                 push    eax             ; pbData
    .text:004030B4                 push    edi             ; dwFlags
    .text:004030B5                 push    1               ; Final
    .text:004030B7                 push    edi             ; hHash
    .text:004030B8                 push    [ebp+hKey]      ; hKey
    .text:004030BB                 call    ds:CryptDecrypt
    .text:004030C1                 test    eax, eax
    .text:004030C3                 jnz     short loc_4030C9
    .text:004030C5
    .text:004030C5 loc_4030C5:                             ; CODE XREF: decrypt+20j
    .text:004030C5                                         ; decrypt+49j
    .text:004030C5                 xor     eax, eax
    .text:004030C7                 jmp     short loc_403102
    .text:004030C9 ; ---------------------------------------------------------------------------
    .text:004030C9
    .text:004030C9 loc_4030C9:                             ; CODE XREF: decrypt+70j
    .text:004030C9                 push    [ebp+Size]      ; Size
    .text:004030CC                 mov     eax, [ebp+Dst]
    .text:004030CF                 lea     eax, [eax+esi+4]
    .text:004030D3                 push    eax             ; Src
    .text:004030D4                 push    esi             ; Dst
    .text:004030D5                 call    _memcpy_0
    .text:004030DA                 mov     eax, [ebp+Size]
    .text:004030DD                 add     esp, 0Ch
    .text:004030E0                 cmp     [ebp+hKey], edi
    .text:004030E3                 mov     [ebx], eax
    .text:004030E5                 jz      short loc_4030F0
    .text:004030E7                 push    [ebp+hKey]      ; hKey
    .text:004030EA                 call    ds:CryptDestroyKey
    .text:004030F0
    .text:004030F0 loc_4030F0:                             ; CODE XREF: decrypt+92j
    .text:004030F0                 cmp     [ebp+hProv], edi
    .text:004030F3                 jz      short loc_4030FF
    .text:004030F5                 push    edi             ; dwFlags
    .text:004030F6                 push    [ebp+hProv]     ; hProv
    .text:004030F9                 call    ds:CryptReleaseContext
    .text:004030FF
    .text:004030FF loc_4030FF:                             ; CODE XREF: decrypt+A0j
    .text:004030FF                 xor     eax, eax
    .text:00403101                 inc     eax
    .text:00403102
    .text:00403102 loc_403102:                             ; CODE XREF: decrypt+74j
    .text:00403102                 pop     edi
    .text:00403103                 leave
    .text:00403104                 retn
    .text:00403104 decrypt         endp
    
    
    продебажив, можно легко найти смещения в буфере, по которым с4итывается заголовок, клю4и, юзаемые функциями MS

    CryptoApi, имя фтп-логин и дешифруемый пас. поням алго фишрования, состряпаем такой работоспособный код, который

    будет выводить имя фтп, логи и пас для первого найденного фтп-аккаунта из существующих (кому нужно, парсинг и вывод

    всех акков доделает сам, юзая RegEnumKey):
    Code:
    include 'win32ax.inc'
    
    section '.text' code readable writable executable
    
    RootKey        EQU  HKEY_CURRENT_USER
    BUF_SIZE       =    $6F8
    header	       =    $258 + 4;
    spacer	       =    $4C;
    key_offset     =    $5A0;
    ftp_offset     =    $104;
    username_offset=    $208;
    ftp_caption   db   'FTP: ', 0;
    user_caption  db   ', username: ', 0;
    pass_caption  db   ', password is: ', 0;
    KeyName       db   'Software\Emurasoft\Emftp\Config\account-name', 0;
    ValName       db   'Cust', 0;
    ValType       db   ?
    hReg	      dd   ?
    hProv	      dd   ?
    hKey	      dd   ?
    openkey       dd   ?
    result	      dd   ?
    decrypted     dd   ?
    ftpserver     dd   ?
    size	      dd   ?
    key	      db   ?
    BufSize       dd   BUF_SIZE
    account       rb   BUF_SIZE
    .code
    
    start:
        invoke  RegOpenKeyExA, RootKey, KeyName, 0, KEY_READ, hReg
        or	    eax, eax
        jnz     .err
        mov     [ValType], REG_BINARY
        invoke  RegQueryValueExA, [hReg], ValName, 0, ValType, account, BufSize
        or	    eax, eax
        jnz     .err
        invoke  RegCloseKey, [hReg]
    
        mov     al, [account+key_offset]		       ;key for decrypting
        mov     [key], al				       ;key :=  Src[key_offset];
        invoke  CryptAcquireContextA, hProv, 0, 0, 1, 0
        invoke  CryptImportKey, [hProv], account+header, spacer, 0, 0, hKey
        xor     eax, eax
        mov     al, [key]
        sub     eax, spacer
        sub     eax, 4
        mov     [size], eax 			       ;size := key - spacer - 4;
        mov     eax, account+header+spacer
        mov     [decrypted], eax
        invoke  CryptDecrypt, [hKey], 0, 1, 0, [decrypted], size
    
        invoke  lstrcatA, result, ftp_caption
        invoke  lstrcatA, result, account+ftp_offset       ;ftp servername
        invoke  lstrcatA, result, user_caption
        invoke  lstrcatA, result, account+username_offset  ;username
        invoke  lstrcatA, result, pass_caption
        invoke  lstrcatA, result, account+header+spacer    ;decrypted pass
        invoke  MessageBox, 0, result, 0, MB_OK	       ;show results
    
        invoke  ExitProcess
    
     .err:
           ret
    .end start
    
     
    5 people like this.