首页
社区
课程
招聘
[不敢声称原创,怕被喷]R3下猥琐NTDLL钩子
发表于: 2013-3-6 05:25 22395

[不敢声称原创,怕被喷]R3下猥琐NTDLL钩子

2013-3-6 05:25
22395
在R3下对NTDLL里面的Zw函数的HOOK 大部分都是在函数前几个字节做HOOK,或者IAT之类的.这样的HOOK 虽然比较方便,不过也存在一个很大的弊端,就是函数HOOK 很容易被检测,所以我们需要一种更猥琐的HOOK方式.当然这只是相对.而不是真的很猥琐......

NTDLL里面的ZW函数大部分都是这样的

MOV EAX,1
MOV EDX,7FFE0300
CALL DWORD PTR DS:[EDX]
RETN 20



NTDLL里面的ZW函数都是通过系统全局共享内存7FFE0300调用KiFastSystemCall进入内核,所以我们要做的就是HOOK这个函数.
77866190 >  8BD4             MOV EDX,ESP
77866192    0F34             SYSENTER
77866194 >  C3               RETN


大家看到了,大小5个字节 而且还有个返回函数,所以我们只能短跳再长跳.....


void HookSystemCall_HOOK()
{
	DWORD dwOldProtect;
	HMODULE hModule = GetModuleHandleA("NTDLL.dll");

	DWORD dwKiFastSystemCall = PtrToUlong(GetProcAddress(hModule, "KiFastSystemCall"));
	VirtualProtect(ULongToPtr(dwKiFastSystemCall - 0xA), 100, PAGE_EXECUTE_READWRITE, &dwOldProtect);


	*(PWORD)ULongToPtr(dwKiFastSystemCall) = 0xF4EB;
	*(PBYTE)ULongToPtr(dwKiFastSystemCall - 0xA) = 0xE9;
	*(PDWORD)ULongToPtr(dwKiFastSystemCall - 0x9) = PtrToUlong(KiFastSystemCall) - (dwKiFastSystemCall - 0xA) - 5;
}



接下来就是JMP到我们的函数里面了.接下来要处理的就是把我们要的ZW函数给分拣出来.大家肯定注意到ZW的汇编代码MOV EAX,1,没错这个1就是ZW函数的序号.既然如此分拣出我们要的函数也不是什么问题

__declspec(naked) void KiFastSystemCall()
{
	
	__asm{
			cmp         eax,1 ;EAX保存着我们需要的函数的序号.我们跳.....
			jz          Label
			jmp         KiFastSystemCallEx
			;其他的返回原始KiFastSystemCall的地方,当然,原来的函数已经被我们JMP出来啦.需要特别处理
Label:
			add         esp,4
			;不再返回到原始的ZwAccessCheck函数里面.而是直接返回调用ZwAccessCheck的函数.
			jmp         MyZwAccessCheck ;
	}
}


上面的函数就是我们的KiFastSystemCall啦.接下来就是我们的MyZwAccessCheck函数.还有一个我们需要自己进入内核的KiFastSystemCallEx函数,我们自己构造一个.当然我们还需要构造一个新的ZwAccessCheck函数,原始的那个函数调用的KiFastSystemCall已经被我们HOOK了.

//自己构造一个KiFastSystemCall  这样原始的RETN问题就解决了.
__declspec(naked) void KiFastSystemCallEx()
{
	__asm  {
		mov edx,esp
		__emit 0x0F
		__emit 0x34
		retn
	}
}

//跳板函数  
__declspec(naked) NTSTATUS NTAPI ZwAccessCheck(
    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
    IN HANDLE ClientToken,
    IN ACCESS_MASK DesiredAccess,
    IN PGENERIC_MAPPING GenericMapping,
    OUT PPRIVILEGE_SET PrivilegeSet,
    OUT PULONG ReturnLength,
    OUT PACCESS_MASK GrantedAccess,
    OUT PNTSTATUS AccessStatus)
{
    __asm
	{
		MOV EAX,1
		CALL KiFastSystemCallEx
		RETN 20
	}
}

NTSTATUS NTAPI MyZwAccessCheck(
    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
    IN HANDLE ClientToken,
    IN ACCESS_MASK DesiredAccess,
    IN PGENERIC_MAPPING GenericMapping,
    OUT PPRIVILEGE_SET PrivilegeSet,
    OUT PULONG ReturnLength,
    OUT PACCESS_MASK GrantedAccess,
    OUT PNTSTATUS AccessStatus)
{
    return ZwAccessCheck(
    ISecurityDescriptor,
    ClientToken,
    DesiredAccess,
    GenericMapping,
    PrivilegeSet,
    ReturnLength,
    GrantedAccess,
    AccessStatus);
}

差不多一个意思....剩下的就是依葫芦画瓢....自由发挥了.

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 6
支持
分享
最新回复 (45)
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
2
恩,不错,支持下~
还可以强大点,比如可以这样:
1:先执行我们自己的函数,在执行原始函数
2:只执行我们自己的函数
3:执行了原始函数之后,在执行我们自己的函数
2013-3-6 08:22
0
雪    币: 10001
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
果然猥琐,,hook KiFastSystemCall 然后加个过滤是吧。
2013-3-6 08:47
0
雪    币: 8599
活跃值: (5060)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
看雪的人才真的多。
2013-3-6 09:08
0
雪    币: 563
活跃值: (4404)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
不是很多安全软件这么干么
2013-3-6 09:12
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
可以啊.....


NTSTATUS NTAPI MyZwAccessCheck(
    IN PSECURITY_DESCRIPTOR SecurityDescriptor,
    IN HANDLE ClientToken,
    IN ACCESS_MASK DesiredAccess,
    IN PGENERIC_MAPPING GenericMapping,
    OUT PPRIVILEGE_SET PrivilegeSet,
    OUT PULONG ReturnLength,
    OUT PACCESS_MASK GrantedAccess,
    OUT PNTSTATUS AccessStatus)
{
    NTSTATUS  ntStatus = ZwAccessCheck(
    ISecurityDescriptor,
    ClientToken,
    DesiredAccess,
    GenericMapping,
    PrivilegeSet,
    ReturnLength,
    GrantedAccess,
    AccessStatus);
    ///各种叉叉....
    return  ntStatus ;

}
2013-3-6 09:54
0
雪    币: 138
活跃值: (306)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
早就用烂了的技巧
2013-3-6 09:54
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
所以才说标题才那样写.....
2013-3-6 10:01
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
如果知道那个7FFE0300是在什么地方设置的,在这里做IAT hook可能更方便吧,不过如果是全局的内存filemap,那麻烦可能有点大。
2013-3-6 10:02
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
这块内存是无法修改的.不信你可以试试...系统里面最特殊的全局共享内存.
2013-3-6 10:04
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
有点意思....嘿嘿..谢谢分享
2013-3-6 10:14
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主观点不错
2013-3-6 11:07
0
雪    币: 107
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
够猥琐,不过还是容易被检测
2013-3-6 11:24
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
14
hook来hook去有意思么, 年轻人不要在hook上浪费青春
2013-3-6 11:45
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
15
...这个地方从应用到内核都是hook,各种hook。
真心浪费时间,精力~
2013-3-6 12:11
0
雪    币: 7971
活跃值: (3650)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
高人,能稍微指点下么?
2013-3-6 12:17
0
雪    币: 304
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
顶下LZ,不过在这放个hook,反而更好检测了。
2013-3-6 13:02
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark一下,学习了
2013-3-6 14:29
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
这个地方HOOK 的好处是可以各种VM啊乱序啊 等等  然后又不会被检测.而且也不知道你HOOK 什么玩意了...
2013-3-6 19:46
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
20
最终还是会知道你hook了什么,用很老的EPA大法直接得到真相...真心伤不起~
2013-3-6 19:57
0
雪    币: 107
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
To cvcvxk

什么是EPA大法?
2013-3-6 21:55
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
22
搞死搞残好多人....
2013-3-6 22:02
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
23
说的是一般水平的俗人...
2013-3-6 23:03
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
24
果断被鄙视~~~没办法,没时间~
2013-3-7 00:42
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
25
路人应该不至于吧.再说拉屎加水下去和的.....
2013-3-7 00:51
0
游客
登录 | 注册 方可回帖
返回
//