-
-
[原创]逆向Hook CreateSection中过滤函数
-
发表于: 2010-5-1 00:21 4890
-
是通过ObReferenceObjectByHandle获得FILE_OBJECT,然后把文件名(UNICODE_STRING)地址传到了这个函数中
85eff56e 8bff mov edi,edi
85eff570 55 push ebp
85eff571 8bec mov ebp,esp
85eff573 51 push ecx
85eff574 51 push ecx
85eff575 53 push ebx
85eff576 56 push esi
85eff577 8b7508 mov esi,dword ptr [ebp+8];文件UNICODE_STRING
85eff57a 57 push edi
85eff57b 33ff xor edi,edi
85eff57d 3bf7 cmp esi,edi
85eff57f 0f841f010000 je 85eff6a4;判断 返回0
85eff585 8b4604 mov eax,dword ptr [esi+4];
85eff588 3bc7 cmp eax,edi
85eff58a 0f8414010000 je 85eff6a4返回0
85eff590 393d5411f185 cmp dword ptr ds:[85F11154h],edi;白名单地址为0返回0
85eff596 0f8408010000 je 85eff6a4
85eff59c 0fb71e movzx ebx,word ptr [esi];UNICODE_STRING->Length
85eff59f d1eb shr ebx,1;右移 1位 == 除以2;不过下面我就弄不清楚了
85eff5a1 83fb04 cmp ebx,4
85eff5a4 0f82fa000000 jb 85eff6a4;名字小于8返回0
85eff5aa 6a04 push 4
85eff5ac 8d4458f8 lea eax,[eax+ebx*2-8]
85eff5b0 687897f085 push 85F09778h;
85eff5b5 50 push eax
85eff5b6 e875610000 call 85f05730;wcsnicmp;比较后缀名
85eff5bb 83c40c add esp,0Ch
85eff5be 85c0 test eax,eax
85eff5c0 7507 jne 85eff5c9
85eff5c2 b001 mov al,1
85eff5c4 e9dd000000 jmp 85eff6a6
85eff5c9 8b4604 mov eax,dword ptr [esi+4]
85eff5cc 6a03 push 3
85eff5ce 8d4458fa lea eax,[eax+ebx*2-6]
85eff5d2 68a897f085 push 85F097A8h
85eff5d7 50 push eax
85eff5d8 e853610000 call 85f05730;wcsnicmp;比较后缀名
85eff5dd 83c40c add esp,0Ch
85eff5e0 85c0 test eax,eax
85eff5e2 74de je 85eff5c2;返回1
85eff5e4 8b4604 mov eax,dword ptr [esi+4]
85eff5e7 6683385c cmp word ptr [eax],5Ch
85eff5eb 897dfc mov dword ptr [ebp-4],edi
85eff5ee 753a jne 85eff62a;判断第一个字符是不是'\'
85eff5f0 393db0e2f085 cmp dword ptr ds:[85F0E2B0h],edi;白名单数量
85eff5f6 0f86a8000000 jbe 85eff6a4;返回0
85eff5fc a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff601 53 push ebx ;;;;这里不知道是不是,前面的长度/2,这里搞不清
85eff602 03c7 add eax,edi
85eff604 50 push eax
85eff605 ff7604 push dword ptr [esi+4]
85eff608 e823610000 call 85f05730;和名单中比较;"\windows\system32\user32.dll"
85eff60d 83c40c add esp,0Ch
85eff610 85c0 test eax,eax
85eff612 74ae je 85eff5c2;相等返回1
85eff614 ff45fc inc dword ptr [ebp-4]
85eff617 8b45fc mov eax,dword ptr [ebp-4]
85eff61a 81c708020000 add edi,208h
85eff620 3b05b0e2f085 cmp eax,dword ptr ds:[85F0E2B0h]
85eff626 72d4 jb 85eff5fc
85eff628 eb7a jmp 85eff6a4 ;循环结束,如果不相等就返回0
85eff62a 393db0e2f085 cmp dword ptr ds:[85F0E2B0h],edi
85eff630 7672 jbe 85eff6a4
85eff632 897df8 mov dword ptr [ebp-8],edi
85eff635 8bfb mov edi,ebx
85eff637 f7df neg edi
85eff639 8b4df8 mov ecx,dword ptr [ebp-8]
85eff63c a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff641 03c1 add eax,ecx
85eff643 8d4802 lea ecx,[eax+2]
85eff646 668b10 mov dx,word ptr [eax]
85eff649 40 inc eax
85eff64a 40 inc eax
85eff64b 6685d2 test dx,dx
85eff64e 75f6 jne 85eff646
85eff650 2bc1 sub eax,ecx
85eff652 d1f8 sar eax,1
85eff654 3bd8 cmp ebx,eax;ebx字符串长度/2??????
85eff656 7731 ja 85eff689
85eff658 8d3407 lea esi,[edi+eax]
85eff65b a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff660 03f6 add esi,esi
85eff662 03c6 add eax,esi
85eff664 53 push ebx //字符串长度/2???
85eff665 50 push eax
85eff666 8b4508 mov eax,dword ptr [ebp+8]
85eff669 ff7004 push dword ptr [eax+4]
85eff66c e8bf600000 call 85f05730
85eff671 83c40c add esp,0Ch
85eff674 85c0 test eax,eax
85eff676 7511 jne 85eff689
85eff678 a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff67d 66837c06fe5c cmp word ptr [esi+eax-2],5Ch
85eff683 0f8439ffffff je 85eff5c2
85eff689 ff45fc inc dword ptr [ebp-4]
85eff68c 8b45fc mov eax,dword ptr [ebp-4]
85eff68f 8145f808020000 add dword ptr [ebp-8],208h
85eff696 81c704010000 add edi,104h
85eff69c 3b05b0e2f085 cmp eax,dword ptr ds:[85F0E2B0h]
85eff6a2 7295 jb 85eff639
85eff6a4 32c0 xor al,al
85eff6a6 5f pop edi
85eff6a7 5e pop esi
85eff6a8 5b pop ebx
85eff6a9 c9 leave
85eff6aa c20400 ret 4
其实就是搞不清楚它的字符串比较,到底怎么回事,自己汇编水平不行呀,像上面的neg我就不知道上面意思了。
下面是我逆出来的C代码,请大牛们指出错误的地方,最主要的,我像知道我分析的EBX是不是字符串长度/2
BOOL CheckDllFile(PUNICODE_STRING pDllname)
{
DWORD nNum=0,nLen = 0,i=0;
wchar_t * pfilename=NULL;
nLen = pDllname->Length/2;
if(pDllname->Length == 0 || pDllname->Length < 8)
return 0;
if(g_pDllList == NULL)
return 0;
pfilename = pDllname->Buffer+pDllname->Length -8;
if(0==wcsnicmp(pfilename,szImeName,4))
{
return 1;
}
if(0==wcsnicmp(pfilename,szImeName,4))
{
return 1;
}
if (0==wcsnicmp(pfilename,szAxName,3))
{
return 1;
}
if((WORD)*pDllname->Buffer == 5Ch)//判断是不是'\'开头
{
while(g_dllNum < i) //g_dllNum应该存放着名单的数量"\\windows\\system32\user32.dll"
{
if(wcsnicmp(((char *)szNtdllName+nNum) , pDllname->Buffer,nLen)==0)//nLen到底是多少?
return 1;
nNum+=208h;
i++;
}
}
else{
if (g_dllNum <= 0)
{
return 0;
}
i=0
int j =1;
int k;
do
{
while(szNtdllName[i][j] !=0)
j++;
if(nLen < j)
{
pfilename = (char *)szNtdllName +(k+j)*2
if(wcsnicmp(pfilename,pDllname->Buffer,nLen) == 0)
{
if(*(pfilename-1) == 0x5c)
return 1;
}
}
k += 0x104;
nNum+= 0x208;
}
while(i< g_dllNum)
}
return 0
}
85eff56e 8bff mov edi,edi
85eff570 55 push ebp
85eff571 8bec mov ebp,esp
85eff573 51 push ecx
85eff574 51 push ecx
85eff575 53 push ebx
85eff576 56 push esi
85eff577 8b7508 mov esi,dword ptr [ebp+8];文件UNICODE_STRING
85eff57a 57 push edi
85eff57b 33ff xor edi,edi
85eff57d 3bf7 cmp esi,edi
85eff57f 0f841f010000 je 85eff6a4;判断 返回0
85eff585 8b4604 mov eax,dword ptr [esi+4];
85eff588 3bc7 cmp eax,edi
85eff58a 0f8414010000 je 85eff6a4返回0
85eff590 393d5411f185 cmp dword ptr ds:[85F11154h],edi;白名单地址为0返回0
85eff596 0f8408010000 je 85eff6a4
85eff59c 0fb71e movzx ebx,word ptr [esi];UNICODE_STRING->Length
85eff59f d1eb shr ebx,1;右移 1位 == 除以2;不过下面我就弄不清楚了
85eff5a1 83fb04 cmp ebx,4
85eff5a4 0f82fa000000 jb 85eff6a4;名字小于8返回0
85eff5aa 6a04 push 4
85eff5ac 8d4458f8 lea eax,[eax+ebx*2-8]
85eff5b0 687897f085 push 85F09778h;
85eff5b5 50 push eax
85eff5b6 e875610000 call 85f05730;wcsnicmp;比较后缀名
85eff5bb 83c40c add esp,0Ch
85eff5be 85c0 test eax,eax
85eff5c0 7507 jne 85eff5c9
85eff5c2 b001 mov al,1
85eff5c4 e9dd000000 jmp 85eff6a6
85eff5c9 8b4604 mov eax,dword ptr [esi+4]
85eff5cc 6a03 push 3
85eff5ce 8d4458fa lea eax,[eax+ebx*2-6]
85eff5d2 68a897f085 push 85F097A8h
85eff5d7 50 push eax
85eff5d8 e853610000 call 85f05730;wcsnicmp;比较后缀名
85eff5dd 83c40c add esp,0Ch
85eff5e0 85c0 test eax,eax
85eff5e2 74de je 85eff5c2;返回1
85eff5e4 8b4604 mov eax,dword ptr [esi+4]
85eff5e7 6683385c cmp word ptr [eax],5Ch
85eff5eb 897dfc mov dword ptr [ebp-4],edi
85eff5ee 753a jne 85eff62a;判断第一个字符是不是'\'
85eff5f0 393db0e2f085 cmp dword ptr ds:[85F0E2B0h],edi;白名单数量
85eff5f6 0f86a8000000 jbe 85eff6a4;返回0
85eff5fc a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff601 53 push ebx ;;;;这里不知道是不是,前面的长度/2,这里搞不清
85eff602 03c7 add eax,edi
85eff604 50 push eax
85eff605 ff7604 push dword ptr [esi+4]
85eff608 e823610000 call 85f05730;和名单中比较;"\windows\system32\user32.dll"
85eff60d 83c40c add esp,0Ch
85eff610 85c0 test eax,eax
85eff612 74ae je 85eff5c2;相等返回1
85eff614 ff45fc inc dword ptr [ebp-4]
85eff617 8b45fc mov eax,dword ptr [ebp-4]
85eff61a 81c708020000 add edi,208h
85eff620 3b05b0e2f085 cmp eax,dword ptr ds:[85F0E2B0h]
85eff626 72d4 jb 85eff5fc
85eff628 eb7a jmp 85eff6a4 ;循环结束,如果不相等就返回0
85eff62a 393db0e2f085 cmp dword ptr ds:[85F0E2B0h],edi
85eff630 7672 jbe 85eff6a4
85eff632 897df8 mov dword ptr [ebp-8],edi
85eff635 8bfb mov edi,ebx
85eff637 f7df neg edi
85eff639 8b4df8 mov ecx,dword ptr [ebp-8]
85eff63c a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff641 03c1 add eax,ecx
85eff643 8d4802 lea ecx,[eax+2]
85eff646 668b10 mov dx,word ptr [eax]
85eff649 40 inc eax
85eff64a 40 inc eax
85eff64b 6685d2 test dx,dx
85eff64e 75f6 jne 85eff646
85eff650 2bc1 sub eax,ecx
85eff652 d1f8 sar eax,1
85eff654 3bd8 cmp ebx,eax;ebx字符串长度/2??????
85eff656 7731 ja 85eff689
85eff658 8d3407 lea esi,[edi+eax]
85eff65b a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff660 03f6 add esi,esi
85eff662 03c6 add eax,esi
85eff664 53 push ebx //字符串长度/2???
85eff665 50 push eax
85eff666 8b4508 mov eax,dword ptr [ebp+8]
85eff669 ff7004 push dword ptr [eax+4]
85eff66c e8bf600000 call 85f05730
85eff671 83c40c add esp,0Ch
85eff674 85c0 test eax,eax
85eff676 7511 jne 85eff689
85eff678 a15411f185 mov eax,dword ptr ds:[85F11154h]
85eff67d 66837c06fe5c cmp word ptr [esi+eax-2],5Ch
85eff683 0f8439ffffff je 85eff5c2
85eff689 ff45fc inc dword ptr [ebp-4]
85eff68c 8b45fc mov eax,dword ptr [ebp-4]
85eff68f 8145f808020000 add dword ptr [ebp-8],208h
85eff696 81c704010000 add edi,104h
85eff69c 3b05b0e2f085 cmp eax,dword ptr ds:[85F0E2B0h]
85eff6a2 7295 jb 85eff639
85eff6a4 32c0 xor al,al
85eff6a6 5f pop edi
85eff6a7 5e pop esi
85eff6a8 5b pop ebx
85eff6a9 c9 leave
85eff6aa c20400 ret 4
其实就是搞不清楚它的字符串比较,到底怎么回事,自己汇编水平不行呀,像上面的neg我就不知道上面意思了。
下面是我逆出来的C代码,请大牛们指出错误的地方,最主要的,我像知道我分析的EBX是不是字符串长度/2
BOOL CheckDllFile(PUNICODE_STRING pDllname)
{
DWORD nNum=0,nLen = 0,i=0;
wchar_t * pfilename=NULL;
nLen = pDllname->Length/2;
if(pDllname->Length == 0 || pDllname->Length < 8)
return 0;
if(g_pDllList == NULL)
return 0;
pfilename = pDllname->Buffer+pDllname->Length -8;
if(0==wcsnicmp(pfilename,szImeName,4))
{
return 1;
}
if(0==wcsnicmp(pfilename,szImeName,4))
{
return 1;
}
if (0==wcsnicmp(pfilename,szAxName,3))
{
return 1;
}
if((WORD)*pDllname->Buffer == 5Ch)//判断是不是'\'开头
{
while(g_dllNum < i) //g_dllNum应该存放着名单的数量"\\windows\\system32\user32.dll"
{
if(wcsnicmp(((char *)szNtdllName+nNum) , pDllname->Buffer,nLen)==0)//nLen到底是多少?
return 1;
nNum+=208h;
i++;
}
}
else{
if (g_dllNum <= 0)
{
return 0;
}
i=0
int j =1;
int k;
do
{
while(szNtdllName[i][j] !=0)
j++;
if(nLen < j)
{
pfilename = (char *)szNtdllName +(k+j)*2
if(wcsnicmp(pfilename,pDllname->Buffer,nLen) == 0)
{
if(*(pfilename-1) == 0x5c)
return 1;
}
}
k += 0x104;
nNum+= 0x208;
}
while(i< g_dllNum)
}
return 0
}
赞赏
他的文章
看原图
赞赏
雪币:
留言: