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