|
|
|
@ -76,7 +76,7 @@ int cli_scanbuff(const unsigned char *buffer, uint32_t length, uint32_t offset, |
|
|
|
|
if(!acdata && (ret = cli_ac_initdata(&mdata, troot->ac_partsigs, troot->ac_lsigs, troot->ac_reloff_num, CLI_DEFAULT_AC_TRACKLEN))) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
if(troot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, troot, offset, -1, NULL)) != CL_VIRUS) |
|
|
|
|
if(troot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, troot, offset, -1, NULL)) != CL_VIRUS) |
|
|
|
|
ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, troot, acdata ? (acdata[0]) : (&mdata), offset, ftype, NULL, AC_SCAN_VIR, NULL); |
|
|
|
|
|
|
|
|
|
if(!acdata) |
|
|
|
@ -89,7 +89,7 @@ int cli_scanbuff(const unsigned char *buffer, uint32_t length, uint32_t offset, |
|
|
|
|
if(!acdata && (ret = cli_ac_initdata(&mdata, groot->ac_partsigs, groot->ac_lsigs, groot->ac_reloff_num, CLI_DEFAULT_AC_TRACKLEN))) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
if(groot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, groot, offset, -1, NULL)) != CL_VIRUS) |
|
|
|
|
if(groot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, groot, offset, -1, NULL)) != CL_VIRUS) |
|
|
|
|
ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, groot, acdata ? (acdata[1]) : (&mdata), offset, ftype, NULL, AC_SCAN_VIR, NULL); |
|
|
|
|
|
|
|
|
|
if(!acdata) |
|
|
|
@ -292,6 +292,7 @@ int cli_checkfp(int fd, cli_ctx *ctx) |
|
|
|
|
const char *virname; |
|
|
|
|
off_t pos; |
|
|
|
|
struct stat sb; |
|
|
|
|
const struct cli_bm_patt *patt = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if((pos = lseek(fd, 0, SEEK_CUR)) == -1) { |
|
|
|
@ -302,25 +303,29 @@ int cli_checkfp(int fd, cli_ctx *ctx) |
|
|
|
|
lseek(fd, 0, SEEK_SET); |
|
|
|
|
|
|
|
|
|
if(ctx->engine->md5_fp) { |
|
|
|
|
if(fstat(fd, &sb) == -1) { |
|
|
|
|
cli_errmsg("cli_checkfp(): fstat(%d) failed\n", fd); |
|
|
|
|
lseek(fd, pos, SEEK_SET); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(!(digest = cli_md5digest(fd))) { |
|
|
|
|
cli_errmsg("cli_checkfp(): Can't generate MD5 checksum\n"); |
|
|
|
|
lseek(fd, pos, SEEK_SET); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(cli_bm_scanbuff(digest, 16, &virname, ctx->engine->md5_fp, 0, -1, NULL) == CL_VIRUS) { |
|
|
|
|
if(cli_bm_scanbuff(digest, 16, &virname, &patt, ctx->engine->md5_fp, 0, -1, NULL) == CL_VIRUS && patt->filesize == sb.st_size) { |
|
|
|
|
cli_dbgmsg("cli_checkfp(): Found false positive detection (fp sig: %s)\n", virname); |
|
|
|
|
free(digest); |
|
|
|
|
lseek(fd, pos, SEEK_SET); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(fstat(fd, &sb) != -1) { |
|
|
|
|
for(i = 0; i < 16; i++) |
|
|
|
|
sprintf(md5 + i * 2, "%02x", digest[i]); |
|
|
|
|
md5[32] = 0; |
|
|
|
|
cli_dbgmsg("FP SIGNATURE: %s:%u:%s\n", md5, (unsigned int) sb.st_size, *ctx->virname ? *ctx->virname : "Name"); |
|
|
|
|
} |
|
|
|
|
for(i = 0; i < 16; i++) |
|
|
|
|
sprintf(md5 + i * 2, "%02x", digest[i]); |
|
|
|
|
md5[32] = 0; |
|
|
|
|
cli_dbgmsg("FP SIGNATURE: %s:%u:%s\n", md5, (unsigned int) sb.st_size, *ctx->virname ? *ctx->virname : "Name"); |
|
|
|
|
|
|
|
|
|
free(digest); |
|
|
|
|
} |
|
|
|
@ -425,7 +430,7 @@ int cli_scandesc(int desc, cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struc |
|
|
|
|
length += maxpatlen; |
|
|
|
|
|
|
|
|
|
if(troot) { |
|
|
|
|
if(troot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, troot, offset, desc, bm_offmode ? &toff : NULL)) != CL_VIRUS) |
|
|
|
|
if(troot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, NULL, troot, offset, desc, bm_offmode ? &toff : NULL)) != CL_VIRUS) |
|
|
|
|
ret = cli_ac_scanbuff(upt, length, ctx->virname, NULL, NULL, troot, &tdata, offset, ftype, ftoffset, acmode, NULL); |
|
|
|
|
|
|
|
|
|
if(ret == CL_VIRUS) { |
|
|
|
@ -440,7 +445,7 @@ int cli_scandesc(int desc, cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struc |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(!ftonly) { |
|
|
|
|
if(groot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, groot, offset, desc, NULL)) != CL_VIRUS) |
|
|
|
|
if(groot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, NULL, groot, offset, desc, NULL)) != CL_VIRUS) |
|
|
|
|
ret = cli_ac_scanbuff(upt, length, ctx->virname, NULL, NULL, groot, &gdata, offset, ftype, ftoffset, acmode, NULL); |
|
|
|
|
|
|
|
|
|
if(ret == CL_VIRUS) { |
|
|
|
@ -514,8 +519,10 @@ int cli_scandesc(int desc, cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struc |
|
|
|
|
return CL_VIRUS; |
|
|
|
|
|
|
|
|
|
if(!ftonly && ctx->engine->md5_hdb) { |
|
|
|
|
const struct cli_bm_patt *patt; |
|
|
|
|
cli_md5_final(digest, &md5ctx); |
|
|
|
|
if(cli_bm_scanbuff(digest, 16, ctx->virname, ctx->engine->md5_hdb, 0, -1, NULL) == CL_VIRUS && (cli_bm_scanbuff(digest, 16, NULL, ctx->engine->md5_fp, 0, -1, NULL) != CL_VIRUS)) |
|
|
|
|
fstat(desc, &sb); |
|
|
|
|
if(cli_bm_scanbuff(digest, 16, ctx->virname, &patt, ctx->engine->md5_hdb, 0, -1, NULL) == CL_VIRUS && patt->filesize == sb.st_size && (cli_bm_scanbuff(digest, 16, NULL, &patt, ctx->engine->md5_fp, 0, -1, NULL) != CL_VIRUS || patt->filesize != sb.st_size)) |
|
|
|
|
return CL_VIRUS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|