Odbc и Libmysql

Тема в разделе "WASM.NETWORKS", создана пользователем ZX_CodeR, 9 июн 2008.

  1. ZX_CodeR

    ZX_CodeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2007
    Сообщения:
    48
    Каждая из этих библиотек спускаясь на уровень ниже обращается к функции closesocket
    я в свою очередь хукаю эту функу и в обработчике выставляю для сокета опцию SO_LINGER ....
    далее передаю управление в настоящую функцию .... closesocket
    Проблема вот в чем ..... с юзанием libmysql ни какого эффекта ваще нет .... соединения переходят в TIME_WAIT ...
    с юзанием odbc прога ваще падает ...... падает на вызове функции

    SQLDriverConnect(hdbc, 0, (unsigned char*)szDsn,SQL_NTS, (unsigned char *)buffer, 256, NULL, SQL_DRIVER_NOPROMPT); // причем buffer забиваетсо до конца пока прога не вылетит ......


    а чичаз дам часть кода ....


    Код (Text):
    1. //======================== hook.cpp ============================
    2.  
    3. int global_addr;
    4.  
    5. void _declspec(naked) closesocket_hook(SOCKET s){
    6.        
    7.         SOCKET sock;
    8.         _asm{
    9.                 mov ecx ,[esp+4]
    10.                 mov sock ,ecx
    11.         }
    12.         int esi_p;
    13.         _asm{
    14.  
    15.                 mov  esi_p,esi
    16.         }
    17.         struct linger l ;
    18.         l.l_linger= 0;
    19.         l.l_onoff=1;
    20.         //MessageBox(0,"HookProc",0,0);
    21.         setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *)&l, sizeof(struct linger));
    22.         _asm{
    23.                    mov esi,esi_p
    24.                    MOV EDI,EDI
    25.            PUSH EBP
    26.            MOV EBP,ESP
    27.            jmp global_addr
    28.         }
    29. };
    30. struct inject{
    31.         char call;
    32.         char addr4;
    33.         char addr3;
    34.         char addr2;
    35.         char addr1;
    36. } ;
    37.  
    38. union address{
    39.         int addr;
    40.         struct bytes {
    41.         char addr4;
    42.         char addr3;
    43.         char addr2;
    44.         char addr1;
    45.         } bit;
    46. };
    47.  
    48. void hook(){   // при инициализации вызываю эту функу ..........
    49.        
    50.         inject *inj;
    51.         address un_addr;
    52.         HMODULE ws;
    53.         FARPROC addr;
    54.         //JMPValue := DWORD (NewProcAddress) - DWORD (ProcAddress) - 5;
    55.         ws=LoadLibrary("ws2_32.dll");
    56.         addr=GetProcAddress(ws,"closesocket");
    57.         global_addr=(int)addr;
    58.         global_addr+=5;
    59.         unsigned long OldProtect;
    60.         inj=(struct inject *)addr;
    61.         VirtualProtect(addr,10,PAGE_EXECUTE_READWRITE,&OldProtect);
    62.         inj->call=0xe9;
    63.         un_addr.addr=(int)closesocket_hook-int(addr)-5;
    64.         inj->addr4=un_addr.bit.addr4;
    65.         inj->addr3=un_addr.bit.addr3;
    66.         inj->addr2=un_addr.bit.addr2;
    67.         inj->addr1=un_addr.bit.addr1;
    68.         VirtualProtect(addr,10,OldProtect,&OldProtect);
    69. }
    70.  
    71.  
    72.  
    73. //======================= mysql.cpp ===========================
    74. void ThreadProcMySql(HANDLE * hthr){
    75.         char sPass[1000];
    76.         char sHost[3000];
    77.         char sLogin[3000];
    78.         char sPort[100];
    79.         unsigned long lpn;
    80.         strcpy(sHost,szGHostMySql);
    81.         strcpy(sLogin,szGLoginMySql);
    82.         strcpy(sPass,szGPassMySql);
    83.         HANDLE ht=*hthr;
    84.         MysqlFlag=0;
    85.        
    86.                         MYSQL mysql;
    87.                         mysql.reconnect = true;
    88.                 //      mysql.options.connect_timeout=global_time_out_my;
    89.                         int llen=strlen(sHost);
    90.                         for(int i=0;i<llen;i++)
    91.                                 if(*(sHost+i)==':' && i!=llen-1){
    92.                                         *(sHost+i)=0;
    93.                                         strcpy(sPort,sHost+i+1);
    94.                                         break;
    95.                                 }
    96.                        
    97.                         int port=atoi(sPort);
    98.                         if(port!=0)     mysql.options.port=port;
    99.                         mysql_init(&mysql);
    100.                
    101.                         if (!(mysql_connect(&mysql,sHost,sLogin,sPass))){
    102.                                        
    103.                                         BadMySql++;
    104.                                         SetDlgItemInt(g_hwnds,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMySql,0);
    105.                                         SetDlgItemInt(g_hwnds,IDC_STATIC_BAD,BadMySql,0);
    106.                                         mysql_close(&mysql);
    107.                                         GlobalThreadIDMySql--;
    108.                                         CloseHandle(ht);
    109.                                         return ;
    110.                         }
    111.                         else {
    112.                                 GoodMySql++;
    113.                                 WriteFile(hFileGlobalMySql,sHost,strlen(sHost),&lpn,0);
    114.                                 WriteFile(hFileGlobalMySql,":",1,&lpn,0);
    115.                                 WriteFile(hFileGlobalMySql,sLogin,strlen(sLogin),&lpn,0);
    116.                                 WriteFile(hFileGlobalMySql,":",1,&lpn,0);
    117.                                 WriteFile(hFileGlobalMySql,sPass,strlen(sPass),&lpn,0);
    118.                                 WriteFile(hFileGlobalMySql,"\n",1,&lpn,0);
    119.                                 mysql_close(&mysql);
    120.                        
    121.                                 SetDlgItemInt(g_hwnds,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMySql,0);
    122.                                 SetDlgItemInt(g_hwnds,IDC_STATIC_GOOD,GoodMySql,0);
    123.                                 GlobalThreadIDMySql--;
    124.                                 CloseHandle(ht);
    125.                                 return ;
    126.                         }
    127. }                    
    128.  
    129.  
    130. bool MySqlConnect(char* sHost,char * sLogin,char * sPass){
    131.                
    132.                
    133.                 if(strlen(sHost)>300)strncpy(szGHostMySql,sHost,300);
    134.                 else strcpy(szGHostMySql,sHost);
    135.  
    136.                 if(strlen(sLogin)>300)strncpy(szGLoginMySql,sLogin,300);
    137.                 else strcpy(szGLoginMySql,sLogin);
    138.  
    139.                 if(strlen(sPass)>300)strncpy(szGPassMySql,sPass,300);
    140.                 else strcpy(szGPassMySql,sPass);
    141.  
    142.  
    143.  
    144.                 filtr(sHost);
    145.                 filtr(sLogin);
    146.                 filtr(sPass);
    147.  
    148.                 while(kolvo_thr_my<=GlobalThreadIDMySql)Sleep(1);
    149.                         MysqlFlag=1;
    150.                         GlobalThreadIDMySql++;
    151.                         SetDlgItemInt(g_hwnds,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMySql,0);
    152.                         SetDlgItemInt(g_hwnds,IDC_STATIC_PROVERENO,GetDlgItemInt(g_hwnds,IDC_STATIC_PROVERENO,0,0)+1,0);
    153.                         unsigned long ThreadID=(unsigned long)GlobalThreadIDMySql;
    154.                        
    155.                         ht_mysql=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadProcMySql ,&ht_mysql,0,&ThreadID);
    156.                         while(MysqlFlag==1)Sleep(1);
    157.                        
    158.  
    159. return true;
    160. }
    161.  
    162. //======================== mssql ========================
    163.  
    164. void ThreadProcMsSql(HANDLE *hthr){
    165.     unsigned long lpn;
    166.     char sPass[1000]="";
    167.     char sHost[3000]="";
    168.     char sLogin[3000]="";
    169.     char sPort[100]="";
    170.    
    171.  
    172.     char temp[100];
    173.     strcpy(sHost,szGHostMsSql);
    174.     strcpy(sLogin,szGLoginMsSql);
    175.     strcpy(sPass,szGPassMsSql);
    176.     HANDLE ht=*hthr;
    177.  
    178.     MsSqlFlag=0;
    179.     int llen=strlen(sHost);
    180.     for(int i=0;i<llen;i++)
    181.         if(*(sHost+i)==':' && i!=llen-1){
    182.             *(sHost+i)=0;
    183.             strcpy(sPort,sHost+i+1);
    184.             break;
    185.         }
    186.    
    187.     int port=atoi(sPort);
    188.     if(port==0)port=1433;
    189.  
    190.        
    191.  
    192.         RETCODE  rcode, rcodeinfo;
    193.         SQLHENV  henv;
    194.         SQLHDBC  hdbc;
    195.  
    196.        
    197.         char szDsn[1000],buffer[2000]="";
    198.  
    199.         SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&henv);
    200.  
    201.         SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
    202.  
    203.         sprintf(szDsn,"Driver={SQL Server};server=%s;port=%i;connect timeout=%i;uid=%s;pwd=%s",sHost,port,global_time_out_ms,sLogin,sPass);
    204.  
    205.  
    206.         rcode = SQLDriverConnect(hdbc, 0, (unsigned char*)szDsn,
    207.                         SQL_NTS, (unsigned char *)buffer, 256, NULL, SQL_DRIVER_NOPROMPT);
    208.  
    209.  
    210.  
    211.         if (rcode !=SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO){
    212.                 BadMsSql++;
    213.                
    214.                 SetDlgItemInt(g_hwndthree,IDC_STATIC_BAD,BadMsSql,0);
    215.                 SetDlgItemInt(g_hwndthree,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMsSql,0);
    216.                            
    217.         }
    218.         else {
    219.                 GoodMsSql++;
    220.                 WriteFile(hFileGlobalFtp,sHost,strlen(sHost),&lpn,0);
    221.                 WriteFile(hFileGlobalFtp,":",1,&lpn,0);
    222.                 WriteFile(hFileGlobalFtp,sLogin,strlen(sLogin),&lpn,0);
    223.                 WriteFile(hFileGlobalFtp,":",1,&lpn,0);
    224.                 WriteFile(hFileGlobalFtp,sPass,strlen(sPass),&lpn,0);
    225.                 WriteFile(hFileGlobalFtp,"\n",1,&lpn,0);
    226.                
    227.                 SetDlgItemInt(g_hwndthree,IDC_STATIC_GOOD,GoodMsSql,0);
    228.                 SetDlgItemInt(g_hwndthree,IDC_STATIC_IN_PROVERKA,GlobalThreadIDMsSql,0);
    229.         }
    230.            
    231.            
    232.             SQLDisconnect(hdbc);
    233.             SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    234.             if (henv != NULL){
    235.                 SQLFreeHandle(SQL_HANDLE_ENV, henv);
    236.        
    237.             }
    238.            
    239.        
    240.             GlobalThreadIDMsSql=GlobalThreadIDMsSql-1;
    241.             CloseHandle(ht);
    242.     return ;
    243. }
    заранее всем признателен !