http://bbs.pediy.com/showthread.php?t=85004
帖子中有一段汇编代码
如下:(fixfix提供)
xp
1 2 3 4 5 6 7 8 9 | 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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //----------------------------------------------------------------
下面是截图的一个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;
看了各位网友的回复:
1 | mov edi, dword ptr [KeServiceDescriptorTable]
|
这一句是把指针的值给edi,还是把KeServiceDescriptorTable指向的数据写入了edi呢?写大家说说自己的看法
看了大家这么热心的解答,真的很感动。不过可能自己提问的方式没有让大家明白我的真正的意图。其实后来我发现就是一句汇编代码理解上有误差,导致了这些问题。其实就是关于变量的符号表示是什么意思的问题,这个理解好了,这个问题也就解决了。
下面给出一个函数的的例子。希望给初学入门的人一点帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [COLOR= "Red" ][B] // 这个是c的源代码.[ /B ][ /COLOR ]
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中去
"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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理解成了这个变量本身的值,而不是真正的它的地址.所以若理解为值本身的话.加括号后[]表示把它看成是一个指针.然后取出的就是它指向的变量的值.所以我以为第一句代码就取出了索引表的基地址.下面的第二句当然就是多余的了.
这里的理解出现错误有一个潜在的前提:那就是对汇编不太熟.另外最重要的原因是这个变量本身就是一个指针,所以不得不让人直接理解是一个指针.加括号理所当然则是取出了它指向的变量的值.特此说明,以此大家共勉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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
--- 无源文件 ----------------------------------------------------------------
|
[注意]看雪招聘,专注安全领域的专业人才平台!