首页
社区
课程
招聘
[原创]简单分析某游戏debugport清零
发表于: 2010-12-28 18:25 32027

[原创]简单分析某游戏debugport清零

2010-12-28 18:25
32027

简单分析,小弟能力有限如果有什么错误的话,欢迎各位牛牛指正,共同进步嘛
第一处清零代码           
                mov     edi, edi
                push    ebp
                mov     ebp, esp
                push    ecx
                push    esi
                mov     [ebp+var_1], 0
               call    ds:KeGetCurrentIrql
                cmp     al, 2 //判断中断级
               mov     esi, offset SpinLock
                mov     ecx, esi      
               jb      short loc_1002660
                call    ds:KefAcquireSpinLockAtDpcLevel
               mov     [ebp+var_1], 1
               jmp     short loc_1002669

loc_1002660:                     
               call    ds:KfAcquireSpinLock
                mov     [ebp+NewIrql], al

loc_1002669:  mov     ecx, dword_100D1C0  //这里比较关键啦。 dword_100D1C0 这个全局变量很重要                 
               mov     edx, offset dword_100D1C0

                cmp     ecx, edx
               jz      short loc_10026BA// 这个是个关键比较啦
               push    ebx
                push    edi

loc_100267A:                        
                mov     edi, dword_100CEDC  //这里存放着EPROCESS的下标
               mov     edi, [edi+4]        //CEDC+4的位置正是BC
               add     edi, [ecx-34h]     //[D1C0-34]的位置存放着EPROCESS结构的地址
              xor     eax, eax
               xchg    eax, [edi]        //清零
               mov     eax, dword_100CEDC
               mov     ebx, [ecx-2Ch]  //存放着EPROCESS+70位置的内容
               mov     eax, [eax+18h]  //CEDC+18位置存放70下标
                 mov     edi, [ecx-34h]//EPROCESS结构的地址
              mov     [eax+edi], ebx  //写回去防止修改位置
               mov     ebx, [ecx-28h] //74的内容
                mov     [eax+edi+4], ebx//写回去
               mov     edi, dword_100CEDC
                mov     edi, [edi+1Ch] //取78位置
                add     edi, [ecx-34h]
                xor     eax, eax       //写回去
               stosd
                 stosd
             上面这一段把EPROCESS+70,74,78的位置全部封杀了
防止把BC的位置修改为70,74,78,所以曾经某种方法改位置变得无效了               
      
第2段清零位代码,这里有个检测
                               mov     edi, edi
                               push    ebp
                               mov     ebp, esp
                               push    ecx
                               push    ecx
                               push    ebx
                               xor     ebx, ebx
                               push    esi
                               mov     ecx, offset SpinLock
                               mov     byte ptr [ebp-1], 1
                               mov     [ebp-8], ebx
                               call    ds:KfAcquireSpinLock
                               mov     esi, dword_100D1C0 //这里同1的注释  这个变量很重要
                               cmp     esi, offset dword_100D1C0//这里同1的注释一样
                               mov     [ebp-2], al
                               jz      loc_1004FE9 //关键跳
                               mov     [ebp-1], bl
                               push    edi

loc_1004F62:                           
                               mov     eax, dword_100CEDC //这里存放着EPROCESS的下标
                               mov     eax, [eax+4]      //CEDC+4的位置正是BC   
                               lea     edi, [esi-34h]  //[D1C0-34]的位置存放着EPROCESS结构的地址 注意这里是取地址
                               add     eax, [edi]     //指到BC处
                               xor     ebx, ebx         
                               xchg    ebx, [eax]  //清零
                               xor     eax, eax
                               cmp     [ebp-8], eax
                               jnz     short loc_1004F83
                               cmp     ebx, eax
                               jz      short loc_1004F83
                               mov     ecx, [edi]
                               mov     [ebp-8], ecx

                    loc_1004F83:                           
                                       
                            mov     ecx, 1505h
                            movsx   edx, byte ptr [edi+eax] //这段算法主要是检测有没有被修改如果有的话就重启机器
                            imul    ecx, 21h   //edi存放着EPROCESS的地址,有兴趣的朋友可以逆下
                            add     ecx, edx
                            inc     eax
                            cmp     eax, 18h
                            jb      short loc_1004F88
                            cmp     ecx, [edi+1Ch] //1CH处存放着检验值 1CH+4位置存放着进程名
                            jz      short loc_1004FA1
                            call    sub_100163C //重启机器
     
