首页
社区
课程
招聘
[原创]逆向Hook CreateSection中过滤函数
发表于: 2010-5-1 00:21 4874

[原创]逆向Hook CreateSection中过滤函数

2010-5-1 00:21
4874
是通过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

}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//