首页
社区
课程
招聘
[求助]KeAddSystemServiceTable的问题
发表于: 2010-1-20 02:36 7285

[求助]KeAddSystemServiceTable的问题

2010-1-20 02:36
7285
ULONG GetShadowTableAddress()
{
        ULONG dwordatbyte,i;
        PUCHAR p = (PUCHAR) KeAddSystemServiceTable;
        for(i = 0; i < PAGE_SIZE; i++, p++)//  往下找一页 指针递增1
        {
                __try
                {
                        dwordatbyte = *(PULONG)p;
                }
                __except(EXCEPTION_EXECUTE_HANDLER)
                {
                        return FALSE;
                }
                if(MmIsAddressValid((PVOID)dwordatbyte))
                {
                        if(memcmp((PVOID)dwordatbyte, KeServiceDescriptorTable, 16) == 0)//对比前16字节 相同则找到
                        {
                                if((PVOID)dwordatbyte == KeServiceDescriptorTable)//排除自己
                                {
                                        continue;
                                }
                                return dwordatbyte;
                        }
                }
        }
        return FALSE;
}

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;函数功能:寻找SSSDT的基地址                                          :
;原理:KeServiceDescriptorTable和KeServiceDescriptorTableShadow在同页:
;两表前面的ntoskrnl的SYSTEM_SERVICE_TABLE相同,不同的是后面win32k    :
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  
   GetSSSDTAddress proc uses ecx
     
   LOCAL dwordatbyte
   
   call KeAddSystemServiceTable
   mov eax ,dwordatbyte
   xor ecx,ecx
  

        .while ecx < PAGE_SIZE
      
              invoke   MmIsAddressValid ,dwordatbyte
         
             .if eax       ;检查连接的指针是否有效
            
             invoke memcmp,dwordatbyte, KeServiceDescriptorTable, sizeof SYSTEM_SERVICE_TABLE
                                
                 .if  eax==0                       ;对比前16字节 相同则找到
                                            
                          .if  dwordatbyte == KeServiceDescriptorTable  ;排除自己
                           
                                    .continue  ;跳过本次循环
                              
                          .endif
                               
                  mov eax,dwordatbyte
                                   
                 .endif        
                              
                                      
              .endif
   
          add dwordatbyte ,1
          inc ecx
         
        .endw
  
   xor eax,eax
   ret
   GetSSSDTAddress endp

这个是寻找SSSDT的基地址得过程

其中红色标注的部分 是予值操作还是调用操作?

也就是下面这句:

p=(unsigned char *)KeAddSystemServiceTable;

我想是预置操作吧,我用call 直接蓝屏

大家帮我看看,我理解有错吗?谢谢

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
2
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;函数功能:寻找SSSDT的基地址                                          :
;原理:KeServiceDescriptorTable和KeServiceDescriptorTableShadow在同页:
;两表前面的ntoskrnl的SYSTEM_SERVICE_TABLE相同,不同的是后面win32k    :
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  
   GetSSSDTAddress proc uses ecx
     
   LOCAL dwordatbyte
   
   
   push KeAddSystemServiceTable
    pop dwordatbyte
   


   invoke   MmIsAddressValid ,dwordatbyte
   
   .if !eax
          
           jmp exit
          
   .endif
  
   
   xor ecx,ecx
  

        .while ecx < PAGE_SIZE
      
              invoke   MmIsAddressValid ,dwordatbyte
         
             .if eax       ;检查连接的指针是否有效
            
             invoke memcmp,dwordatbyte, KeServiceDescriptorTable, sizeof SYSTEM_SERVICE_TABLE
                                
                 .if  eax==0                       ;对比前16字节 相同则找到
                                            
                          .if  dwordatbyte == KeServiceDescriptorTable  ;排除自己
                           
                                    .continue  ;跳过本次循环
                              
                          .endif
                               
                  mov eax,dwordatbyte
                                   
                 .endif        
                              
                                      
              .endif
   
          add dwordatbyte ,1
          inc ecx
         
        .endw
        
   exit:
   
   xor eax,eax
   ret
   GetSSSDTAddress endp

我改成这样是否正确了?
2010-1-20 02:43
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
3
测试了下,没蓝
2010-1-20 03:03
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
楼主用汇编写驱动啊,对了。也可以用invoke的吗?
2010-1-20 09:02
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
以前整过这个demo...
2010-6-7 02:21
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
赋值操作
2010-6-8 12:43
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7
赋值,把KeAddSystemServiceTable的地址保存至p,类型是PUCHAR
2010-6-9 21:48
0
游客
登录 | 注册 方可回帖
返回
//