wenh7788 发表于 2012-2-17 09:47:14

64位找SSDT的疑惑

本帖最后由 wenh7788 于 2012-2-17 09:49 编辑

看到如下的代码,
ULONGLONG GetKeServiceDescriptorTable64()
{
//Pattern
char KiSystemServiceStart_pattern = "\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x25\xFF\x0F\x00\x00";

//Scan boundaries
×××××××××××××××××××××××××不明白×××××××
ULONGLONG CodeScanStart = (ULONGLONG)&_strnicmp;
ULONGLONG CodeScanEnd = (ULONGLONG)&KdDebuggerNotPresent;
×××××××××××××××××××××××××不明白×××××××

//Another needed variables
UNICODE_STRING Symbol;
ULONGLONG i, tbl_address, b;

//Loop - to find the KiSystemServiceStart function
for (i = 0; i < CodeScanEnd - CodeScanStart; i++)
{
//Check if those bytes are equal to our pattern-bytes
if (!memcmp((char*)(ULONGLONG)CodeScanStart +i, (char*)KiSystemServiceStart_pattern,14))
{
//Search lea rdx, * - by opcodes: 4c 8d
for (b = 0; b < 50; b++)
{
tbl_address = ((ULONGLONG)CodeScanStart+i+b);

//Check for lea rdx, * and calculate base address from relative address

if (*(USHORT*) ((ULONGLONG)tbl_address ) == (USHORT)0x8d4c)
return ((LONGLONG)tbl_address +7) + *(LONG*)(tbl_address +3);
}
}
}
搜索的范围为什么是×号代码处的地方?求解释.谢谢了。

Tesla.Angela 发表于 2012-2-18 23:38:14

这是外国人的搜索方法,我的搜索方法是特征码搜索。。。
已经通过短信回复你了。。。

wenh7788 发表于 2012-2-20 10:06:43

Tesla.Angela 发表于 2012-2-18 23:38 static/image/common/back.gif
这是外国人的搜索方法,我的搜索方法是特征码搜索。。。
已经通过短信回复你了。。。 ...

大哥~~我总算看到你现身了~~你看看我都哭成啥样子了~~{:soso_e109:}

1.老外的方法肯定有他的道理,他为什么从那个地方搜,而不从其他的地方搜?
2.您说的方法我看了。我能明白您提到的有很多有用的寄存器我不知道,可是您是从什么地方了解到这方面的信息呢?
3.
                        if( b1==0x4c && b2==0x8d && b3==0x15 ) //4c8d15
                        {
                              memcpy(&templong,i+3,4);
                              addr = (ULONGLONG)templong + (ULONGLONG)i + 7; ×××××××
                              return addr;
                        }
麻烦您解释下这句代码好吗?
特别是××号出的地方。
-------------------------------我原来的问题--------------------------
fffff800`03c7fff2 4c8d1547782300lea   r10,
fffff800`03c7fff9 4c8d1d80782300lea   r11,
如何通过 前面的opcode 来算出 KeServiceDescriptorTable 即fffff800`03eb7840他的值
我通过代码观察好像是
fffff800`03c7fff9+237847

疑惑1:算KeServiceDescriptorTable 的地址怎么会跟fffff800`03c7fff9有关呢?
疑惑2:按照32位的系统来看的话KeServiceDescriptorTable 的值应该直接对应的是47782300这个值才对啊。

是不是64位下有什么不同的算法呢?还是lea指令的问题?

不知道我表达的是否清楚呢?

再次表示对您的感谢!

PS
我用的火狐浏览器,普通回复的模式下看不到验证码。请了解。

wenh7788 发表于 2012-2-20 16:54:25

好吧,这个可以结贴了。我承认我汇编不及格。

wenh7788 发表于 2012-2-21 16:45:46

哇,居然给了20分,那我就说下原因吧。也省的以后大家会犯迷糊。
其实大家可以去翻翻汇编的书,找到jmp指令的那一节,王爽的自不必说。

newAddress-oldAddress-sizeof(cmd)==bytearray
通过这个就可以算出来了。

我用xp 32位的计算器举个例子吧
里面的一段代码
010125B0    74 04       je short calc.010125B6从这里跳
010125b2    3C 20       cmp al,20
010125b4    76 F2       jbe short alc.010125A8
010125b6    895D B4   mov dword ptr ss:,ebx   跳到这里
根据上面的公式
010125B6- 010125B0   -2=6-2=4

那么按照上面问题中的汇编代码,类比下吧(不知道准不准确)
SSDT(地址未知)-03C7FFF2-7=237847
所以
SSDT地址=237847+7+03C7FFF2=3EB7840

反正我是这么理解的,具体的还是请参考jmp指令吧。

PS
老大你再给我点分呗,我就可以去下载你其他的源码看了,拜托了~~~{:soso_e106:}

wenh7788 发表于 2012-2-22 09:22:39

多谢老大!{:soso_e142:}

wenh7788 发表于 2012-2-28 09:55:41

第一论坛上有源码的。真心的不会蓝屏,肯定是能找到的ssdt的地址的

watchsky 发表于 2012-5-28 19:19:59

Tesla.Angela 发表于 2012-2-18 23:38 static/image/common/back.gif
这是外国人的搜索方法,我的搜索方法是特征码搜索。。。
已经通过短信回复你了。。。 ...

也回复我一份吧,哈哈哈

Tesla.Angela 发表于 2012-5-28 19:49:35

watchsky 发表于 2012-5-28 19:19 static/image/common/back.gif
也回复我一份吧,哈哈哈

真无语。。。我那个HOOK SSDT开源的帖子,不是你第一个回复的么?

http://www.m5home.com/bbs/thread-6495-1-1.html

watchsky 发表于 2012-5-29 10:35:08

Tesla.Angela 发表于 2012-5-28 19:49 static/image/common/back.gif
真无语。。。我那个HOOK SSDT开源的帖子,不是你第一个回复的么?

http://www.m5home.com/bbs/thread-64 ...

哦,你的那个收索方法我看到了,原来在restore ssdt里,哈哈
页: [1]
查看完整版本: 64位找SSDT的疑惑