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 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
我用的火狐浏览器,普通回复的模式下看不到验证码。请了解。 好吧,这个可以结贴了。我承认我汇编不及格。 哇,居然给了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:}
多谢老大!{:soso_e142:} 第一论坛上有源码的。真心的不会蓝屏,肯定是能找到的ssdt的地址的 Tesla.Angela 发表于 2012-2-18 23:38 static/image/common/back.gif
这是外国人的搜索方法,我的搜索方法是特征码搜索。。。
已经通过短信回复你了。。。 ...
也回复我一份吧,哈哈哈 watchsky 发表于 2012-5-28 19:19 static/image/common/back.gif
也回复我一份吧,哈哈哈
真无语。。。我那个HOOK SSDT开源的帖子,不是你第一个回复的么?
http://www.m5home.com/bbs/thread-6495-1-1.html Tesla.Angela 发表于 2012-5-28 19:49 static/image/common/back.gif
真无语。。。我那个HOOK SSDT开源的帖子,不是你第一个回复的么?
http://www.m5home.com/bbs/thread-64 ...
哦,你的那个收索方法我看到了,原来在restore ssdt里,哈哈
页:
[1]