Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Вирусоустойчивость. Проверка CRC суммы программы.

10.04.2012, 14:14. Показов 7094. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток)
Появилась такие идеи:
Сделать проверку CRC суммы программы- если программа изменила сумму - значит на нею было воздействие (Выводить Show Message) предупреждать пользователя этой программы.
Или какое то само восстановление программы. Допустим с файла po.po
что бы её вирус не мог скушать(что бы разрешение файла не *.exe или *.dll )
Как вы думаете это возможно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2012, 14:14
Ответы с готовыми решениями:

UDP, проверка CRC
По стандарту CRC header'а проверяется на уровне IP, а вот CRC данных может проверятся или игнорироваться в зависимости от настроек. По...

Нахождение CRC-8 (Контрольной суммы)
Вот есть последовательность: X= Нужно найти вот такой полином получается: {x}^{8}+{x}^{5}+{x}^{4}+1 В матлабе есть уже такая функция ...

Код расчета контрольной суммы на CRC-8
Здравствуйте! Объясните как реализовать код расчета контрольной суммы на CRC-8: Вот исходные данные: Poly : 0x07 Init : 0x00...

20
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.04.2012, 14:49
А смысл? Сомневаюсь что ваша программа найдет широкое распространение, а разработчики вирусов обычно пишут вирусы маскирующиеся под распространенные программы.
И зачем восстанавливать если можно просто скачать и переустановить программу.
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.04.2012, 15:45  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А смысл? Сомневаюсь что ваша программа найдет широкое распространение, а разработчики вирусов обычно пишут вирусы маскирующиеся под распространенные программы.
И зачем восстанавливать если можно просто скачать и переустановить программу.
ну это да)но тогда первый вариант
Сделать проверку CRC суммы программы- если программа изменила сумму - значит на нею было воздействие (Выводить Show Message) предупреждать пользователя этой программы.
что бы пользователь мог определить есть ли вирус
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.04.2012, 15:54
Ну в чем проблема? Взять exe и прочитать его в бинарном режиме ну естественно и сумму найдешь...
Если контрольная сумма не сходится предложить пользователю загрузить программу с оф. сайта и переустановить.
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.04.2012, 16:46  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну в чем проблема? Взять exe и прочитать его в бинарном режиме ну естественно и сумму найдешь...
Если контрольная сумма не сходится предложить пользователю загрузить программу с оф. сайта и переустановить.
сумма crc EC422B99
а как мне сделать проверку при запуске программы?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.04.2012, 17:01
Точно так же как и сумму нашли
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.04.2012, 17:18  [ТС]

0
10.04.2012, 17:43
 Комментарий модератора 
Avazart, или предложите вариант решения вопроса, или не занимайтесь безпредметным трепом.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.04.2012, 18:07
Вот нашел ф-цию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
unsigned int CRC16(int Count,char *Ptr)
{
unsigned int Data;
int CRC=0xffff;
 
while(Count)
  {  
  Data=*Ptr;
  CRC^=Data;
  for(int j=0;j<8;j++) // побитная обработка
     {
      if(CRC&1)
         {
         CRC>>=1;
         CRC^=0xa001;
         }
      else CRC>>=1;
     }
Ptr++;
Count--;
   }
return CRC;
}
Взято с другого форума
2
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.04.2012, 20:01
Ну, до кучи уж тогда вот - с codeproject вкуснятина:
CRC_32.h : header file for the CRC_32 class
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/****************************************************************************
CRC_32.h : header file for the CRC_32 class
written by PJ Arends
[email]pja@telus.net[/email]
 
based on the CRC-32 code found at
[url]http://www.createwindow.com/programming/crc32/crcfile.htm[/url]
 
For updates check [url]http://www3.telus.net/pja/crc32.htm[/url]
 
-----------------------------------------------------------------------------
This code is provided as is, with no warranty as to it's suitability or usefulness
in any application in which it may be used. This code has not been tested for
UNICODE builds, nor has it been tested on a network ( with UNC paths ).
 
This code may be used in any way you desire. This file may be redistributed by any
means as long as it is not sold for profit, and providing that this notice and the
authors name are included.
 
If any bugs are found and fixed, a note to the author explaining the problem and
fix would be nice.
-----------------------------------------------------------------------------
*************************************************************************** */
 
#ifndef _CRC_32_H_EA6C0EE0_BC30_11d5_B625_A58C4DF45B22_INCLUDED
#define _CRC_32_H_EA6C0EE0_BC30_11d5_B625_A58C4DF45B22_INCLUDED
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
#ifndef _WINDOWS_
#include <windows.h>
#endif // _WINDOWS_
 
