-
-
[旧帖]
[原创]win7下得到PspCidTable的地址
0.00雪花
-
发表于:
2012-3-8 19:19
2873
-
[旧帖] [原创]win7下得到PspCidTable的地址
0.00雪花
win7下获取获取PspCidTable的地址,一个隐藏进程的代码在虚拟机中测试时用的Win 2003,源码是:
NTSTATUS
GetPspCidTable( OUT PHANDLE_TABLE* ppPspCidTable ) {
NTSTATUS status;
PUCHAR cPtr;
unsigned char * pOpcode;
ULONG Length;
UNICODE_STRING uniPsLookup;
ULONG PsLookupProcessByProcessId;
status = STATUS_NOT_FOUND;
RtlInitUnicodeString(&uniPsLookup, L"PsLookupProcessByProcessId");
PsLookupProcessByProcessId = (ULONG)MmGetSystemRoutineAddress(&uniPsLookup);
for (cPtr = (PUCHAR)PsLookupProcessByProcessId;
cPtr < (PUCHAR)PsLookupProcessByProcessId + PAGE_SIZE;
cPtr += Length)
{
Length = SizeOfCode(cPtr, &pOpcode); //credit to LDasm.c by Ms-Rem
if (!Length) break;
if (*(PUSHORT)cPtr == 0x35ff && *(pOpcode + 6) == 0xE8)
{
*ppPspCidTable = **(PVOID **)(pOpcode + 2);
DbgPrint("PspCidTable的地址:0x%.8X",*ppPspCidTable);
status=STATUS_SUCCESS ;
return status;
}
}
return status;
}
通过搜索//PsLookupProcessByProcessId函数,获取PspCidTable的地址,能达到他的功能。win7版本号是6和1,没win7的,用windbg双机调试win2003
其中有两排数据:ff35e0628a80 push dword ptr[nt!PspCidTable(808a62e0)]
e8f4d70300 call nt!ExMapHandleToPointer(8098268e)
发现没0x35ff与0xe8就是上面的特征码。
而在win7中用windbg(windbg最好是用微软官网下的调试符号包安装后自代的那个)内核调试查看Win7的数据:
在win7中特征码变了,成了0x3d8b和0xe8。改好后在win7中测试能获得。
才学驱动肯定有很多不懂不会,但要有去将它明白的想法和行动,这样才会有所收获,虽然自己在大学自学两年驱动了,说白了还是菜鸟,看着前辈们写的代码心里崇拜,虽然是很老的了但这些是基础,勿在浮沙筑高台。
在学习以前的代码时有很多数据因版本不一而数据不一,无法成功就会影响自己的兴趣。以前遇到过EPROCESS的偏移问题,其实挺简单的用Windbg查下就行了,但自己动手解决的这个过程就是学到知识的关键
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课