能力值:
( LV2,RANK:10 )
|
-
-
2 楼
回调函数是这么写的
BOOLEAN CALLBACK EnumSymRoutine(
PSYMBOL_INFO psi,
ULONG SymSize,
PVOID Context)
{
printf("name = %s address = %llx \n", psi->Name, psi->Address);
return TRUE;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我记得从x64 SSDT中得到的也是32位的地址,是相对SSDT的地址,用表地址加上相对地址就得到函数地址。不知道符号表是怎么样的,试一试呗。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
好像不是。。。ssdt是表地址 + 偏移。。。。。所以表地址肯定一样。。。俩偏移相减 等于 俩真实函数地址的差。。。。
我从符号表获取俩函数地址 相减。。。得到的差 和真实俩函数地址的差不等。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
从那里抄的源码?能传一份吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
可以啊 1
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
难道你抄来的代码没有计算公式?
ULONGLONG GetSSDT_ADDR(ULONGLONG __F_addr,UINT __Index)
//函数功能:参数__F__addr为KeServiceDescriptorTable的基地址,参数__Index为要获取地址函数的索引,成功返回函数地址,失败返回0
{
LONG dwTemp = 0;
ULONGLONG qwTemp,stb,ret;
stb = __F_addr;
//以下通过传入的基地址计算函数的偏移,再计算出函数的真实地址。
qwTemp = stb + 4 *__Index;
dwTemp = *(PLONG)qwTemp;
dwTemp = dwTemp >> 4;
ret = stb + (LONG64)dwTemp;
return ret;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
我已经解决了。。。64位系统编译成64位程序就行了。。代码不用改。。。
不过您知道怎么用32位读取64位系统么
|
|
|