其实这里注意dword_100D1C0 变量这里很重要。                                          

这2个都好搞定,关键是有个监控

                               mov     edi, edi
                               push    ebp
                               mov     ebp, esp
                               sub     esp, 10h
                               mov     eax, dword_100CA6C //CA6C=CF;
                              push    ebx
                              push    esi
                              push    edi
                              mov     edi, offset unk_100CA68
                             sub     edi, 0CA68h  //EDI=模块载入地址
                             lea     ecx, [eax+eax*2]//EAX=CF;
                             shl     ecx, 2         //这步计算我估计应该是得出了100B268总大小
                             push    0
                             mov     [ebp+var_10], edi
                             mov     [ebp+var_4], ecx
                             pop     edx
                             jz      short loc_100422B

                loc_100420C:                           
                           movzx   esi, byte_100B268[edx]/*
                           100B268这个变量指向一个结构 这个结构类似 struct{ULONG PY(偏移),INT LEN,ULONG HASH}
                            CRC检验,估计是黑白名单之类的,我的猜测,如果有错那位朋友知道的话帮我纠正一下
                         */   
                       mov     ebx, [ebp+var_4]
                           shr     ebx, 1Bh
                           xor     esi, ebx
                            mov     ebx, [ebp+var_4]
                           shl     ebx, 5
                            xor     esi, ebx
                           inc     edx
                          cmp     edx, ecx
                         mov     [ebp+var_4], esi
                        jb      short loc_100420C

loc_100422B:   
                      cmp     [ebp+var_4], 17606A55h //上面一系列的计算和(17606A55计算后的总大小)比较,如果被修改了就重启
                      jz      short loc_100423E
                      call    sub_100163C  //重启
                      mov     eax, dword_100CA6C

loc_100423E:                          
                     and     [ebp+var_C], 0
                     test    eax, eax
                     jbe     short loc_100429F //这个跳可以修改
                     mov     esi, offset unk_100B26C

loc_100424B:                           
                    mov     ecx, [esi-4] //ECX==STRUCT结构的PY偏移
                    mov     edx, [esi]
                    and     [ebp+var_8], 0
                    add     ecx, edi   //加上模块载入地址址  
                    test    edx, edx
                    mov     [ebp+var_4], edx
                    jbe     short loc_1004282

loc_100425D:                           
                   mov     edi, [ebp+var_8]
                   movzx   edi, byte ptr [ecx+edi] //取出PY下面的值来计算HASH
                   mov     ebx, [ebp+var_4]
                   shr     ebx, 1Bh
                   xor     edi, ebx
                   mov     ebx, [ebp+var_4]
                   shl     ebx, 5
                   xor     edi, ebx
                   inc     [ebp+var_8]
                   cmp     [ebp+var_8], edx  //edx == STRUCT结构中的LEN
                   mov     [ebp+var_4], edi
                   jb      short loc_100425D
                   mov     edi, [ebp+var_10]
                   mov     ecx, [ebp+var_4]
                   cmp     ecx, [esi+4]   //经过一系列运算比较是不是STRUCT中的HASH
                   jz      short loc_1004294 //相同就跳
                   call    sub_100163C //不同就重启
                   mov     eax, dword_100CA6C

loc_1004294:                          
                  inc     [ebp+var_C]
                  add     esi, 0Ch
                  cmp     [ebp+var_C], eax
                  jb      short loc_100424B
                  pop     edi
                  pop     esi
                  pop     ebx
               leave
              retn
   
         
重启代码
                           
                 in      al, 64h      
                 mov     bl, al
               test    bl, 1
                jz      short loc_1001660
               in      al, 60h         
               test    bl, 2
              jnz     short loc_1001655
               mov     al, 0FEh
              out     64h, al         
              popa
              retn