#define WM_CRC_THREAD_DONE WM_APP + 0x2DB1
 
class CRC_32
{
    typedef struct tag_CRCStruct
    {
        CRC_32 *pCRC_32;
        TCHAR FileName[_MAX_PATH];
        LPBYTE pByte;
        UINT size;
        HWND hWnd;
        HANDLE Thread;
    } CRCStruct, *LPCRCStruct;
 
public:
    CRC_32();
    DWORD CalcCRC(LPCTSTR FileName, HWND ProgressWnd = NULL);
    DWORD CalcCRC(LPVOID buffer, UINT size, HWND ProgressWnd = NULL);
 
private:
    static DWORD WINAPI CRC32ThreadProc(LPVOID lpVoid);
    void Calculate (const LPBYTE buffer, UINT size, ULONG &crc);
    ULONG Reflect(ULONG ref, char ch);
    ULONG Table[256];
};
 
#endif // _CRC_32_H_EA6C0EE0_BC30_11d5_B625_A58C4DF45B22_INCLUDED
 
/////////////////////////////////////////////////////////////////////////////
//
//  End of CRC_32.h
//
/////////////////////////////////////////////////////////////////////////////
CRC_32.cpp : implementation file for the CRC_32 class
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  /****************************************************************************
  CRC_32.cpp : implementation file for the CRC_32 class
  written by PJ Arends
  [email]pja@telus.net[/email]
  
  based on the CRC-32 code found at
  [url]http://www.createwindow.com/programming/crc32/crcfile.htm[/url]
  
  For updates check [url]http://www3.telus.net/pja/crc32.htm[/url]
  
  -----------------------------------------------------------------------------
  This code is provided as is, with no warranty as to it's suitability or usefulness
  in any application in which it may be used. This code has not been tested for
  UNICODE builds, nor has it been tested on a network ( with UNC paths ).
  
  This code may be used in any way you desire. This file may be redistributed by any
  means as long as it is not sold for profit, and providing that this notice and the
  authors name are included.
  
  If any bugs are found and fixed, a note to the author explaining the problem and
  fix would be nice.
  -----------------------------------------------------------------------------
  
  created : October 2001
        
  Revision History:
  
  October 11, 2001   - changed SendMessage to PostMessage in CRC32ThreadProc
  
  ****************************************************************************/
  
  #include "CRC_32.h"
  #include <io.h>         // _close(), _read()
  #include <fcntl.h>      // _O_* flags
  #include <share.h>      // _SH_DENYWR
  #include <tchar.h>      // UNICODE compatibility
  #include <commctrl.h>   // PBM_* progress bar messages
  
  // use a 100 KB buffer (a larger buffer does not seem to run
  // significantly faster, but takes more RAM)
  #define BUFFERSIZE 102400
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  CRC_32::CRC32ThreadProc  (static private member function)
  //    Calculates the CRC-32 value for a file or data buffer.
  //
  //  Parameters :
  //    lpVoid [in] : A pointer to a CRCStruct structure, type casted as a void pointer
  //
  //  Returns :
  //    The CRC-32 value of the supplied buffer or file
  //
  //  Note :
  //    If this function is started as a thread, it will send PBM_* messages to the supplied
  //    progress bar control. When the thread is finished, this function will send a 
  //    WM_CRC_THREAD_DONE message to the parent window of the progress bar. the WPARAM parameter
  //    will contain the HANDLE of the thread, and the LPARAM will contain the CRC-32 value
  //    of the supplied buffer or file.
  //
  /////////////////////////////////////////////////////////////////////////////
  
  DWORD WINAPI CRC_32::CRC32ThreadProc(LPVOID lpVoid)
  {
      LPCRCStruct pCRCSt = (LPCRCStruct)lpVoid;
      ULONG CRC = 0xFFFFFFFF;
      HWND Progress = NULL;
      if (::IsWindow(pCRCSt->hWnd))
      {   // setup the progress bar
          Progress = pCRCSt->hWnd;
          ::PostMessage(Progress, PBM_SETPOS, 0, 0);
          ::PostMessage(Progress, PBM_SETRANGE32, 0, 100);
      }
      if (pCRCSt->pByte)
      {   // calculate CRC for a buffer
          for (UINT offset = 0; offset < pCRCSt->size; offset += BUFFERSIZE)
          {
              pCRCSt->pCRC_32->Calculate(pCRCSt->pByte + offset,
                                         (pCRCSt->size - offset > BUFFERSIZE) ? BUFFERSIZE : (pCRCSt->size - offset),
                                         CRC);
              if(::IsWindow(Progress))
              {
                  int percent = offset > pCRCSt->size ? 100 : (int)(((double)offset / (double)pCRCSt->size) * 100);
                  ::PostMessage(Progress, PBM_SETPOS, percent, 0);
              }
          }
      }
      else if (pCRCSt->FileName)
      {   // calculate CRC for a file
          LONGLONG done = 0;
          UINT size = BUFFERSIZE;
          BYTE buffer[BUFFERSIZE];
  
          // Open the file
          int theFile = _tsopen(pCRCSt->FileName, _O_RDONLY | _O_SEQUENTIAL | _O_BINARY, _SH_DENYWR);
          if (theFile != -1)
          {   // Get the file size
              _lseeki64(theFile, 0L, SEEK_SET);
              LONGLONG length = _lseeki64(theFile, 0L, SEEK_END);
              _lseeki64(theFile, 0L, SEEK_SET);
          
              // process the file
              while (size == BUFFERSIZE)
              {
                  size = _read(theFile, buffer, BUFFERSIZE);
                  if (size)
                  {
                      pCRCSt->pCRC_32->Calculate(buffer, size, CRC);
                      if (::IsWindow(Progress))
                      {   // update the progress bar
                          done += size;
                          int percent = (int)(((long double)done / (long double)length) * 100);
                          ::PostMessage(Progress, PBM_SETPOS, percent, 0);
                      }
                  }
              }
              _close(theFile);
          }
      }
  
      CRC ^= 0xFFFFFFFF;
      
      if(IsWindow(Progress))
          // notify dialog that we are done
          ::PostMessage(::GetParent(Progress), WM_CRC_THREAD_DONE, (WPARAM)pCRCSt->Thread, CRC);
      
      // clean up
      // Known Problem : If the thread is prematurely terminated,
      // this cleanup code is never run, resulting in a memory leak.
      delete pCRCSt->pByte;
      delete pCRCSt;
  
      // return our CRC-32 value
      return CRC;
  }
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  CRC_32 constructor  (public member function)
  //    Sets up the CRC-32 reference table
  //
  //  Parameters :
  //    None
  //
  //  Returns :
  //    Nothing
  //
  /////////////////////////////////////////////////////////////////////////////
  
  CRC_32::CRC_32()
  {
      // This is the official polynomial used by CRC-32 
      // in PKZip, WinZip and Ethernet. 
      ULONG ulPolynomial = 0x04C11DB7;
  
      // 256 values representing ASCII character codes.
      for (int i = 0; i <= 0xFF; i++)
      {
          Table[i] = Reflect(i, 8) << 24;
          for (int j = 0; j < 8; j++)
              Table[i] = (Table[i] << 1) ^ (Table[i] & (1 << 31) ? ulPolynomial : 0);
          Table[i] = Reflect(Table[i], 32);
      }
  }
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  CRC_32::Reflect  (private member function)
  //    used by the constructor to help set up the CRC-32 reference table
  //
  //  Parameters :
  //    ref [in] : the value to be reflected
  //    ch  [in] : the number of bits to move
  //
  //  Returns :
  //    the new value
  //
  /////////////////////////////////////////////////////////////////////////////
  
  ULONG CRC_32::Reflect(ULONG ref, char ch)
  {
      ULONG value = 0;
  
      // Swap bit 0 for bit 7
      // bit 1 for bit 6, etc.
      for(int i = 1; i < (ch + 1); i++)
      {
          if (ref & 1)
              value |= 1 << (ch - i);
          ref >>= 1;
      }
      return value;
  }
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  CRC_32::Calculate  (private member function)
  //    Calculates the CRC-32 value for the given buffer
  //
  //  Parameters :
  //    buffer [in] : pointer to the data bytes
  //    size   [in] : the size of the buffer
  //    CRC    [in] : the initial CRC-32 value
  //          [out] : the new CRC-32 value
  //
  //  Returns :
  //    Nothing
  //
  /////////////////////////////////////////////////////////////////////////////
  
  void CRC_32::Calculate(const LPBYTE buffer, UINT size, ULONG &CRC)
  {   // calculate the CRC
      LPBYTE pbyte = buffer;
  
      while (size--)
          CRC = (CRC >> 8) ^ Table[(CRC & 0xFF) ^ *pbyte++];
  }
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  CRC_32::CalcCRC  (public member function)
  //    calculates the CRC-32 value for the given buffer
  //
  //  Parameters :
  //    buffer      [in] : a pointer to the data bytes
  //    size        [in] : the size of the buffer
  //    ProgressWnd [in] : the HWND of the progress bar
  //
  //  Returns :
  //    if ProgressWnd is not a window returns the CRC-32 value of the buffer
  //    if ProgressWnd is a window, returns the HANDLE of the created thread
  //    returns NULL if an error occurs
  //
  //  Note :
  //    ProgressWnd is passed through the IsWindow() API function. If IsWindow()
  //    returns zero, CalcCRC() will calculate the CRC-32 value directly. if IsWindow()
  //    returns nonzero, CalcCRC() will start a seperate thread. The thread will send 
  //    PBM_* progress bar messages to the ProgressWnd. When the thread is finished,
  //    the thread will send a WM_CRC_THREAD_DONE message to the parent window of the
  //    ProgressWnd. the WPARAM parameter will contain the HANDLE of the thread, and
  //    the LPARAM will contain the CRC-32 value of the buffer.
  //
  /////////////////////////////////////////////////////////////////////////////
  
  DWORD CRC_32::CalcCRC(LPVOID buffer, UINT size, HWND ProgressWnd/*= NULL*/)
  {   // check the validity of the data
      if (!buffer || !size)
          return 0;
  
      if (!IsWindow(ProgressWnd))
      {   // calculate CRC directly
          DWORD CRC = 0xFFFFFFFF;
          Calculate ((LPBYTE)buffer, size, CRC);
          return CRC ^ 0xFFFFFFFF;
      }
  
      // start the thread
      LPCRCStruct pCRCSt = new CRCStruct();
      DWORD ThreadID;
      HANDLE Handle = ::CreateThread(NULL, 0, CRC32ThreadProc, (LPVOID)pCRCSt, CREATE_SUSPENDED, &ThreadID);
      if (Handle)
      {   // thread successfully created
          pCRCSt->pCRC_32 = this;
          pCRCSt->FileName[0] = 0;
          pCRCSt->pByte = new BYTE[size];
          memcpy(pCRCSt->pByte, buffer, size);
          pCRCSt->size = size;
          pCRCSt->hWnd = ProgressWnd;
          pCRCSt->Thread = Handle;
          ::ResumeThread(Handle);
      }
      else // thread creation failed, clean up
          delete pCRCSt;
      return (DWORD)Handle;
  }
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  CRC_32::CalcCRC  (public member function)
  //    calculates the CRC-32 value for the given buffer
  //
  //  Parameters :
  //    FileName    [in] : the complete path to the file
  //    ProgressWnd [in] : the HWND of the progress bar
  //
  //  Returns :
  //    if ProgressWnd is not a window returns the CRC-32 value of the file
  //    if ProgressWnd is a window, returns the HANDLE of the created thread
  //    returns NULL if an error occurs
  //
  //  Note :
  //    ProgressWnd is passed through the IsWindow() API function. If IsWindow()
  //    returns zero, CalcCRC() will calculate the CRC-32 value directly. if IsWindow()
  //    returns nonzero, CalcCRC() will start a seperate thread. The thread will send 
  //    PBM_* progress bar messages to the ProgressWnd. When the thread is finished,
  //    the thread will send a WM_CRC_THREAD_DONE message to the parent window of the
  //    ProgressWnd. the WPARAM parameter will contain the HANDLE of the thread, and
  //    the LPARAM will contain the CRC-32 value of the file.
  //
  /////////////////////////////////////////////////////////////////////////////
  
  DWORD CRC_32::CalcCRC(LPCTSTR FileName, HWND ProgressWnd/*= NULL*/)
  {   // make sure the file exists and is not a directory
      DWORD attrib = ::GetFileAttributes(FileName);
      if (attrib == 0xFFFFFFFF || attrib & FILE_ATTRIBUTE_DIRECTORY)
          return 0;
  
      // setup the CRCStruct
      LPCRCStruct pCRCSt = new CRCStruct();
      pCRCSt->pCRC_32 = this;
      _tcsncpy(pCRCSt->FileName, FileName, _MAX_PATH);
      pCRCSt->pByte = NULL;
      pCRCSt->size = 0;
      pCRCSt->hWnd = ProgressWnd;
      pCRCSt->Thread = NULL;
  
      if (!IsWindow(ProgressWnd))
      {   // calculate CRC directly
          return CRC32ThreadProc((LPVOID)pCRCSt);
      }
  
      // start the thread
      DWORD ThreadID;
      HANDLE Handle = ::CreateThread(NULL, 0, CRC32ThreadProc, (LPVOID)pCRCSt, CREATE_SUSPENDED, &ThreadID);
      if (Handle)
      {   // thread successfully created
          pCRCSt->Thread = Handle;
          ::ResumeThread(Handle);
      }
      else // thread creation failed, clean up
          delete pCRCSt;
      return (DWORD)Handle;
  }
  
  /////////////////////////////////////////////////////////////////////////////
  //
  //  End of CRC_32.cpp
  //
  /////////////////////////////////////////////////////////////////////////////
