C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
распознать исполнимый файл, как ?
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 / скрипты для разных интерпритаторов / ...

Вернуться в Вопросы программирования в C++Builder