首页
社区
课程
招聘
[求助]MD5问题
发表于: 2014-1-23 04:11 9680

[求助]MD5问题

2014-1-23 04:11
9680


捷报:: 问题已经解决,原因是:

计算MD5的代码所用到的变量,全都定义成全局的了.而我hook的是zwcreatesection........没有考虑到多线程的情况.所以偶尔出现计算MD5出错,偶尔又正常的情况.




想在驱动中根据MD5拦截进程创建 ,但是貌似计算MD5的代码有问题:

#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

#define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y))))  

#define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)  //PP(aabbccdd)=ddccbbaa

#define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s))
#define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s))
#define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s))
#define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s))

ULONG A,B,C,D,a,b,c,d,i,flen[2],x[16];  
LARGE_INTEGER len;


void md5(){              

	a=A,b=B,c=C,d=D;
	/**//* Round 1 */
	FF (a, b, c, d, x[ 0],  7, 0xd76aa478); /**//* 1 */
	FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /**//* 2 */
	FF (c, d, a, b, x[ 2], 17, 0x242070db); /**//* 3 */
	FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /**//* 4 */
	FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); /**//* 5 */
	FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /**//* 6 */
	FF (c, d, a, b, x[ 6], 17, 0xa8304613); /**//* 7 */
	FF (b, c, d, a, x[ 7], 22, 0xfd469501); /**//* 8 */
	FF (a, b, c, d, x[ 8],  7, 0x698098d8); /**//* 9 */
	FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /**//* 10 */
	FF (c, d, a, b, x[10], 17, 0xffff5bb1); /**//* 11 */
	FF (b, c, d, a, x[11], 22, 0x895cd7be); /**//* 12 */
	FF (a, b, c, d, x[12],  7, 0x6b901122); /**//* 13 */
	FF (d, a, b, c, x[13], 12, 0xfd987193); /**//* 14 */
	FF (c, d, a, b, x[14], 17, 0xa679438e); /**//* 15 */
	FF (b, c, d, a, x[15], 22, 0x49b40821); /**//* 16 */

	/**//* Round 2 */
	GG (a, b, c, d, x[ 1],  5, 0xf61e2562); /**//* 17 */
	GG (d, a, b, c, x[ 6],  9, 0xc040b340); /**//* 18 */
	GG (c, d, a, b, x[11], 14, 0x265e5a51); /**//* 19 */
	GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /**//* 20 */
	GG (a, b, c, d, x[ 5],  5, 0xd62f105d); /**//* 21 */
	GG (d, a, b, c, x[10],  9, 0x02441453); /**//* 22 */
	GG (c, d, a, b, x[15], 14, 0xd8a1e681); /**//* 23 */
	GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /**//* 24 */
	GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); /**//* 25 */
	GG (d, a, b, c, x[14],  9, 0xc33707d6); /**//* 26 */
	GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /**//* 27 */
	GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /**//* 28 */
	GG (a, b, c, d, x[13],  5, 0xa9e3e905); /**//* 29 */
	GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); /**//* 30 */
	GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /**//* 31 */
	GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /**//* 32 */

	/**//* Round 3 */
	HH (a, b, c, d, x[ 5],  4, 0xfffa3942); /**//* 33 */
	HH (d, a, b, c, x[ 8], 11, 0x8771f681); /**//* 34 */
	HH (c, d, a, b, x[11], 16, 0x6d9d6122); /**//* 35 */
	HH (b, c, d, a, x[14], 23, 0xfde5380c); /**//* 36 */
	HH (a, b, c, d, x[ 1],  4, 0xa4beea44); /**//* 37 */
	HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /**//* 38 */
	HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /**//* 39 */
	HH (b, c, d, a, x[10], 23, 0xbebfbc70); /**//* 40 */
	HH (a, b, c, d, x[13],  4, 0x289b7ec6); /**//* 41 */
	HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /**//* 42 */
	HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /**//* 43 */
	HH (b, c, d, a, x[ 6], 23, 0x04881d05); /**//* 44 */
	HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); /**//* 45 */
	HH (d, a, b, c, x[12], 11, 0xe6db99e5); /**//* 46 */
	HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /**//* 47 */
	HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /**//* 48 */

	/**//* Round 4 */
	II (a, b, c, d, x[ 0],  6, 0xf4292244); /**//* 49 */
	II (d, a, b, c, x[ 7], 10, 0x432aff97); /**//* 50 */
	II (c, d, a, b, x[14], 15, 0xab9423a7); /**//* 51 */
	II (b, c, d, a, x[ 5], 21, 0xfc93a039); /**//* 52 */
	II (a, b, c, d, x[12],  6, 0x655b59c3); /**//* 53 */
	II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /**//* 54 */
	II (c, d, a, b, x[10], 15, 0xffeff47d); /**//* 55 */
	II (b, c, d, a, x[ 1], 21, 0x85845dd1); /**//* 56 */
	II (a, b, c, d, x[ 8],  6, 0x6fa87e4f); /**//* 57 */
	II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /**//* 58 */
	II (c, d, a, b, x[ 6], 15, 0xa3014314); /**//* 59 */
	II (b, c, d, a, x[13], 21, 0x4e0811a1); /**//* 60 */
	II (a, b, c, d, x[ 4],  6, 0xf7537e82); /**//* 61 */
	II (d, a, b, c, x[11], 10, 0xbd3af235); /**//* 62 */
	II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /**//* 63 */
	II (b, c, d, a, x[ 9], 21, 0xeb86d391); /**//* 64 */

	A += a;
	B += b;
	C += c;
	D += d;

}

BOOLEAN getFileMD5(IN HANDLE file,OUT UCHAR* szMD5)
{

	int length=64;
	LARGE_INTEGER offset={0};
	IO_STATUS_BLOCK io_status={0};
	NTSTATUS status;
	FILE_STANDARD_INFORMATION fsi;

	memset(&fsi,0,sizeof(FILE_STANDARD_INFORMATION));

	status=ZwQueryInformationFile (file, &io_status, &fsi, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);
	if(!NT_SUCCESS(status))
	{
		return FALSE;
	}

	len = fsi.EndOfFile;
	A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; 

	flen[1]=(ULONG)len.QuadPart/0x20000000;     
	flen[0]=(len.QuadPart%0x20000000)*8;

	while(1){

		status = ZwReadFile(file,NULL,NULL,NULL,&io_status,x,length,&offset,NULL);
		if(!NT_SUCCESS(status))
		{
			if(status == STATUS_END_OF_FILE)
			{
				status = STATUS_SUCCESS;
			}else
			{
				return FALSE;
			}
			break;
		}
		md5();
		memset(x,0,length);
		length = io_status.Information;
		offset.QuadPart += length;
	}

	((char*)x)[len.QuadPart%64]=128;
	if(len.QuadPart%64>55) 
	{
		md5();
		memset(x,0,64);
	}
	memcpy(x+14,flen,8); 
	md5();	
	//RtlStringCbPrintfA((NTSTRSAFE_PSTR)szMD5,33,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));
	sprintf(szMD5,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));
	return TRUE;
}


这份代码是根据别人应用层计算MD5的代码翻译过来的,原代码如下:

// md5.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include<stdio.h>
#include <string.h>

#pragma warning( disable : 4996)


#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

#define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y))))  //x向左循环移y位

#define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)  //将x高低位互换,例如PP(aabbccdd)=ddccbbaa

#define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s))
#define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s))
#define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s))
#define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s))

unsigned A,B,C,D,a,b,c,d,i,len,flen[2],x[16];   //i临时变量,len文件长,flen[2]为64位二进制表示的文件初始长度
char filename[200];   //文件名
FILE *fp;

void md5(){                 //MD5核心算法,供64轮

	a=A,b=B,c=C,d=D;
	/**//* Round 1 */
	FF (a, b, c, d, x[ 0],  7, 0xd76aa478); /**//* 1 */
	FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /**//* 2 */
	FF (c, d, a, b, x[ 2], 17, 0x242070db); /**//* 3 */
	FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /**//* 4 */
	FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); /**//* 5 */
	FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /**//* 6 */
	FF (c, d, a, b, x[ 6], 17, 0xa8304613); /**//* 7 */
	FF (b, c, d, a, x[ 7], 22, 0xfd469501); /**//* 8 */
	FF (a, b, c, d, x[ 8],  7, 0x698098d8); /**//* 9 */
	FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /**//* 10 */
	FF (c, d, a, b, x[10], 17, 0xffff5bb1); /**//* 11 */
	FF (b, c, d, a, x[11], 22, 0x895cd7be); /**//* 12 */
	FF (a, b, c, d, x[12],  7, 0x6b901122); /**//* 13 */
	FF (d, a, b, c, x[13], 12, 0xfd987193); /**//* 14 */
	FF (c, d, a, b, x[14], 17, 0xa679438e); /**//* 15 */
	FF (b, c, d, a, x[15], 22, 0x49b40821); /**//* 16 */

	/**//* Round 2 */
	GG (a, b, c, d, x[ 1],  5, 0xf61e2562); /**//* 17 */
	GG (d, a, b, c, x[ 6],  9, 0xc040b340); /**//* 18 */
	GG (c, d, a, b, x[11], 14, 0x265e5a51); /**//* 19 */
	GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /**//* 20 */
	GG (a, b, c, d, x[ 5],  5, 0xd62f105d); /**//* 21 */
	GG (d, a, b, c, x[10],  9, 0x02441453); /**//* 22 */
	GG (c, d, a, b, x[15], 14, 0xd8a1e681); /**//* 23 */
	GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /**//* 24 */
	GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); /**//* 25 */
	GG (d, a, b, c, x[14],  9, 0xc33707d6); /**//* 26 */
	GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /**//* 27 */
	GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /**//* 28 */
	GG (a, b, c, d, x[13],  5, 0xa9e3e905); /**//* 29 */
	GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); /**//* 30 */
	GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /**//* 31 */
	GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /**//* 32 */

	/**//* Round 3 */
	HH (a, b, c, d, x[ 5],  4, 0xfffa3942); /**//* 33 */
	HH (d, a, b, c, x[ 8], 11, 0x8771f681); /**//* 34 */
	HH (c, d, a, b, x[11], 16, 0x6d9d6122); /**//* 35 */
	HH (b, c, d, a, x[14], 23, 0xfde5380c); /**//* 36 */
	HH (a, b, c, d, x[ 1],  4, 0xa4beea44); /**//* 37 */
	HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /**//* 38 */
	HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /**//* 39 */
	HH (b, c, d, a, x[10], 23, 0xbebfbc70); /**//* 40 */
	HH (a, b, c, d, x[13],  4, 0x289b7ec6); /**//* 41 */
	HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /**//* 42 */
	HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /**//* 43 */
	HH (b, c, d, a, x[ 6], 23, 0x04881d05); /**//* 44 */
	HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); /**//* 45 */
	HH (d, a, b, c, x[12], 11, 0xe6db99e5); /**//* 46 */
	HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /**//* 47 */
	HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /**//* 48 */

	/**//* Round 4 */
	II (a, b, c, d, x[ 0],  6, 0xf4292244); /**//* 49 */
	II (d, a, b, c, x[ 7], 10, 0x432aff97); /**//* 50 */
	II (c, d, a, b, x[14], 15, 0xab9423a7); /**//* 51 */
	II (b, c, d, a, x[ 5], 21, 0xfc93a039); /**//* 52 */
	II (a, b, c, d, x[12],  6, 0x655b59c3); /**//* 53 */
	II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /**//* 54 */
	II (c, d, a, b, x[10], 15, 0xffeff47d); /**//* 55 */
	II (b, c, d, a, x[ 1], 21, 0x85845dd1); /**//* 56 */
	II (a, b, c, d, x[ 8],  6, 0x6fa87e4f); /**//* 57 */
	II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /**//* 58 */
	II (c, d, a, b, x[ 6], 15, 0xa3014314); /**//* 59 */
	II (b, c, d, a, x[13], 21, 0x4e0811a1); /**//* 60 */
	II (a, b, c, d, x[ 4],  6, 0xf7537e82); /**//* 61 */
	II (d, a, b, c, x[11], 10, 0xbd3af235); /**//* 62 */
	II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /**//* 63 */
	II (b, c, d, a, x[ 9], 21, 0xeb86d391); /**//* 64 */

	A += a;
	B += b;
	C += c;
	D += d;

}



int _tmain(int argc, _TCHAR* argv[])
{
	while(1){
		printf("Input file:");
		gets(filename);    //用get函数,避免scanf以空格分割数据,
		if (filename[0]==34) filename[strlen(filename)-1]=0,strcpy(filename,filename+1);  //支持文件拖曳,但会多出双引号,这里是处理多余的双引号
		if (!strcmp(filename,"exit")) return 0;  //输入exit退出
		if (!(fp=fopen(filename,"rb"))) {printf("Can not open this file!\n");continue;}  //以二进制打开文件
		fseek(fp, 0, SEEK_END);  //文件指针转到文件末尾
		if((len=ftell(fp))==-1) {printf("Sorry! Can not calculate files which larger than 2 GB!\n");fclose(fp);continue;}  //ftell函数返回long,最大为2GB,超出返回-1
		rewind(fp);  //文件指针复位到文件头
		printf("%d\n",len);
		A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链接变量
		flen[1]=len/0x20000000;     //flen单位是bit
		flen[0]=(len%0x20000000)*8;
		memset(x,0,64);   //初始化x数组为0
		fread(&x,4,16,fp);  //以4字节为一组,读取16组数据
		for(i=0;i<len/64;i++){    //循环运算直至文件结束
			md5();
			memset(x,0,64);
			fread(&x,4,16,fp);
		}
		((char*)x)[len%64]=128;  //文件结束补1,补0操作,128二进制即10000000
		if(len%64>55) md5(),memset(x,0,64);
		memcpy(x+14,flen,8);    //文件末尾加入原文件的bit长度
		md5();
		fclose(fp);
		printf("MD5 Code:%08x%08x%08x%08x\n",PP(A),PP(B),PP(C),PP(D));  //高低位逆反输出
	}
	return 0;
}



这份应用层的代码是没有问题的,但是翻译成驱动代码之后, 某些文件不能正确计算出正确地MD5,感觉问题好像是出在读取文件数据的地方.

用来测试的文件:

test.zip

(这个文件,用应用层的那个代码,可以正确计算,但是驱动代码算出的是错误的,注意不是计算这个zip文件,是解压出来之后的那个文件)

求大牛帮助!本人最怕算法之类的了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不会把拦截到的进程信息返回给用户层进行处理吗
2014-1-23 12:08
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
ZwReadFile?
直接用内存映射的方式读取试试...
2014-1-23 12:53
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在内核测试一下你的md5库,用简单的字符串来验证算法的正确性。如果md5库错了就查md5的错,否则就是你用来验证的文件内容和你应用层的文件内容不是一个内容
2014-1-23 13:32
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
根据描述。 这应该和算法没有关系 。 应该是读取文件的时候不正确。
2014-1-23 14:54
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我这个程序并不需要跟用户交互      

当然了    如果真的解决不了    还是让应用层来算MD5好了
2014-1-23 23:22
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
找个肯定能用的MD5库,直接算是没问题的,我写过个minifilter,所有PE都算MD5,也没出过问题。
2014-1-27 18:42
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问大致思路是什么呢?

我也试过用minifilter来计算pe文件MD5 然后根据黑名单判断要不要放行,但是对系统有很大影响

我的流程是这样的:  

在PreCreate里根据文件格式来检测是否是PE文件,不是的话,直接放行.

如果是PE文件,检测是不是DLL,如果是DLL,也放行,剩下的就是EXE和SYS了.

就算我仅仅只检测EXE和SYS,读取文件计算MD5的时候也非常卡. 瓶颈主要在于: 无法判断 当前对EXE或SYS的 "读" , 到底是普通的读,还是EXE执行之前的"读".  比如打开system32文件夹,explorer.exe会有很多的create操作,那我的precreate函数就频繁被调用.

尝试过 if(Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess&GENERIC_EXECUTE!=0)   这样来判断打开文件的权限是否有设置GENERIC_EXECUTE标志,但是发现这样不准确,很多操作都带有这个标识.
2014-1-27 21:40
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
只要在映射PE的时候计算就行,不用打开的时候计算,参考这个IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
2014-1-27 22:05
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
typedef union _FLT_PARAMETERS {
  ...    ;
  struct {
    FS_FILTER_SECTION_SYNC_TYPE SyncType;
    ULONG POINTER_ALIGNMENT     PageProtection;
  } AcquireForSectionSynchronization;
  ...    ;
} FLT_PARAMETERS, *PFLT_PARAMETERS;