2
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.04.2012, 22:17  [ТС]
А можно рабочий пример?
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
15.04.2012, 22:26
где хранить crc-сумму?

Добавлено через 5 минут
дописывать в конец exe?
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.04.2012, 22:31  [ТС]
Мне нужно что бы программа при компиляции запоминала свою сумму и при её изменении выводила сообщение
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
15.04.2012, 22:46
вообщем, вот как я понял:
1) скомпилировать программу
2) другой программой посчитать её контрольную сумму, дописать в неё определенное кол-во NULL-ов (назовем это "сигнатурой") и подсчитанную контрольную сумму.
3) при запуске программы искать c конца .exe-файла место, где начинается "сигнатура".
4) считать контрольную сумму, находящейся после "сигнатуры"
5) считать данные, находящиеся до "сигнатуры", и найти её контрольную сумму.
6) сравнить контрольные суммы, в случае несовпадения выдать предупреждение.
по крайней мере, такое реализовано в радмине.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.04.2012, 23:03
Эх, вот если бы все программы делали такую проверку, насколько проще стала бы жизнь!
Представьте: активное заражение, каждый исполняемый модуль перед запуском дописывается вирусным кодом... и в счастливое лицо пользователя летит миллиард предупреждений, оповещений, некоторые программы даже снабжают это дело звуками и пиротехникой!
Прямо-таки салют в честь вируса
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.04.2012, 23:07
Теперь вирусу незачем внедрятся в программу что бы досадить пользователю ему достаточно дописать один байт в программе :dance3:
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
15.04.2012, 23:37
впринципе, данная проверка может быть полезна для того, чтобы предупредить пользователя о том, что программа была изменена.
это может быть вирус, при этом у пользователя может стоять антивирус, который бы не видел этот вирус.
данная проверка предупредит пользователя и он выполнит всё необходимое, чтобы избавится от этого вируса.
можно еще помимо предупреждения предложить перекачать .exe файл с сайта.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.04.2012, 00:18  [ТС]
Не все же такие продвинутые пользователи - много есть вирусов которые портят *.exe файлы и портят антивирусные программы....а если у человека и выскочит message box что программа изменила свой размер и т.д...хуже то не будет, как говорится предупрежден - значит вооружен.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
16.04.2012, 00:35
Если в ПО можно изменить пару байтов, значит можно заменить хоть все, поэтому использовать данный способ как защиту невозможно. Выводить предупреждение вполне реально, и врядли вирус будет искать нечто подобное в вашем приложении, проблема в другом - если оно запущено, то значит вирус начал свое действие. В таких случаях не мешает в readme файле сообщать данные о своем ПО, точный размер, crc, md5 и т.п. Но лучше подобную информацию хранить на офф сайте, ибо вирусу необходимо как-то попасть на компьютер, имхо свою "нотку безопасности" нужно "проигрывать" именно так.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.04.2012, 01:34
Протестировал ранее приведенный пример класса CRC_32
Правда пришлось пошарится по хедерах Visual C++ ( По таму как ни в RAD,не Qt- хедерах небыло) что бы найти определения констант
C++
1
2
#define _O_SEQUENTIAL   0x0020   
#define _SH_DENYWR      0x20
Вот прилагаю пример
Вложения
Тип файла: rar Подсчет суммы CRC32.rar (72.8 Кб, 121 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2012, 01:34
Помогаю со студенческими работами здесь

Расчет Контрольной суммы CRC части файла
имеем файл OSC_13.nbf первые 42 байта - это заголовок, где описано, для какого устройства, какая версия и какой язык в прошивке. ...

Как объединить (сделать конкатенацию) две CRC суммы?
Добрый день. Я передаю пакет по частям. и использую для вычесления контрольной суммы пакета библиотеку boost (16 bits). Я получаю...

Как узнать CRC запускаемой программы?
Есть программа. Допустим я ее запустил. Есть ли способы узнать CRC запущенной мною программы? Либо не CRC, а хеш, тоже сойдет. Еще на...

Проверка суммы нового заказа с остатком суммы договора
Приветствую форумчане! Не откажите в помощи. Нахожусь в самом начале изучения Access. Переделал под свои условия базу Борей. --У...

Проверка суммы слагаемых
Здравствуйте, есть три числа, если третье число больше нуля, то как запретить в сумме первых двух чисел быть меньше пяти? На форме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru