HLFX.Ru Forum Страницы (3): [1] 2 3 »
Показать все 45 сообщений этой темы на одной странице

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
2
#include <windows.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include <direct.h>
6
#include <io.h>
7
 
8
#define MAX_NUM_ARGVS	4
9
 
10
int argc;
11
char *argv[MAX_NUM_ARGVS];
12
 
13
static void AU_SelfDelete( void )
14
{
15
  char szFileName[MAX_PATH];
16
  GetModuleFileName( NULL, szFileName, sizeof(szFileName) );
17
  MoveFileEx( szFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT );
18
}
19
 
20
static void AU_DeleteDirectory( const char *pszDirName )
21
{
22
  char search[MAX_PATH];
23
  struct _finddata_t findinfo;
24
  intptr_t findhandle;
25
 
26
  memset( search, 0, sizeof(search) );
27
  strncat_s( search, pszDirName, sizeof(search)-1 );
28
  strncat_s( search, "\\*", sizeof(search)-1 );
29
 
30
  findhandle = _findfirst( search, &findinfo );
31
  if ( findhandle == -1 )
32
    return;
33
 
34
  do {
35
    if ( findinfo.name[0] == '.' )
36
      continue;
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 );
43
      continue;
44
    }
45
    remove( search );
46
  } while ( _findnext ( findhandle, &findinfo ) != -1 );
47
 
48
  _findclose( findhandle );
49
  _rmdir( pszDirName );
50
}
51
 
52
static bool AU_MoveDirectoryContents( const char *pszDirName, const char *pszDest )
53
{
54
  char src[1024];
55
  char dst[1024];
56
  struct _finddata_t findinfo;
57
  intptr_t findhandle;
58
 
59
  memset( src, 0, sizeof(src) );
60
  strncat_s( src, pszDirName, sizeof(src)-1 );
61
  strncat_s( src, "\\*", sizeof(src)-1 );
62
 
63
  findhandle = _findfirst( src, &findinfo );
64
  if ( findhandle == -1 )
65
    return true;
66
 
67
  do {
68
    if ( findinfo.name[0] == '.' )
69
      continue;
70
 
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 );
75
 
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 );
80
 
81
    if ( findinfo.attrib & _A_SUBDIR ) {
82
      _mkdir( dst );
83
      if ( !AU_MoveDirectoryContents( src, dst ) )
84
        return false;
85
      continue;
86
    }
87
 
88
    // move file
89
    if ( !MoveFileEx( src, dst, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED ) )
90
      return false;
91
  } while ( _findnext( findhandle, &findinfo ) != -1 );
92
 
93
  _findclose( findhandle );
94
  return true;
95
}
96
 
97
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
98
{
99
  // Extract argc and argv
100
  argc = 0;
101
  memset( argv, 0, sizeof(char*)*MAX_NUM_ARGVS );
102
 
103
  bool in_quote = false;
104
 
105
  while ( *lpCmdLine && ( argc < MAX_NUM_ARGVS ) ) {
106
    while ( *lpCmdLine && ( *lpCmdLine <= 32 ) )
107
      ++lpCmdLine;
108
 
109
    if ( *lpCmdLine ) {
110
      if ( *lpCmdLine == '"' ) {
111
        in_quote = !in_quote;
112
        ++lpCmdLine;
113
      }
114
      argv[argc] = lpCmdLine;
115
      ++argc;
116
      while ( *lpCmdLine && ( ( *lpCmdLine > 32 ) || in_quote ) ) {
117
        if ( in_quote && ( *lpCmdLine == '"' ) ) {
118
          in_quote = !in_quote;
119
          break;
120
        }
121
        ++lpCmdLine;
122
      }
123
      if ( *lpCmdLine ) {
124
        *lpCmdLine = 0;
125
        ++lpCmdLine;
126
      }
127
    }
128
  }
129
 
130
  // argv[0] = temp directory
131
  // argv[1] = game directory
132
  // argv[2] = success message
133
  // argv[3] = parent process id
134
 
135
  if ( !argv[3] )
136
    return 0;
137
 
138
  DWORD dwPID = atoi( argv[3] );
139
  HANDLE hParent = OpenProcess( PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, dwPID );
140
  if ( hParent == 0 )
141
    return 1;
142
 
143
  WaitForSingleObject( hParent, INFINITE );
144
  CloseHandle( hParent );
145
 
146
  // Now we can install updates
147
  bool bSuccess = AU_MoveDirectoryContents( argv[0], argv[1] );
148
  AU_DeleteDirectory( argv[0] );
149
 
150
  if ( !bSuccess ) {
151
    char buf[64];
152
    sprintf_s( buf, "Error installing update!\nError code: %u", GetLastError() );
153
    MessageBox( 0, buf, NULL, MB_ICONSTOP );
154
  } else {
155
    MessageBox( 0, argv[2], "", MB_ICONINFORMATION );
156
  }
157
 
158
  AU_SelfDelete();
159
  return 0;
160
}


Касперскому не нравятся две вещи: 1) рекурсивный вызов AU_MoveDirectoryContents; 2) вызов MoveFileEx.
Охренеть просто. Программа оперирует только с параметрами, переданными ей в командной строке. Какого чёрта она распознаётся как потенциально опасная? Можно подумать, она в системные папки лезет.

__________________

xaerox on Vivino


Отправлено tolerance 27-03-2014 в 17:38:

Напиши им в поддержку. Может даже пришли безобидный исходный код, который у ихнего антивируса детектится.

А лучше забить. ТРУЪ юзер не юзает онтивирус.


Отправлено Cybermax 27-03-2014 в 17:43:

Цитата:
tolerance писал:
А лучше забить. ТРУЪ юзер не юзает онтивирус.



В разработке игрового движка нет такого понятие тру или не тру. Есть принцип купил, установил и играешь. И никаких танцев с бубном.

__________________


Отправлено XaeroX 27-03-2014 в 17:44:

Цитата:
tolerance писал:
Напиши им в поддержку.

Кто-нибудь знает почтовый адрес?
На форуме такой специфической ветки не нашёл, там всё больше вопросы юзерского уровня.
Цитата:
tolerance писал:
А лучше забить. ТРУЪ юзер не юзает онтивирус.

Угу, забить, как же. Каспер берёт и молча удаляет этот ехешник. А т.к. он вшивается в ресурсы движкового ехешника - удалит и его.
Причём старые версии касперского ничего такого не находили, а новая - начала. Причём, возможно, начиная с какого-то апдейта, я не следил.

__________________

xaerox on Vivino


Отправлено Дядя Миша 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 кб, касперский перестал ругаться!
Охренеть эвристика! Ну просто достойна Бабушкина. Интересно, а гусей он.. не тово?

__________________

xaerox on Vivino


Отправлено 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 и любую другую программу, копирующую файлы, с другой суммой, записывает в "вирусы". Но это, блин, лаборатория Касперского, а не алтайский школьник...

__________________

xaerox on Vivino


Отправлено ~ X ~ 29-03-2014 в 07:50:

Смешно: вирус допишет нулей сам в себя, вырастет и станет большим. Все довольны?

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Временная зона GMT. Текущее время 16:46. Страницы (3): [1] 2 3 »
Показать все 45 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024