首页
社区
课程
招聘
[讨论][已解决,自己的汇编不足,大家见笑了。]KeServiceDescriptorTable表的一些疑问.大家讨论下.
发表于: 2011-10-20 11:10 6664

[讨论][已解决,自己的汇编不足,大家见笑了。]KeServiceDescriptorTable表的一些疑问.大家讨论下.

2011-10-20 11:10
6664
http://bbs.pediy.com/showthread.php?t=85004
帖子中有一段汇编代码
如下:(fixfix提供)
xp
   
    mov edi, dword ptr [KeServiceDescriptorTable]
    mov ebx, [edi] 
    
    mov esi, [ebx+(115h*4)] 
    mov NtWriteVirtualMemory_addr ,esi


    mov esi, [ebx+(0bah*4)] 
    mov NtReadVirtualMemory_addr,esi


//---------------------------------------------------------------- 
下面是截图的一个debug的数据表.可知.
[COLOR="Red"]上面的
mov ebx, [edi]
应该有些多余吧.edi中直接就是第一个索引的地址了.后面的索引直接加4*index就得地址了.[/COLOR]

  lkd> dd KeServiceDescriptorTable
_________________________________________________
8055a680  |804e36a8 00000000 0000011c 80513eb8
8055a690  |00000000 00000000 00000000 00000000
8055a6a0  |00000000 00000000 00000000 00000000
8055a6b0  |00000000 00000000 00000000 00000000
8055a6c0  |00002710 bf80c247 00000000 00000000
8055a6d0  |fa35da80 f9cab9e0 812666c8 806fef40
8055a6e0  |00000000 00000000 00000000 00000000
8055a6f0   |6ef49d40 01c92e61 00000000 00000000
//----------------------------------------------------------------

下面的是找到的一些相关定义
1:  typedef struct _KSYSTEM_SERVICE_TABLE
   2:  {
   3:      PULONG  ServiceTableBase;          // SSDT (System Service Dispatch Table)的基地址
   4:      PULONG  ServiceCounterTableBase;   // 用于 checked builds, 包含 SSDT 中每个服务被调用的次数
   5:      ULONG   NumberOfService;           // 服务函数的个数, NumberOfService * 4 就是整个地址表的大小
   6:      ULONG   ParamTableBase;            // SSPT(System Service Parameter Table)的基地址
   7:   
   8:  } KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;
   9:   
  10:  typedef struct _KSERVICE_TABLE_DESCRIPTOR
  11:  {
  12:      KSYSTEM_SERVICE_TABLE   ntoskrnl;  // ntoskrnl.exe 的服务函数
  13:      KSYSTEM_SERVICE_TABLE   win32k;    // win32k.sys 的服务函数(GDI32.dll/User32.dll 的内核支持)
  14:      KSYSTEM_SERVICE_TABLE   notUsed1;
  15:      KSYSTEM_SERVICE_TABLE   notUsed2;
  16:   
  17:  } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
看了各位网友的回复:
mov edi, dword ptr [KeServiceDescriptorTable]

这一句是把指针的值给edi,还是把KeServiceDescriptorTable指向的数据写入了edi呢?写大家说说自己的看法

看了大家这么热心的解答,真的很感动。不过可能自己提问的方式没有让大家明白我的真正的意图。其实后来我发现就是一句汇编代码理解上有误差,导致了这些问题。其实就是关于变量的符号表示是什么意思的问题,这个理解好了,这个问题也就解决了。
下面给出一个函数的的例子。希望给初学入门的人一点帮助。

[COLOR="Red"][B]//这个是c的源代码.[/B][/COLOR]
#include "stdio.h"
#include "windows.h"
int myfunction(int a ,int b)
{
	int c = a+b;
	return c;
}
void main()
{
	printf("enter main\n");
	int x=myfunction(45,23);
	printf("the value of x is:%d\n",x);
}