解决方法很多,我说几种
第一种是我以前用的一种比较挫的,其实最重要的是解决监控哪里,
     分2步 1。在监控哪里 跳走或者直接返回         
           2.注意我标的清零的2段代码
           mov     ecx, dword_100D1C0  //这里比较关键啦。                  
           mov     edx, offset dword_100D1C0
           cmp     ecx, edx
           jz      short loc_10026BA// 这个是个关键比较啦
           在函数开头钩钩一下跳到我们的函数
           处理一下先查找到模块加载地址(Modulebase)。
          伪代码
           ULONG D1C0=Modulebase+0XD1C0;
            _asm{
                mov edi,edi
                push ebp
                mov ebp,esp
                mov eax,D1C0
                mov [eax],eax
                mov eax,Ret(返回地址)
                add eax,5
                jmp eax
   }                    
      jz      short loc_10026BA相等就跳啦
第二种方法 前天看到的,好像更加简便 查看
http://bbs.pediy.com/showthread.php?t=126802
感谢这位朋友的共享精神;
第三种没尝试
直接修改   jz      short loc_10026BA   
           jz      loc_1004FE9
           jbe     short loc_100429F
第三种没实践过只是大概估计,有兴趣的朋友可以尝试一下。多实践总不会错
至于那些SSDT HOOK呀inline-hook要我相信大部分人都能解决的。
本人能力有限。此文章如果有什么不正确的地方,希望大家指正一下,共同学习,共同进步嘛。



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

上传的附件:
  • 1.jpg (112.76kb,2582次下载)
  • 2.jpg (42.63kb,2578次下载)
收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 144
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
mov     eax, dword_100CEDC //这里存放着EPROCESS的下标
                               mov     eax, [eax+4]      //CEDC+4的位置正是BC   
                               lea     edi, [esi-34h]  //[D1C0-34]的位置存放着EPROCESS结构的地址 注意这里是取地址

想问一下,这里 LZ是如何知道 他就是ERPOCESS的下标....
怎么确定她就是EPROCESS结构的?
2010-12-28 19:44
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
顶顶。
2010-12-28 19:47
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
嗯,看来tp又要更新了...
2010-12-28 21:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
TP很SB,看雪上有人提出来的改Time,也就是偏移0x74和0x78,结果TP就把这两个偏移也XX了,实际上类似可利用的偏移太多了~~
直接X掉校验,随便改,或者操作白名单也不错。。。
2010-12-28 22:01
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
追扑的 小声点说
2010-12-29 11:12
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主你NB啦!虚拟机都能跑DNF!!!哎,我的只能在本机跑,测试起来比较麻烦!
2010-12-29 11:48
0
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
支持楼主下。。。。
2010-12-29 12:20
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[/QUOTE]loc_1002669: mov ecx, dword_100D1C0 //这里比较关键啦。 dword_100D1C0 这个全局变量很重要
mov edx, offset dword_100D1C0

cmp ecx, edx
jz short loc_10026BA// 这个是个关键比较啦
[QUOTE]


我想问下,mov ecx,dword_100D1C0   
      mov     edx, offset dword_100D1C0
这2句,得到的东西不一样吧,拿来比较有什么意义
2010-12-29 16:17
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
虚拟机是可以跑DNF啊,我的就是虚拟机里跑的。。。
2010-12-29 21:53
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
TP还是善良,没把关键代码VM了
2010-12-29 22:10
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
是啊,还是 HP强悍
2010-12-30 09:25
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
改0x74,0x78?
好像是CreateTime和EndTime,不能用了。
2011-1-1 02:22
0
雪    币: 356
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
坐等本段代码被VM
2011-1-4 16:25
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
lz好强大

mark一下,等待学习
2011-1-13 21:21
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
还是INT22,INT23够强大。。。
2011-1-14 16:26
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
把debugport改道ExAllocatePool一个地址算了
2011-2-21 15:18
0
游客
登录 | 注册 方可回帖
返回
//