Делаю в качестве курсовой защиту для сервера - в данном случае, игрового. В ходе работы к процессу подгружается DLL-ка и делает пару замен в коде программы. Делал встроенную защиту от ддоса, и обнаружил аномалии, вызываемые функцией time. Вот код: Код (Text): void Hook_Sys_GetPacket(){ //собственно инъекция программу - написана на асме во //избежание шуток от компилятора и для скорости _asm{ pop ebp add esp, 18h cmp eax, 6 jle shortpacket ;проверка на короткий пакет checkban: push ebx call is_notbanned ;может, уже забанен? Нет? Возвращаемся add esp, 4 test eax, eax jz banned retn banned: push 00451C00h ;Начинаем забор пакета сначала retn shortpacket: push 2 push ebx call AddWarns ;регистрируем подозрительное действие add esp, 8 jmp checkban } Код (Text): void AddWarns(netadr_t *adr, byte warn){ banips *crnt=iplist; time_t ltime; time(<ime); //И тут аномалия while(crnt){ //проверка списка - вдруг такие уже есть? if ( NET_CompareBaseAdr(*adr,crnt->address) ){//got him! if (crnt->banned){ crnt->lifetime=ltime+BANTIME; //ban return; } crnt->warns+=warn; if(crnt->warns>=MAX_WARNS){ crnt->lifetime=ltime+BANTIME; //ban crnt->banned=true; log_write("AntiDDoS: %s was banned for 5 mins\n",NET_AdrToString(*adr)); } return; } crnt=crnt->next; } //Not found; create him; crnt=addbanip(adr); crnt->warns=warn; if(crnt->warns>=MAX_WARNS){ crnt->lifetime=ltime+BANTIME; //ban crnt->banned=true; log_write("AntiDDoS: %s was banned for 5 mins\n",NET_AdrToString(*adr)); } } Внутри реализована умная (насколько - покажет время) система, в которой блокируется IP не сразу, а после превышения количества подозрительных действий. А то мало ли что может произойти, ошибок в работе очень не хочется. Аномалия заключается в следующем: после запуска ддоса я обнаружил, что в логах пишется множество записей о бане вместо одной. Начал дебаг, и обнаружил, что иногда при запуске time содержимое объекта adr (т.е. IP-адрес) меняется на абракадабру. Притом это происходит постоянно во время второго запуска addwarns, и ещё несколько раз впоследствии. Пробовал по-разному это обойти, оптимизацию отключал, не помогало. Попробовал открыть редактор памяти TSearch, и смотрел прямо в памяти на содержимое adr. И тут до запуска time нормально, сразу после - абракадарба. Ладно, попробовал скопировать объект и назвать копию adr2, и... и в нём тоже абракадабра! Логики не понимаю. Может, у кого есть идеи, отчего это происходит?
абракадабра обычно с локальными переменными - когда вы не учли что стек в том месте будет тереться при вызове какой либо функи.
ASMatic Большое спасибо, помогло. Вынес adr2 в глобал, и глюки пропали. Вот только я не понимаю, почему стек трётся при вызове time.
Zlyden два варианта - не та конвенсия в прототипе ну или банальный лишний аргумент переданный в функцию. CRT не использую принципиально поэтому не могу с уверенностью сказать что то по поводу time(). Нету ванингов никаких(сделайте rebuld project).. Пройдитесь каким_нить верифаером( рас уж так все безвыходно ) Хотя студия обычно предупреждает о таких ситуашках. они не пропали, просто трется что-то другое теперь, локальная переменная например..