32位ssdthook

本文介绍了如何通过底层操作获取Windows系统服务表(ServiceTable),解除写保护并实现服务函数的劫持与替换,以及在修改过程中遇到的堆栈平衡问题和权限限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先获取_KPCR->_KPRCB->_KTHREAD->ServiceTable

typedef struct _SYSTEM_SERVICE_DESCRIPTOR_TABLE {
    PVOID		ServiceTableBase;			//SSDT表的基地址
    PVOID		ServiceCounterTableBase;
    ULONG_PTR	NumberOfServices;			//SSDT表中服务函数的个数
    PVOID		ParameterTableBase;
}SYSTEM_SERVICE_DESCRIPTOR_TABLE, * PSYSTEM_SERVICE_DESCRIPTOR_TABLE;

	PSYSTEM_SERVICE_DESCRIPTOR_TABLE ServiceTable = 0;
	__asm {
		mov eax, fs : [0x124];
		mov eax, [eax + 0xbc];
		mov[ServiceTable], eax;
	}

然后需要关闭写保护->修改函数->开启写保护

VOID SSDTHook(DWORD serviceNum) {
	PSYSTEM_SERVICE_DESCRIPTOR_TABLE ServiceTable = 0;
	__asm {
		mov eax, fs : [0x124];
		mov eax, [eax + 0xbc];
		mov[ServiceTable], eax;
		mov eax, cr0;
		and eax, ~0x10000;
		mov cr0, eax;
	}
	pTargetFunc = (PULONG)ServiceTable->ServiceTableBase + serviceNum;
	oraginalFunc = *pTargetFunc;
	*pTargetFunc = test;
	__asm {
		mov eax, cr0;
		or eax, 0x10000;
		mov cr0, eax;
	}
}

替换的函数注意堆栈平衡,后来研究发现,如果是需要管理员权限的程序是打不开的,大概率因为函数内部做了检查函数地址

NTSTATUS __declspec(naked) test(DWORD par1, DWORD par2, DWORD par3, DWORD par4) {
	__asm {
		push ebp;
		mov ebp, esp;
		sub esp, 8;
		mov eax, oraginalFunc;
		mov[ebp - 8], eax;
	}
	DbgPrint("Hell world\n");
	__asm {
		push par4;
		push par3;
		push par2;
		push par1;
		mov edx, [ebp - 8];
		mov [ebp - 4], edx;
		call [ebp - 4];

		mov esp, ebp;
		pop ebp;
		retn 0x10;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值