| Guest | 
| Отправлено: 11.12.2005, 23:10 | 
 
 
 | 
 
  
Не зарегистрирован
 
 
 
 
 
  
  
 | 
 Как однозначно распознать исполнимый файл, без привязки к его названию  | 
 
  | 
 
| Gedeon | 
| Отправлено: 12.12.2005, 08:46 | 
 
 
 | 
 
 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1742 
  
  
 | 
 MD5 и иже с ним ...
  
Отредактировано Gedeon — 12/12/2005, 08:47
 | 
 
  | 
 
| Guest | 
| Отправлено: 13.12.2005, 00:37 | 
 
 
 | 
 
  
Не зарегистрирован
 
 
 
 
 
  
  
 | 
 | QUOTE  |   
MD5 и иже с ним ... 
 |  
 
  
что это значит ?  | 
 
  | 
 
| Gedeon | 
| Отправлено: 13.12.2005, 12:44 | 
 
 
 | 
 
 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1742 
  
  
 | 
 Вот до чего же народ ленивый, у гугла тяжело спросить?
  
Вот прямо из МСДН пример 
| QUOTE  |  The following example demonstrates using CryptoAPI to compute the MD-5 hash of the contents of a file. This example performs the computation on the contents of a file specified at run time.
  
 |  
  
| CODE  |   
#include <stdio.h> 
#include <windows.h> 
#include <wincrypt.h>
  
#define BUFSIZE 1024 
#define MD5LEN  16
  
DWORD main(int argc, char *argv[]) 
{ 
   DWORD dwStatus = 0; 
   BOOL bResult = FALSE; 
   HCRYPTPROV hProv = 0; 
   HCRYPTHASH hHash = 0; 
   HANDLE hFile = NULL; 
   BYTE rgbFile[BUFSIZE]; 
   DWORD cbRead = 0; 
   BYTE rgbHash[MD5LEN]; 
   DWORD cbHash = 0; 
   CHAR rgbDigits[] = "0123456789abcdef";
  
   //Logic to check usage goes here.
  
   hFile = CreateFile(argv[1], 
       GENERIC_READ, 
       FILE_SHARE_READ, 
       NULL, 
       OPEN_EXISTING, 
       FILE_FLAG_SEQUENTIAL_SCAN, 
       NULL);
  
   if (INVALID_HANDLE_VALUE == hFile) 
   { 
       dwStatus = GetLastError(); 
       printf("Error opening file %s\nError: %d\n", argv[1], dwStatus); 
       return dwStatus; 
   }
  
   //Get handle to the crypto provider 
   if (!CryptAcquireContext(&hProv, 
       NULL, 
       NULL, 
       PROV_RSA_FULL, 
       CRYPT_VERIFYCONTEXT)) 
   { 
       dwStatus = GetLastError(); 
       printf("CryptAcquireContext failed: %d\n", dwStatus); 
       CloseHandle(hFile); 
       return dwStatus; 
   }
  
   if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) 
   { 
       dwStatus = GetLastError(); 
       printf("CryptAcquireContext failed: %d\n", dwStatus); 
       CloseHandle(hFile); 
       CryptReleaseContext(hProv, 0); 
       return dwStatus; 
   }
  
   while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, &cbRead, NULL)) 
   { 
       if (0 == cbRead) 
       { 
           break; 
       }
  
       if (!CryptHashData(hHash, rgbFile, cbRead, 0)) 
       { 
           dwStatus = GetLastError(); 
           printf("CryptHashData failed: %d\n", dwStatus); 
           CryptReleaseContext(hProv, 0); 
           CryptDestroyHash(hHash); 
           CloseHandle(hFile); 
           return dwStatus; 
       } 
   }
  
   if (!bResult) 
   { 
       dwStatus = GetLastError(); 
       printf("ReadFile failed: %d\n", dwStatus); 
       CryptReleaseContext(hProv, 0); 
       CryptDestroyHash(hHash); 
       CloseHandle(hFile); 
       return dwStatus; 
   }
  
   cbHash = MD5LEN; 
   if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) 
   { 
       printf("MD5 hash of file %s is: ", argv[1]); 
       for (DWORD i = 0; i < cbHash; i++) 
       { 
           printf("%c%c", rgbDigits[rgbHash[i] >> 4], 
               rgbDigits[rgbHash[i] & 0xf]); 
       } 
       printf("\n"); 
   } 
   else 
   { 
       dwStatus = GetLastError(); 
       printf("CryptGetHashParam failed: %d\n", dwStatus); 
   }
  
   CryptDestroyHash(hHash); 
   CryptReleaseContext(hProv, 0); 
   CloseHandle(hFile);
  
   return dwStatus;   
 |   
 | 
 
  | 
 
| Guest | 
| Отправлено: 13.12.2005, 13:08 | 
 
 
 | 
 
  
Не зарегистрирован
 
 
 
 
 
  
  
 | 
 | QUOTE  |   
Как однозначно распознать исполнимый файл, без привязки к его названию 
 |  
  
А я бы начал с анализа нескольких первых байт (для exe) 
Но вы помните что исполняемый файл может быть самым разным: com / exe / bat / dll / скрипты для разных интерпритаторов / ...  | 
 
  | 
 
  |