首页
社区
课程
招聘
[求助]构建的KiAttchProcess,求解惑
发表于: 2013-7-6 08:28 8051

[求助]构建的KiAttchProcess,求解惑

2013-7-6 08:28
8051
最近在看和尚老师的过TP驱动保护教程,看到第六课我就不理解了。教程里构建了一个KiAttchProcess,那一大堆汇编,我一看就晕了,他说和系统的KiAttchProcess差不多,若是一样,调用系统的KiAttchProcess就行了;若是改了哪,我就看不懂了。若是DNF的进程,就执行汇编;不是,就执行原来的KiAttchProcess。我不明白这些汇编有什么用,附上代码,请各位指导一下:

#ifndef HOOKKEATTCH
#define HOOKKEATTCH

int HookKeAttachProcessAddr;

int KiMoveApcState1;
int KiReadyThread2;
int KiSwapProcess3;
int KiUnlockDispatcherDatabase4;
int KiSetSwapEvent5;
int KiSwapThread6;
int KiAttachProcessAddr;
int KiProcessInSwapListHeadAddr;

__declspec(naked) NTSTATUS MyKiAttachProcess()
{
        if(PanDuanProcessName("DNF.exe")||PanDuanProcessName("TenSafe.exe"))
        {
                __asm
                {
                                mov     edi,edi
                                push    ebp
                                mov     ebp,esp
                                push    ebx
                                mov     ebx,dword ptr [ebp+0Ch]
                                inc     word ptr [ebx+60h]
                                push    esi
                                mov     esi,dword ptr [ebp+8]
                                push    edi
                                push    dword ptr [ebp+14h]
                                lea     edi,[esi+34h]
                                push    edi
                                call    KiMoveApcState1 //(804f8174)   1
                                mov     dword ptr [edi+4],edi
                                mov     dword ptr [edi],edi
                                lea     eax,[esi+3Ch]
                                mov     dword ptr [eax+4],eax
                                mov     dword ptr [eax],eax
                                lea     eax,[esi+14Ch]
                                cmp     dword ptr [ebp+14h],eax
                                mov     dword ptr [esi+44h],ebx
                                mov     byte ptr [esi+48h],0
                                mov     byte ptr [esi+49h],0
                                mov     byte ptr [esi+4Ah],0
                                jne     KiAttachProcess58// (804f8490)
                                mov     dword ptr [esi+138h],eax
                                mov     dword ptr [esi+13Ch],edi
                                mov     byte ptr [esi+165h],1
KiAttachProcess58:
                                cmp     byte ptr [ebx+65h],0
                                jne     KiAttachProcess98 //(804f84d0)
                                lea     esi,[ebx+40h]
                                jmp     KiAttachProcess7C// (804f84b4)
KiAttachProcess63:
                                mov     edx,dword ptr [eax]
                                lea     ecx,[eax-60h]
                                mov     eax,dword ptr [eax+4]
                                mov     dword ptr [eax],edx
                                mov     dword ptr [edx+4],eax
                                mov     byte ptr [ecx+129h],0
                                call    KiReadyThread2 //(80500dac)    2
KiAttachProcess7C:
                                mov     eax,dword ptr [esi]
                                cmp     eax,esi
                                jne     KiAttachProcess63 //(804f849b)
                                mov     eax,dword ptr [ebp+14h]
                                push    dword ptr [eax+10h]
                                push    ebx
                                call    KiSwapProcess3   //3
                                mov     cl,byte ptr [ebp+10h]
                                call    KiUnlockDispatcherDatabase4 // (80541908)   4
                                jmp     KiAttachProcessF7        // (804f852f)
KiAttachProcess98:
                        mov     byte ptr [esi+2Dh],1
                        mov     byte ptr [esi+129h],1
                        lea     ecx,[ebx+40h]
                        mov     edx,dword ptr [ecx+4]
                        lea     eax,[esi+60h]
                        mov     dword ptr [eax],ecx
                        mov     dword ptr [eax+4],edx
                        mov     dword ptr [edx],eax
                        mov     dword ptr [ecx+4],eax
                        cmp     byte ptr [ebx+65h],1
                        jne     KiAttachProcessEC                // (804f8524)
                        mov     byte ptr [ebx+65h],2
                        mov     eax,dword ptr [KiProcessInSwapListHeadAddr]//[0x80552fc0]//[0x80552fc0]//eax,dword ptr [nt!KiProcessInSwapListHead (80552fc0)]
                        lea     edi,[ebx+48h]
                        mov     dword ptr [ebp+0Ch],edi
                        mov     dword ptr [ebp+14h],eax
KiAttachProcessCE:
                        mov     dword ptr [edi],eax
                        mov     ebx,eax
                        mov     eax,dword ptr [ebp+14h]
                        mov     ecx,KiProcessInSwapListHeadAddr//0x80552fc0//0x80552fc0//offset nt!KiProcessInSwapListHead (80552fc0)
                        mov     edx,dword ptr [ebp+0Ch]
                        cmpxchg dword ptr [ecx],edx
                        cmp     eax,ebx
                        mov     dword ptr [ebp+14h],eax
                        jne     KiAttachProcessCE// (804f8506)
                        call    KiSetSwapEvent5 //(804f81d2)      5
KiAttachProcessEC:
                        mov     al,byte ptr [ebp+10h]
                        mov     byte ptr [esi+58h],al
                        call    KiSwapThread6 //(80501134)   6
KiAttachProcessF7:
                        pop     edi
                        pop     esi
                        pop     ebx
                        pop     ebp
                        ret     10h
                }
        }
        __asm jmp KiAttachProcessAddr
}