IRP  为 IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION 的时候 ,通过synctype可以判断出是在映射文件,但是怎么判断是在执行PE文件呢? 我试过判断PageProtection是否有PAGE_EXECUTE标志,但是发现有时候,即使不是执行文件,仅仅只是浏览下文件夹,就会有很多带有PAGE_EXECUTE标识的请求.  

我的本意是想通过minifilter来禁止指定的EXE文件和SYS文件加载,但是现在没有什么办法在minifilter的preoperation或postoperation里准确判断出是不是EXE或sys执行之前的操作
2014-1-28 18:33
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
…………用minifilter做这个事情
2014-1-28 18:50
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
用minifilter搞,只要判断SyncType就行,我记得是只有两种可能,一种执行MAP,一种写MAP,杀软的实时监控都是这样搞的
2014-1-28 21:34
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不行

synctype   只有两种可能    一是synctypeother , 二是 SyncTypeCreateSection

MSDN上说了synctype==synctypeother 时, 过滤驱动必须放行这个,不能让这个请求失败

SyncTypeCreateSection,这个不能判断是不是准备执行一个PE文件,正常的文件浏览或者读文件都会触发,很频繁.  而且即使是读普通的文件,pageprotect这个参数,也带有PAGE_EXECUTE标识.
2014-1-28 23:40
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我记错了,是判断CreateSection+PAGE_EXECUTE,杀软都是在这里同步阻塞上抛去扫描文件的,一般来说都是PE,不过确实不是完全准,LoadLibrary也会到这里来。不过和HOOK CreateSection是一样的。到了CreateSection这里应该是数量比较少的,至少比PreCreate好多了。
要想准确还是LoadImage回调搞比较好,我都是这样干,也没什么大问题。
2014-1-29 11:03
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
每次都算MD5开销确实挺大,在minifilter中一般会自己做缓存,在Context中保存FileId,然后有一个全局的FileId和FileMd5的对应关系,后面碰到同样的FileId一查库就行。不过这样做的话就涉及到更新缓存同步的问题,非常繁琐,需要处理Write。但是性能会好很多的。性能要求高的话是需要这么高,一般用途就没必要了,卡点也关系不大。
2014-1-29 11:07
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
嗯,到CreateSection这里的,却是比create的要少的多.

在HOOK NtCreateSection 里判断那个pageprotection标识,是非常准的.,几乎百分之百是PE加载.

minifilter这个,还得研究看看有没有其他方法来减少误判
2014-1-29 11:34
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我换了个思路:

不通过MD5来拦截,算MD5太慢了 ,.

我现在是在应用层分析PE文件,在包含代码和有可执行属性的区块中提取一些特征值,然后按照"文件偏移+机器码"的格式组成一个特征串,在minifilter中判断PE文件是不是符合特征. 这样比MD5好多了.而且MD5太容易绕过了,改动一个无关的字节,MD5就变化了.
2014-1-29 11:39
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
特征也可以,看需求了,特征如果提得不好容易被绕过,还是得看具体需求
2014-1-29 11:43
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
为何不用映像回调?应该在这里出来是最高效的,因为系统已经把这玩意装载到内存了……
再个,在这里完全不需要用解析pe文件的方式来判断exe dll sys啊……多好啊……
2014-1-29 13:25
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不瞒你说,我刚刚试过用LoadImageNotify了,但是碰到个奇葩事:

在回调里,进程还没有线程,所以常规办法不能结束它,插job,插apc,我试过了,没用.

既然不能结束,我就想到了捣乱,往imageinfo.imagebase里面乱写数据,嗯,这样进程的确创建不了了,但是....但是我写了垃圾数据进去之后,以后这个进程就永远创建不了了,除非重启.求大神指点一下啊!
2014-1-29 14:28
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
因为微软该死的设计……这货在调用回调的时候,进程对象没有填写好
不能直接乱搞啊……因为似乎系统对同一个映像只会加载一遍
2014-1-29 17:33
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
那是因为你修改要写的内存地址属性的时候,用的PAGE_WRITE吧

或者关写中断,MDL等是一样的效果。

必须要PAGE_WRITECOPY
2014-2-11 09:48
0
游客
登录 | 注册 方可回帖
返回
//