接下来是vc6的反汇编代码:
vc6的反汇编比较的原始,不过可以很清楚的说明问题.红色标记的就是直接用的ebp+偏移来表示的
一个变量的地址.然后方括号表示这是一个存储器值.里面是存储器的地址.加了方括号分别表示变量a与变量b的值.前面有一个dword ptr,表示是一个双字指针.而如果把[]直接理解为指针变量取所指向的变量的值,这样就更易懂了.
"[xxx]:xxx是一个指针,加上dword ptr说明是一个双字指针.然后把[]括号加上,这样就取指针指向的值,具体的:
mov         eax,dword ptr [ebp+8]
ebp+8是一个指针值(某个变量的地址),dword prt说明 是一个双字指针.
加上[]则取这个指针指向的变量的值.也就是把变量a的值赋值到寄存吕eax中去
"

int myfunction(int a ,int b)
4:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,44h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-44h]
0040102C   mov         ecx,11h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
5:        int c = a+b;
00401038   [COLOR="red"]mov         eax,dword ptr [ebp+8][/COLOR]
0040103B   [COLOR="red"]add         eax,dword ptr [ebp+0Ch][/COLOR]
0040103E   mov         dword ptr [ebp-4],eax
6:        return c;
00401041   mov         eax,dword ptr [ebp-4]
7:    }
00401044   pop         edi
00401045   pop         esi
00401046   pop         ebx
00401047   mov         esp,ebp
00401049   pop         ebp
0040104A   ret
--- No source file  ---------------------------

而对于vs2008的编译,则直接把地址用符号来代替了.请看下面vs2008的反汇编代码.
把ebp+8改写成了a.直接用它的符号.所以得到结论
变量的符号代表的是变量的地址,而不是变量的值本身
正是因为如此,我把KeServiceDescriptorTable理解成了这个变量本身的值,而不是真正的它的地址.所以若理解为值本身的话.加括号后[]表示把它看成是一个指针.然后取出的就是它指向的变量的值.所以我以为第一句代码就取出了索引表的基地址.下面的第二句当然就是多余的了.
这里的理解出现错误有一个潜在的前提:那就是对汇编不太熟.另外最重要的原因是这个变量本身就是一个指针,所以不得不让人直接理解是一个指针.加括号理所当然则是取出了它指向的变量的值.特此说明,以此大家共勉

int myfunction(int a ,int b)
{
012313B0  push        ebp  
012313B1  mov         ebp,esp 
012313B3  sub         esp,0CCh 
012313B9  push        ebx  
012313BA  push        esi  
012313BB  push        edi  
012313BC  lea         edi,[ebp-0CCh] 
012313C2  mov         ecx,33h 
012313C7  mov         eax,0CCCCCCCCh 
012313CC  rep stos    dword ptr es:[edi] 
	int c = a+b;
012313CE  [COLOR="red"]mov         eax,dword ptr [a] [/COLOR]
012313D1 [COLOR="red"] add         eax,dword ptr [b] [/COLOR]
012313D4  mov         dword ptr [c],eax 
	return c;
012313D7  mov         eax,dword ptr [c] 
}
012313DA  pop         edi  
012313DB  pop         esi  
012313DC  pop         ebx  
012313DD  mov         esp,ebp 
012313DF  pop         ebp  
012313E0  ret              
--- 无源文件 ----------------------------------------------------------------

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 688
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发呀
2011-10-20 11:28
0
雪    币: 688
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
貌似可以省略的, 如有疑问可以单步跟踪看下
2011-10-20 11:32
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mov ebx, [edi]  edi是KeServiceDescriptorTable地址,ebx才是第一个索引的地址
2011-10-20 12:38
0
雪    币: 122
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=xiaogangha;1011507]
mov ebx, [edi]  edi是KeServiceDescriptorTable地址,
ebx才是第一个索引的地址[/QUOTE]

    mov edi, dword ptr [KeServiceDescriptorTable]
    这一句,那个   KeServiceDescriptorTable就是一个指针,然后执行这一条指令后就把相应地址的数据写入到了ebx中去.

    也就是说:
1:  typedef struct _KSYSTEM_SERVICE_TABLE
   2:  {
   3:    [COLOR="Magenta"][B]  PULONG  ServiceTableBase;          // SSDT (System Service Dispatch Table)[/B][/COLOR]的基地址
   4:      PULONG  ServiceCounterTableBase;   // 用于 checked builds, 包含 SSDT 中每个服务被调用的次数
   5:      ULONG   NumberOfService;           // 服务函数的个数, NumberOfService * 4 就是整个地址表的大小
   6:      ULONG   ParamTableBase;            // SSPT(System Service Parameter Table)的基地址
   7:   
   8:  } KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;

紫色的那一个指针值(也就是)索引表的地址都已经写到ebx去了呀?
    mov ebx, [edi]
   
    mov esi, [ebx+(115h*4)]
    mov NtWriteVirtualMemory_addr ,esi

    mov esi, [ebx+(0bah*4)]
    mov NtReadVirtualMemory_addr,esi
2011-10-20 12:56
0
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
lkd> dd KeServiceDescriptorTable
843a19c0  842a8860 00000000 00000191 842a8ea8
843a19d0  00000000 00000000 00000000 00000000
.....
KeServiceDescriptorTable是内核导出的变量 ,
mov edi, dword ptr [KeServiceDescriptorTable]   
//取变量KeServiceDescriptorTable的地址存于edi ,即 edi =843a19c0
mov ebx, [edi]   
//取ssdt服务表基地址即第一个索引的地址存于ebx中
楼主可以单步调试 看下EDI和EBX 的值
2011-10-20 13:29
0
雪    币: 181
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
楼上正解,一切以调试为基础。
2011-10-20 13:37
0
雪    币: 122
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
楼 上的楼上的想法可能是对的,不过表达上可能有些问题.第一句不是取的它的地址,而是把那个变量的值给赋值到了edi中去.他可能把KeServiceDescriptorTable这个变量直接理解成了那个表[从上面的定义可以看到这一个表是一个数组]本身.我看到的资料显示应该是一个表的指针,而不是表本身.所以第一句是把变量的值写入到了寄存器,而不是把它的地址写入到了edi中.
若是像xiaogangha理解是是表(数组本身)则是正确的.若是一个变量指针指向那个表(数组)则是错误的.
但是洽巧的是你的调试看到的是一样的.
也就是说不管你是理解为把变量的值(KeServiceDescriptorTable)写到了edi中去,还是把它的地址(此时的理解这个变量为数组本身)写到了edi中去,结果都是一样的.edi中存储的一定是一个地址.且指向 了索引表.
2011-10-20 14:29
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
汇编基础 [XXXXXXXXXXX]表示取XXXXX地址的数据
2011-10-23 10:54
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
[寄存器]   [指针变量]
2011-10-23 10:54
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
mov edi, dword ptr [KeServiceDescriptorTable]   ;edi = *KeServiceDescriptorTable
    mov ebx, [edi]    ;ebx = *KeServiceDescriptorTable.ServiceTableBase
   
    mov esi, [ebx+(115h*4)]    ;esi = *KeServiceDescriptorTable.ServiceTableBase + 115h * 4

1:  typedef struct _KSYSTEM_SERVICE_TABLE
   2:  {
   3:      PULONG  ServiceTableBase;          // SSDT (System Service Dispatch Table)的基地址
   4:      PULONG  ServiceCounterTableBase;   // 用于 checked builds, 包含 SSDT 中每个服务被调用的次数
   5:      ULONG   NumberOfService;           // 服务函数的个数, NumberOfService * 4 就是整个地址表的大小
   6:      ULONG   ParamTableBase;            // SSPT(System Service Parameter Table)的基地址
   7:   
   8:  } KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;
2011-10-27 13:10
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
给新手答疑了
2011-10-31 01:23
0
游客
登录 | 注册 方可回帖
返回
//