VOID HookKeAttchProcess()
{
//        KeAttachProcessAddr=GetFunCtionAddr(L"KeAttachProcess");

        KiAttachProcessAddr=GetKiAttachProcessAddr();
        DbgPrint("KiAttachProcessAddr=%x\n",KiAttachProcessAddr);
       
        char code=(char)0xe8;
       
        int addr=SearchFeature(KiAttachProcessAddr,&code,1);
        KiMoveApcState1=GetCallAddr(addr);                                                        //1
       
        addr=SearchFeature(addr+1,&code,1);
        KiReadyThread2=GetCallAddr(addr);                                                        //2
       
        addr=SearchFeature(addr+1,&code,1);
        KiSwapProcess3=GetCallAddr(addr);                                                        //3
       
        addr=SearchFeature(addr+1,&code,1);
        KiUnlockDispatcherDatabase4=GetCallAddr(addr);                                //4
       
        char code2[2]={(char)0x65,(char)0x02};
        addr=SearchFeature(addr+1,code2,2);
        KiProcessInSwapListHeadAddr=GetCallAddr(addr);                                //7

        char s=(char)0xe8;
        int        nCallAddr=SearchFeature(GetFunCtionAddr(L"KeAttachProcess"),&s,1);
        HookKeAttachProcessAddr=nCallAddr;

        CallHook(nCallAddr,(int)MyKiAttachProcess);

//        DbgPrint("nCallAddr=%x\n",nCallAddr);
}

VOID UnHookKeAttchProcess()
{
        CallHook(HookKeAttachProcessAddr,(int)KiAttachProcessAddr);
}
#endif

