首页
社区
课程
招聘
[原创]从应用层进程中KiFastSystemCall接管进入内核的一切
发表于: 2014-7-6 11:06 14300

[原创]从应用层进程中KiFastSystemCall接管进入内核的一切

2014-7-6 11:06
14300

早期时候发过一个帖子 http://bbs.pediy.com/showthread.php?t=163658 介绍 HOOK KiFastSystemCall 这算是这帖子的延续 完整版.   

大致原理就是构造一个类似内核中SSDT表的HOOK数组存,当有函数通过KiFastSystemCall进入系统内核时 查找HOOK数组,看对应的Index中有无函数地址,有的话跳入新函数地址.  主要问题在于进入我们的函数时如果获取参数并且获取调用后函数返回!


DWORD	dwKiFastSystemCall;
DWORD	dwKiFastSystemCallReturn;

//HOOK后跳入的函数地址
DWORD dwHookSystemCall[0x2048*2];

//保存原始函数调用地址
DWORD *dwOrigSystemCall[0x2048*2];

__declspec(naked) void KiFastSystemCallEx()
{
	__asm  {
		mov edx,esp
		__emit 0x0F
		__emit 0x34
		retn
	}
}
//EX SystemCall
__declspec(naked) void SystemCall()
{
	__asm  {
		__emit 0x90
		mov eax,0x11B2
		call KiFastSystemCallEx
		retn 0xFF
		__emit 0x90
	}
}
__declspec(naked) void KiFastSystemCall()
{
	
	__asm{
		pushad
			pushfd

			cmp         dword ptr [eax*4+dwHookSystemCall],0

			jz          Label
			popfd
			popad
			add         esp,4
			jmp         dword ptr [dwHookSystemCall+eax*4]

Label:
			popfd
			popad
			jmp         KiFastSystemCallEx

	}

}
add         esp,4

//初始化
BOOL HookSystemCall::Initialization()
{
	DWORD dwOldProtect;
	HMODULE hModule = GetModuleHandleA("NTDLL.dll");

	dwKiFastSystemCall = PtrToUlong(GetProcAddress(hModule, "KiFastSystemCall"));
	dwKiFastSystemCallReturn = dwKiFastSystemCall + 2;

	VirtualProtect(ULongToPtr(dwKiFastSystemCall - 0xA), 100, PAGE_EXECUTE_READWRITE, &dwOldProtect);

	//保存原始代码
	memcpy(szCode,(VOID*)(dwKiFastSystemCall - 6),0xF);

	//	Hook KiFastSystemCall
	*(PWORD)ULongToPtr(dwKiFastSystemCall) = 0xF9EB;
	*(PBYTE)ULongToPtr(dwKiFastSystemCall - 0x5) = 0xE9;
	*(PDWORD)ULongToPtr(dwKiFastSystemCall - 0x4) = PtrToUlong(KiFastSystemCall) - (dwKiFastSystemCall - 0x5) - 5;
	
	return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
刚睡醒,占个楼...
2014-7-6 11:26
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
mark
2014-7-6 12:09
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
4
某些 调试器 也是应用这个,r3   r0  跳到自己的新函数,从而无视.缺点在于,很多杀毒软件 游戏都会检测这个地方
2014-7-6 12:32
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
一般不检测,主要是很少人会想到用这个地方HOOK 来监视进程!
2014-7-7 17:48
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
6
数字不是很早就用了吗?
2014-7-7 17:59
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
看清楚!R3下...NTDLL.DLL!!
2014-7-7 22:56
0
雪    币: 27
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark
2015-5-28 21:23
0
雪    币: 12
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
没试
WIN8 WIN10应该是不行的
2015-9-28 14:22
0
雪    币: 31
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
刚睡醒,占个楼...
2016-4-22 21:11
0
游客
登录 | 注册 方可回帖
返回
//