HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Автоапдейтер волатилы начал детектироваться Касперским как вирус (https://hlfx.ru/forum/showthread.php?threadid=4339)
Отправлено XaeroX 27-03-2014 в 17:07:
Автоапдейтер волатилы начал детектироваться Касперским как вирус
Первый вопрос (риторический): почему продукция Касперского - говно наиговённейшее, говнявое, преговённое?
Второй вопрос (практический): как переписать код, чтобы он снова мог работать у людей без возни с добавлением в исключения?
Программа очень простая. Получает на входе папку игры, папку с временными файлами и pid процесса. Ждёт окончания процесса, потом перезаписывает файлы и самоудаляется. Используется для обновления системных дллок и ехешника, т.е. тех файлов, которые нельзя переписать во время работы движка.
Код:
C++ Source Code:
1 | #define WIN32_LEAN_AND_MEAN |
11 | char *argv[MAX_NUM_ARGVS]; |
13 | static void AU_SelfDelete( void ) |
15 | char szFileName[MAX_PATH]; |
16 | GetModuleFileName( NULL, szFileName, sizeof(szFileName) ); |
17 | MoveFileEx( szFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT ); |
20 | static void AU_DeleteDirectory( const char *pszDirName ) |
22 | char search[MAX_PATH]; |
23 | struct _finddata_t findinfo; |
26 | memset( search, 0, sizeof(search) ); |
27 | strncat_s( search, pszDirName, sizeof(search)-1 ); |
28 | strncat_s( search, "\\*", sizeof(search)-1 ); |
30 | findhandle = _findfirst( search, &findinfo ); |
31 | if ( findhandle == -1 ) |
35 | if ( findinfo.name[0] == '.' ) |
37 | memset( search, 0, sizeof(search) ); |
38 | strncat_s( search, pszDirName, sizeof(search)-1 ); |
39 | strncat_s( search, "\\", sizeof(search)-1 ); |
40 | strncat_s( search, findinfo.name, sizeof(search)-1 ); |
41 | if ( findinfo.attrib & _A_SUBDIR ) { |
42 | AU_DeleteDirectory( search ); |
46 | } while ( _findnext ( findhandle, &findinfo ) != -1 ); |
48 | _findclose( findhandle ); |
52 | static bool AU_MoveDirectoryContents( const char *pszDirName, const char *pszDest ) |
56 | struct _finddata_t findinfo; |
59 | memset( src, 0, sizeof(src) ); |
60 | strncat_s( src, pszDirName, sizeof(src)-1 ); |
61 | strncat_s( src, "\\*", sizeof(src)-1 ); |
63 | findhandle = _findfirst( src, &findinfo ); |
64 | if ( findhandle == -1 ) |
68 | if ( findinfo.name[0] == '.' ) |
71 | memset( src, 0, sizeof(src) ); |
72 | strncat_s( src, pszDirName, sizeof(src)-1 ); |
73 | strncat_s( src, "\\", sizeof(src)-1 ); |
74 | strncat_s( src, findinfo.name, sizeof(src)-1 ); |
76 | memset( dst, 0, sizeof(dst) ); |
77 | strncat_s( dst, pszDest, sizeof(dst)-1 ); |
78 | strncat_s( dst, "\\", sizeof(dst)-1 ); |
79 | strncat_s( dst, findinfo.name, sizeof(dst)-1 ); |
81 | if ( findinfo.attrib & _A_SUBDIR ) { |
83 | if ( !AU_MoveDirectoryContents( src, dst ) ) |
89 | if ( !MoveFileEx( src, dst, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED ) ) |
91 | } while ( _findnext( findhandle, &findinfo ) != -1 ); |
93 | _findclose( findhandle ); |
97 | int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) |
99 | // Extract argc and argv |
101 | memset( argv, 0, sizeof(char*)*MAX_NUM_ARGVS ); |
103 | bool in_quote = false; |
105 | while ( *lpCmdLine && ( argc < MAX_NUM_ARGVS ) ) { |
106 | while ( *lpCmdLine && ( *lpCmdLine <= 32 ) ) |
110 | if ( *lpCmdLine == '"' ) { |
111 | in_quote = !in_quote; |
114 | argv[argc] = lpCmdLine; |
116 | while ( *lpCmdLine && ( ( *lpCmdLine > 32 ) || in_quote ) ) { |
117 | if ( in_quote && ( *lpCmdLine == '"' ) ) { |
118 | in_quote = !in_quote; |
130 | // argv[0] = temp directory |
131 | // argv[1] = game directory |
132 | // argv[2] = success message |
133 | // argv[3] = parent process id |
138 | DWORD dwPID = atoi( argv[3] ); |
139 | HANDLE hParent = OpenProcess( PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, dwPID ); |
143 | WaitForSingleObject( hParent, INFINITE ); |
144 | CloseHandle( hParent ); |
146 | // Now we can install updates |
147 | bool bSuccess = AU_MoveDirectoryContents( argv[0], argv[1] ); |
148 | AU_DeleteDirectory( argv[0] ); |
152 | sprintf_s( buf, "Error installing update!\nError code: %u", GetLastError() ); |
153 | MessageBox( 0, buf, NULL, MB_ICONSTOP ); |
155 | MessageBox( 0, argv[2], "", MB_ICONINFORMATION ); |
Касперскому не нравятся две вещи: 1) рекурсивный вызов AU_MoveDirectoryContents; 2) вызов MoveFileEx.
Охренеть просто. Программа оперирует только с параметрами, переданными ей в командной строке. Какого чёрта она распознаётся как потенциально опасная? Можно подумать, она в системные папки лезет. 
__________________
Отправлено tolerance 27-03-2014 в 17:38:
Напиши им в поддержку. Может даже пришли безобидный исходный код, который у ихнего антивируса детектится.
А лучше забить. ТРУЪ юзер не юзает онтивирус.
Отправлено Cybermax 27-03-2014 в 17:43:
Цитата:
tolerance писал:
А лучше забить. ТРУЪ юзер не юзает онтивирус.
В разработке игрового движка нет такого понятие тру или не тру. Есть принцип купил, установил и играешь. И никаких танцев с бубном.__________________
ㅤ
Отправлено XaeroX 27-03-2014 в 17:44:
Цитата:
tolerance писал:
Напиши им в поддержку.
Кто-нибудь знает почтовый адрес?
На форуме такой специфической ветки не нашёл, там всё больше вопросы юзерского уровня.
Цитата:
tolerance писал:
А лучше забить. ТРУЪ юзер не юзает онтивирус.
Угу, забить, как же. Каспер берёт и молча удаляет этот ехешник. А т.к. он вшивается в ресурсы движкового ехешника - удалит и его.
Причём старые версии касперского ничего такого не находили, а новая - начала. Причём, возможно, начиная с какого-то апдейта, я не следил.__________________
Отправлено Дядя Миша 27-03-2014 в 17:56:
Касперскому вашему не нравится ровно тот факт, что программка совершает операции с файлами. Для нее любая программа, которая совершает операции с файлами = вирус. Ну кроме винды, конечно.
Добавлено 27-03-2014 в 21:56:
А еще скажу: у тебя там рекурсивное удаление. С точки зрения любого антивируса это подозрительно. Т.е. порядочная программа должна срать в темп и никогда за собой не подчищать.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 27-03-2014 в 18:08:
Против рекурсивного удаления касперский ничего не имеет.
Ему не нравится рекурсивное перемещение файлов. И вообще рекурсивный вызов AU_MoveDirectoryContents (ругается на вирус даже при закомментированном MoveFileEx).
В общем, чудеса какие-то. Скорее всего, баг в эвристике или в сигнатурах. Ну не может быть тут ничего подозрительного, тысячи программ файлы мувают.
Правда, есть нюанс, эта программка весит всего 8 кб. Может, это ему не нравится? Ну тогда надо статически с Qt слинковать, наверное. 
Добавлено 28-03-2014 в 01:08:
Твою жеж мать! Слинковал статически с CRT, размер увеличился до 55 кб, касперский перестал ругаться!
Охренеть эвристика! Ну просто достойна Бабушкина. Интересно, а гусей он.. не тово?
__________________
Отправлено KiQ 28-03-2014 в 18:28:
XaeroX ну так небось у них договор какой с М$
__________________
-Brain is dead-
Отправлено Дядя Миша 28-03-2014 в 18:39:
Цитата:
XaeroX писал:
Слинковал статически с CRT
Это ты имеешь в виду libc.lib?
Просто у меня в ксаше эзкшенички тоже мелкие, но еще никто не жаловался.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Government-Man 28-03-2014 в 20:27:
Цитата:
XaeroX писал:
Твою жеж мать! Слинковал статически с CRT, размер увеличился до 55 кб, касперский перестал ругаться!
В утекших сорцах Касперского есть довольно любопытная документация - эдакий черновик диздока. Так вот там для эвристики среди прочего списка "подозрительных признаков" указан "размер меньше N кб" 
На самом деле имеет смысл, потому как создатели вирусов известны своим задротством в отношении размеров их программ.
Отправлено Дядя Миша 28-03-2014 в 20:31:
Цитата:
Government-Man писал:
Так вот там для эвристики среди прочего списка "подозрительных признаков" указан "размер меньше N кб"
Логика на уровне "нету спичек - значит импотент".__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 29-03-2014 в 05:46:
Дядя Миша, у меня, кажется, Immunet на юнинсталл жаловался в ксаше. Но бомжарским антивирусам я такое прощаю.
Отправлено KiQ 29-03-2014 в 05:59:
FreeSlave ты наверное в названии ошибся немного
__________________
-Brain is dead-
Отправлено Government-Man 29-03-2014 в 06:00:
Цитата:
Дядя Миша писал:
Логика на уровне "нету спичек - значит импотент"
Эвристика есть эвристика, как ни крути, а программа размером в 2 кб с большей вероятностью оказывается вирусом, чем программа размером в 2 мегабайта.
Отправлено XaeroX 29-03-2014 в 06:13:
Government-Man
Слушай, ну допустим, вероятность оказаться вирусом 95%.
Остальные 5% - это миниатюрные программы-автоапдейтеры, хранящиеся в ресурсах больших программ и извлекаемые по мере надобности.
Эвристике касперского, выходит, глубоко плевать на эти 5% честных программ?
Представим себе камеру осуждённых на смертную казнь, в ней 100 человек, но известно, что пятерым заменили казнь на пожизненное. И тут приходит указание сверху - казнить всех, кого положено. Касперский в этом случае казнит всех - зачем ему разбираться, кто на что осуждён? Всего-то 5 человек из 100, ну мелочь же?
Вот так работает его эвристика. 
Добавлено 29-03-2014 в 13:13:
А как должна работать нормальная эвристика: анализировать, откуда приходят входные данные в программу. Если в программу вшиты какие-то пути, или она юзает GetSystemDirectory/SHGetSpecialFolderPath, и оперирует с файлами по этим путям - да, подозрительно. Если программа копирует или удаляет файлы, переданные ей в аргументах - это самая обычная утилита.
Я понимаю, когда Бабушкин вычисляет контрольную сумму cp/xcopy и любую другую программу, копирующую файлы, с другой суммой, записывает в "вирусы". Но это, блин, лаборатория Касперского, а не алтайский школьник... 
__________________
Отправлено ~ X ~ 29-03-2014 в 07:50:
Смешно: вирус допишет нулей сам в себя, вырастет и станет большим. Все довольны?
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]