GetKiAttachProcessAddr();//得到KiAttachProcess的地址
SearchFeature(KiAttachProcessAddr,&code,1);//搜索特征码,返回特征码后面的地址
GetFunCtionAddr(L"KeAttachProcess")//通过函数名查找内核函数的地址

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (15)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
估计是系统的KiAttchProcess已经被挂钩了,那段汇编代码应该就相当于是一个原始的没被勾KiAttchProcess函数,是dnf的话就调用汇编自己实现的(你调用系统的,他都已经被勾了,那attach肯定失败了),不是的话就调用系统的(反正不是我们的目标,爱咋咋地)
2013-7-6 10:38
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
直接恢复KiAttchProcess的钩子不就行了,搞得这么麻烦,
tp又没进行校验.
2013-7-6 11:13
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
TP就是改了KiAttchProcess的前七个字节,是dnf的话就调用汇编自己实现的,不是的话就调用系统的,这不是反了吗?难道不应该是:是DNF就执行修改的,不是就跳过修改的?
__declspec(naked) NTSTATUS MyKiAttachProcess()
{
        if(PanDuanProcessName("DNF.exe")||PanDuanProcessName("TenSafe.exe"))
        {
                __asm
                {
       jmp KiAttachProcessAddr
                }
        }
        else
        {
                __asm
                {
                        mov    edi,edi
                        push   ebp
                        mov    ebp,esp
                        push   ebx
                        push   esi
                        mov    eax,KiAttachProcessAddr              
      add    eax,7
                        jmp    eax
                }
        }
}
2013-7-6 11:20
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也是这样想的,可能出教程的时候有检测吧。
在17课中,在那些汇编中加了几句伪指令,就能过tp的ce非法检测。
而我一开CE,TP就检测到了,我想知道他是怎么做到的,怎么才能让它检测不到啊!!!!
2013-7-6 11:51
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是不是od ce要访问dnf的时候,需要先attach上去,那判断是dnf的话,说明来自ce od,就调用没被修改的
2013-7-6 12:39
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我不明白啊
我的理解是CE OD附加DNF需要调用KiAttachProcess,这样就进入TP改写的代码里边,而TP再通过特征码检测一下,若没检测到TP知道的,就放过;若检测到TP知道的,就通不过
不知道对不对?
2013-7-6 12:56
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CE OD附加DNF需要调用KiAttachProcess,而tp改写的代码是不会让你attach dnf成功的,所以判断是dnf的时候,要调用自己的
2013-7-6 14:09
0
雪    币: 77
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主你能不能不要发这种帖子,要不到两天,TX这个SB公司就会校验这些函数,你这个问题没解决,又徒增许多麻烦,动动脑筋想想嘛,而且看雪里本身就混有这公司的人
2013-7-7 07:42
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
技术是不断进步的嘛,要比技术更快地打击技术
还得多练啊
2013-7-7 10:34
0
雪    币: 178
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
有些东西是不能拿到台面上说的,小心查水表 律师函
2013-7-7 13:20
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
我的理解是:任何Ring3层的附加,最终都会调用内核函数:KeAttachProcess(不信,你可以对KeAttachProcess下断试试),而在KeAttachProcess函数中,又调用了KiAttachProcess,而该函数的前7个字节被TP Hook了。必然会对要附加的进程进行判断,我们就失去了主动权。
为了抢回主动权,有两条途径:
①直接恢复KiAttchProcess的钩子(可以通过下“内存读”断点:ba r1 0xXXXXXX,判断TP是否有检测)
②自己另外构造一个KiAttchProcess函数,而我们只需要对KeAttachProcess中的第一个E8处进行Inline Hook
2013-7-9 20:49
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我觉得吧,直接回复,暴力了点;自己另外构造一个完整的KiAttchProcess函数太繁琐
直接绕过应该可以吧!
对KeAttachProcess中的第一个E8处进行Inline Hook
然后,写个简单的MyKiAttachProcess
                mov     edi,edi
                push    ebp
                mov     ebp,esp
                push    ebx
                push    esi
                mov    eax,KiAttachProcessAddr
                add    eax,7
                jmp    eax

http://bbs.pediy.com/showthread.php?t=126802
2013-7-10 12:08
0
雪    币: 70
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
他那视频各种搜索kiattachprocess里面的函数,。。。。。不推荐,自己用的话,直接绕过去就行了,
2013-7-10 12:23
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
是啊,貌似很多机器上的kiAttachProcess函数的反汇编都是不同的
2013-7-10 17:30
0
雪    币: 70
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
解析PDB吧,别搜索了,最好把和尚后面那俩字去了,在看雪上,连菜鸟也算不上。
2013-7-10 23:44
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册