Перехват SSL_Write в static сборке

Тема в разделе "WASM.WIN32", создана пользователем cdump, 6 мар 2010.

  1. cdump

    cdump New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2010
    Сообщения:
    5
    Я не очень хорошо разбираюсь в исследовании программ, но появилась очень важная задача - исследовать одну. Вот что из этого у меня получилось:

    Есть софт, общающийся с сервером по закрытому проколу, задача - разобрать этот протокол.
    После загрузки софта в OllyDBG заметил, что встречаются строки вида "./ssl/ssl_lib.c" и пр., отсюда сделал вывод, что возможно, соединение шифруется с помощью openssl, причем оно вкомпилено, а не динамически подгружается.
    Нашел адрес SSL_Write в оригинальной ssleay32.dll, пошел по нему в Ollydbg и сравнением нашел в нужном мне софте аналогичный код.

    SSL_write на C выглядит вот так:
    Код (Text):
    1. int SSL_write(SSL *s,const void *buf,int num)
    2.     {
    3.        if (s->handshake_func == 0) {
    4.              SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
    5.              return -1;
    6.        }
    7.  
    8.       if (s->shutdown & SSL_SENT_SHUTDOWN) {
    9.              s->rwstate=SSL_NOTHING;
    10.              SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
    11.              return(-1);
    12.        }
    13.        
    14.       return(s->method->ssl_write(s,buf,num));
    15. }
    В нужном мне софте:
    Код (Text):
    1. 005BE990  /$ 8B4424 04      MOV EAX,DWORD PTR SS:[ESP+4]
    2. 005BE994  |. 8378 20 00     CMP DWORD PTR DS:[EAX+20],0
    3. 005BE998  |. 75 22          JNZ SHORT SoftName.005BE9BC
    4. 005BE99A  |. 68 45030000    PUSH 345
    5. 005BE99F  |. 68 94A96500    PUSH SoftName.0065A994                   ;  ASCII ".\ssl\ssl_lib.c"
    6. 005BE9A4  |. 68 14010000    PUSH 114
    7. 005BE9A9  |. 68 DF000000    PUSH 0DF
    8. 005BE9AE  |. 6A 14          PUSH 14
    9. 005BE9B0  |. E8 DBA3FEFF    CALL SoftName.005A8D90
    10. 005BE9B5  |. 83C4 14        ADD ESP,14
    11. 005BE9B8  |. 83C8 FF        OR EAX,FFFFFFFF
    12. 005BE9BB  |. C3             RETN
    13. 005BE9BC  |> F640 30 02     TEST BYTE PTR DS:[EAX+30],2
    14. 005BE9C0  |. 74 0A          JE SHORT SoftName.005BE9CC
    15. 005BE9C2  |. C740 18 010000>MOV DWORD PTR DS:[EAX+18],1
    16. 005BE9C9  |. 33C0           XOR EAX,EAX
    17. 005BE9CB  |. C3             RETN
    18. 005BE9CC  |> 8B48 08        MOV ECX,DWORD PTR DS:[EAX+8]
    19. 005BE9CF  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX
    20. 005BE9D3  |. 8B41 18        MOV EAX,DWORD PTR DS:[ECX+18]
    21. 005BE9D6  \. FFE0           JMP EAX
    22. 005BE9D8     CC             INT3
    Я написал на C следующую dll:
    Код (Text):
    1. #include "windows.h"
    2. #include <openssl/ssl.h>
    3.  
    4. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved);
    5.  
    6. #define DLLEXPORT extern "C" __declspec(dllexport)
    7.  
    8. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    9. {
    10.     switch (ul_reason_for_call)
    11.     {
    12.         case DLL_PROCESS_ATTACH:
    13.             MessageBox(NULL,"Load ok",NULL,MB_OK);
    14.             break;
    15.  
    16.         case DLL_PROCESS_DETACH:
    17.             break;
    18.     }
    19.     return TRUE;
    20. }
    21.  
    22.  
    23. DLLEXPORT int MY_SSL_write(SSL *s,const void *buf,int num) {
    24.  
    25.         MessageBox(NULL,"Start My_ssl_write",NULL,MB_OK);
    26.         if (s->handshake_func == 0) {
    27.             //SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);
    28.             MessageBox(NULL,"error 1",NULL,MB_OK);
    29.             return -1;
    30.         }
    31.  
    32.         MessageBox(NULL,"1st check passed",NULL,MB_OK);
    33.         if (s->shutdown & SSL_SENT_SHUTDOWN) {
    34.             MessageBox(NULL,"Error 2 - start!",NULL,MB_OK);
    35.             s->rwstate=SSL_NOTHING;
    36.             MessageBox(NULL,"Error 2 - exit!",NULL,MB_OK);
    37.             //SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);
    38.             return(-1);
    39.         }
    40.            
    41.         MessageBox(NULL,"No errors",NULL,MB_OK);
    42.         return(s->method->ssl_write(s,buf,num));
    43. }
    И WinHex'ом поменял в том софте SSL_Write:
    Код (Text):
    1. 005BE990  /$ 90             NOP
    2. 005BE991  |. 90             NOP
    3. 005BE992  |. 90             NOP
    4. 005BE993  |. 90             NOP
    5. 005BE994  |. 68 94A96500    PUSH TowerPok.0065A994                   ; /FileName = "ddlll1.dll"
    6. 005BE999  |. FF15 E4C06300  CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; \LoadLibraryA
    7. 005BE99F  |. 68 28A96500    PUSH TowerPok.0065A928                   ; /ProcNameOrOrdinal = "MY_SSL_write"
    8. 005BE9A4  |. 50             PUSH EAX                                 ; |hModule
    9. 005BE9A5  |. FF15 28C06300  CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; \GetProcAddress
    10. 005BE9AB  |. 90             NOP
    11. 005BE9AC  |. 90             NOP
    12. 005BE9AD  |. 90             NOP
    13. 005BE9AE  |. 90             NOP
    14. 005BE9AF  |. 90             NOP
    15. 005BE9B0  |. 90             NOP
    16. 005BE9B1  |. 90             NOP
    17. 005BE9B2  |. FFD0           CALL EAX
    18. 005BE9B4  |. 90             NOP
    (NOP'ы из-за экспериментов с PUSH/POP)

    В итоге, при запуске программы получаю:
    1) Load ok
    2) Start My_ssl_write
    3) 1st check passed
    4) Error 2 -start!
    а дальше программа вылетает.

    Не могу разобраться, что тут не так. При попытке отладить софт вызывается куча Break'ов на Memory Write в одном из модулей(DDL) софта, которые я не смог найти как отключить, вызываются по различным адресам. Может есть способ заставить olly игнорировать break в других модулях?
    Или может есть более совершенный способ узнать, о чем говорит софт с сервером?
    Заранее, спасибо за помощь!
     
  2. ptr

    ptr New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2009
    Сообщения:
    130
  3. ptr

    ptr New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2009
    Сообщения:
    130