- 注册时间
 - 2022-8-23
 
- 最后登录
 - 2024-3-6
 
- 在线时间
 - 2 小时
 
 
 
 
 
编程入门 
  
	- 天马币
 - 24 
 
 
 
 
 | 
 
简单分析,小弟能力有限如果有什么错误的话,欢迎各位牛牛指正,共同进步嘛 
 
第一处清零代码- 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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
loc_1002660:- call    ds:KfAcquireSpinLock
 - mov     [ebp+NewIrql], al
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
loc_1002669:- mov     ecx, dword_100D1C0  //这里比较关键啦。 dword_100D1C0 这个全局变量很重要
 - mov     edx, offset dword_100D1C0
 - cmp     ecx, edx
 - jz      short loc_10026BA// 这个是个关键比较啦
 - push    ebx
 - push    edi
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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
  
  
[color=rgb(51, 102, 153) !important]复制代码 
上面这一段把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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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 //重启机器
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
其实这里注意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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
loc_100422B:-                       cmp     [ebp+var_4], 17606A55h //上面一系列的计算和(17606A55计算后的总大小)比较,如果被修改了就重启
 -                       jz      short loc_100423E
 -                       call    sub_100163C  //重启
 -                       mov     eax, dword_100CA6C
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
loc_100423E:-                      and     [ebp+var_C], 0
 -                      test    eax, eax
 -                      jbe     short loc_100429F //这个跳可以修改
 -                      mov     esi, offset unk_100B26C
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
重启代码-           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
 
 
  
[color=rgb(51, 102, 153) !important]复制代码 
解决方法很多,我说几种 
 
第一种是我以前用的一种比较挫的,其实最重要的是解决监控哪里, 
     分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相等就跳啦 
 
第二种方法 前天看到的,好像更加简便 查看 
感谢这位朋友的共享精神; 
第三种没尝试 
直接修改 
       jz      short loc_10026BA    
           jz      loc_1004FE9 
           jbe     short loc_100429F 
 
第三种没实践过只是大概估计,有兴趣的朋友可以尝试一下。多实践总不会错 
至于那些SSDT HOOK呀inline-hook要我相信大部分人都能解决的。 
本人能力有限。此文章如果有什么不正确的地方,希望大家指正一下,共同学习,共同进步嘛。 
 |   
 
 
 
 |