首页
社区
课程
招聘
[讨论]关于恢复内核函数
发表于: 2008-8-10 20:17 5509

[讨论]关于恢复内核函数

2008-8-10 20:17
5509
大家都知道 系统内核函数有N多个函数

但是我用冰刃等软件查看的ssdt表上 只有 NT开头的那些

对于其他的函数 如何用编程来获取地址呢?能否给个例子 比如KiFastCallEntry
这样的函数 如何获取地址并且修改之呢?

网上的恢复ssdt表的例子 都只恢复了 冰刃的那些 没有修改象KiFastCallEntry
这样的函数

所以来讨个例子 这样方便以后修改内核 也方便学习 内核结构

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
lkd> u KiFastCallEntry
nt!KiFastCallEntry:
804de88f b923000000      mov     ecx,23h
804de894 6a30            push    30h
804de896 0fa1            pop     fs
804de898 8ed9            mov     ds,cx
804de89a 8ec1            mov     es,cx
804de89c 648b0d40000000  mov     ecx,dword ptr fs:[40h]
804de8a3 8b6104          mov     esp,dword ptr [ecx+4]
804de8a6 6a23            push    23h
lkd> dd KiFastCallEntry
804de88f  000023b9 0f306a00 8ed98ea1 0d8b64c1
804de89f  00000040 6a04618b 6a9c5223 08c28302
804de8af  244c809d 1b6a0201 030435ff 006affdf
804de8bf  57565355 1c1d8b64 6a000000 24b38b3b
804de8cf  ff000001 ff03c733 8bffffff 016a186e
804de8df  8148ec83 00029ced 4086c600 01000001
804de8ef  850fec3b ffffff65 002c6583 ff2c46f6
804de8ff  0134ae89 850f0000 fffffe35 8b605d8b

搜索特征码,或者找找看看有什么导出的函数调用KiFastCallEntry
2008-8-10 20:54
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
搜索特征码的方法示例如下:

ULONG ntosknlBase;
ULONG ntosknlEndAddr;

//获取模块开始和结束地址
void GetKernelModuleBaseEnd()
{
   NTSTATUS ntStatus;
   ULONG  size;
   PULONG buf;
   PSYSTEM_MODULE_INFORMATION pSystemModule;

   ZwQuerySystemInformation(SystemModuleInformation, &size, 0, &size);
   if( NULL == (buf = (PULONG)ExAllocatePool(PagedPool, size)) )
   {
      DbgPrint("failed alloc memory failed  \n");
      return ;
   }
     
   ntStatus = ZwQuerySystemInformation( SystemModuleInformation, buf, size , 0 );
   if( !NT_SUCCESS(ntStatus) )
   {
      DbgPrint("failed  query\n");
      return ;
   }
   pSystemModule = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);
   ntosknlBase = (ULONG)pSystemModule->Base;
   ntosknlEndAddr = (ULONG)pSystemModule->Base + (ULONG)pSystemModule->Size;
   ExFreePool(buf);
}

//通过内存搜索定位未导出的PspTerminateProcess地址
PVOID XPGetPspTerminateProcess()
{
         ULONG  i;
         ULONG  retAddr;
         
   for( i=ntosknlBase; i<=ntosknlEndAddr; i++ )
   {
      if ( (*((ULONG *)(i+ 0)) == 0x8b55ff8b ) &&
           (*((ULONG *)(i+ 4)) == 0xa16456ec ) &&
           (*((ULONG *)(i+ 8)) == 0x00000124 ) &&
           (*((ULONG *)(i+12)) == 0x3b08758b ) )
      {   
         retAddr = i;
         DbgPrint("PspTerminateProcess() adress is (805c88e6):%x", retAddr);  
         return (PVOID)retAddr;
      }
   }
   return NULL;
}

PHANDLE_TABLE pPspCidTable = NULL;

第二种方法的示例:
//通过搜索PsLookupProces**yProcessId函数,获取PspCidTable的地址
ULONG GetPspCidTable()
{
   PUCHAR Buff;
   PUCHAR p;
   UNICODE_STRING usPsLookup;
   ULONG pPspCidTable;

   RtlInitUnicodeString (&usPsLookup,
         L"PsLookupProces**yProcessId");
   Buff = (PUCHAR)MmGetSystemRoutineAddress(&usPsLookup);
   for( p=Buff; p < Buff+PAGE_SIZE; p++ )
   {
     if( MmIsAddressValid( (PVOID)p ) )
     {
        if((*(PUSHORT)p == 0x35ff ) && (*(p+6) == 0xe8 ))
        {
           pPspCidTable = *(PULONG)( p + 2 );
           break;
        }
     }
   }
   DbgPrint("PspCidTable(XPSP2:8055a560) = 0x%08X\n", pPspCidTable);
   return pPspCidTable ? pPspCidTable : 0;
}
2008-8-14 01:35
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
4
特征码搜索整个内核空间不好用。。。移植性不好。。。最好由导出的搜没导出的。。因为一般这些接口不变。。搜索相对稳定。。另外PspCidTable不用搜就可以直接获取。。好像是那个PSOBJECTYPE一个偏移获得。。。
2008-8-14 09:34
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
嗯~0xffdff034

好像是一个叫Opc0de的发现的。
2008-8-14 10:37
0
游客
登录 | 注册 方可回帖
返回
//