Ошибка с функцией time

Тема в разделе "LANGS.C", создана пользователем Zlyden, 29 апр 2011.

  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Делаю в качестве курсовой защиту для сервера - в данном случае, игрового. В ходе работы к процессу подгружается DLL-ка и делает пару замен в коде программы. Делал встроенную защиту от ддоса, и обнаружил аномалии, вызываемые функцией time. Вот код:
    Код (Text):
    1. void Hook_Sys_GetPacket(){
    2.     //собственно инъекция программу - написана на асме во
    3.     //избежание шуток от компилятора и для скорости
    4.     _asm{
    5.         pop     ebp
    6.         add     esp, 18h
    7.         cmp     eax, 6
    8.         jle     shortpacket     ;проверка на короткий пакет
    9.     checkban:
    10.         push        ebx
    11.         call        is_notbanned    ;может, уже забанен? Нет? Возвращаемся
    12.         add     esp, 4
    13.         test        eax, eax
    14.         jz      banned
    15.         retn
    16.     banned:
    17.         push        00451C00h       ;Начинаем забор пакета сначала
    18.         retn
    19.     shortpacket:
    20.         push        2
    21.         push        ebx
    22.         call        AddWarns        ;регистрируем подозрительное действие
    23.         add     esp, 8
    24.         jmp     checkban
    25.     }
    Код (Text):
    1. void AddWarns(netadr_t *adr, byte warn){
    2.     banips *crnt=iplist;
    3.     time_t ltime;
    4.     time(&ltime);   //И тут аномалия
    5.     while(crnt){    //проверка списка - вдруг такие уже есть?
    6.         if ( NET_CompareBaseAdr(*adr,crnt->address) ){//got him!
    7.             if (crnt->banned){
    8.                 crnt->lifetime=ltime+BANTIME;   //ban
    9.                 return;
    10.             }
    11.             crnt->warns+=warn;
    12.             if(crnt->warns>=MAX_WARNS){
    13.                 crnt->lifetime=ltime+BANTIME;   //ban
    14.                 crnt->banned=true;         
    15.                 log_write("AntiDDoS: %s was banned for 5 mins\n",NET_AdrToString(*adr));   
    16.             }
    17.             return;
    18.         }
    19.         crnt=crnt->next;
    20.     }
    21.     //Not found; create him;
    22.     crnt=addbanip(adr);
    23.     crnt->warns=warn;
    24.     if(crnt->warns>=MAX_WARNS){
    25.         crnt->lifetime=ltime+BANTIME;   //ban
    26.         crnt->banned=true;
    27.         log_write("AntiDDoS: %s was banned for 5 mins\n",NET_AdrToString(*adr));
    28.     }
    29. }
    Внутри реализована умная (насколько - покажет время) система, в которой блокируется IP не сразу, а после превышения количества подозрительных действий. А то мало ли что может произойти, ошибок в работе очень не хочется.
    Аномалия заключается в следующем: после запуска ддоса я обнаружил, что в логах пишется множество записей о бане вместо одной. Начал дебаг, и обнаружил, что иногда при запуске time содержимое объекта adr (т.е. IP-адрес) меняется на абракадабру. Притом это происходит постоянно во время второго запуска addwarns, и ещё несколько раз впоследствии. Пробовал по-разному это обойти, оптимизацию отключал, не помогало. Попробовал открыть редактор памяти TSearch, и смотрел прямо в памяти на содержимое adr. И тут до запуска time нормально, сразу после - абракадарба. Ладно, попробовал скопировать объект и назвать копию adr2, и... и в нём тоже абракадабра! Логики не понимаю. Может, у кого есть идеи, отчего это происходит?
     
  2. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    абракадабра обычно с локальными переменными - когда вы не учли что стек в том месте будет тереться при вызове какой либо функи.
     
  3. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    ASMatic
    Большое спасибо, помогло. Вынес adr2 в глобал, и глюки пропали. Вот только я не понимаю, почему стек трётся при вызове time.
     
  4. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Zlyden
    два варианта - не та конвенсия в прототипе ну или банальный лишний аргумент переданный в функцию. CRT не использую принципиально поэтому не могу с уверенностью сказать что то по поводу time(). Нету ванингов никаких(сделайте rebuld project).. Пройдитесь каким_нить верифаером( рас уж так все безвыходно ) Хотя студия обычно предупреждает о таких ситуашках.
    они не пропали, просто трется что-то другое теперь, локальная переменная например..