?? validcrc.c
字號:
/*
VALIDCRC.C
這個模塊的作用是驗證連接的程序的CRC。
代碼是一個防病毒算法。CRC是一個檢測病毒入侵的非常有效的辦法。
任何病毒如果把它自身嵌入程序必然會改變源代碼的CRC。
*/
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "viruscrc.h"
/* 從一個字取得低字節和高字節的宏. */
#define lowb(x) (*(unsigned char *)&(x))
#define hib(x) (*((unsigned char *)&(x) + 1))
/* 從一個雙字取得低字和高字的宏. */
#define loww(x) (*(unsigned short *)&(x))
#define hiw(x) (*((unsigned short *)&(x) + 1))
void *bufalloc(size_t *size, size_t minsize);
#if defined(__TURBOC__)
#include <dir.h>
#define findprog(progname, pn) strcpy(pn, searchpath(progname))
#define argv0 _argv[0]
#elif defined(_MSC_VER) || defined(_QC)
#define findprog(progname, pn) _searchenv(progname, getenv("PATH"), pn)
extern char **__argv;
#define argv0 __argv[0]
#else
#error Unknown compiler.
#endif
/***/
/* 計算當前激活的程序的CRC,并且把它和在_viruscrc保存的CRC比較. */
int validatecrc(const char *progname)
{
int retcode; /* 函數返回碼 */
if (_viruscrc.x.polynomial != 0)
{
unsigned char *buffer; /* 程序位圖的緩存 */
size_t bufsize; /* 緩存的大小. */
/* 如果可能,分配8k的內存;至少保證分配512字節. */
bufsize = 8192;
buffer = bufalloc(&bufsize, 512);
if (buffer)
{
char pn[80]; /* 程序的全名 */
FILE *progfile; /* 文件指針 */
if (_osmajor < 3)
/* 根據在progname指定的路徑搜索文件. */
findprog(progname, pn);
else
strcpy(pn, argv0);
if ((progfile = fopen(pn, "rb")) != NULL)
{
crc32_t table[256]; /* CRC表 */
register crc32_t *halfi; /* i/2的CRC指針 */
crc32_t crc; /* 當前的CRC */
register size_t i; /* 字節計數器. */
unsigned char *bufptr; /* 緩存區遍歷指針 */
/* 為了快速計算機生成一長CRC查找表 */
for (i = 0, halfi = table, table[0] = 0; i < 256; i += 2, halfi++)
if (hib(hiw(*halfi)) & 0x80)
table[i] = (table[i + 1] = *halfi << 1) ^ _viruscrc.x.polynomial;
else
table[i + 1] = (table[i] = *halfi << 1) ^ _viruscrc.x.polynomial;
crc = 0;
while ((i = fread(buffer, 1, bufsize, progfile)) != 0)
for (bufptr = buffer; i--; bufptr++)
crc = (crc << 8) ^ table[hib(hiw(crc)) ^ *bufptr];
fclose(progfile);
retcode = crc == _viruscrc.x.crc ? CRC_VALID : CRC_INVALID;
}
else
retcode = CRC_FILEERR;
free(buffer);
}
else
retcode = CRC_NOMEM;
}
else
/* CRC多項式必須不為0 */
retcode = CRC_ISZERO;
return (retcode);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -