找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 15913|回复: 13

[原创开源]Win64上绕过Ring 3 Inline Hook

 火... [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-8-15 09:26:24 | 显示全部楼层 |阅读模式
忽然发现,Win64上针对NTDLL.DLL的Ring 3 Inline Hook基本上是无效的。。。
随便找个函数u一下:
lkd> u ntdll!ZwCreateUserProcess
ntdll!ZwCreateUserProcess:
00000000`77c90980 4c8bd1          mov     r10,rcx
00000000`77c90983 b8aa000000      mov     eax,0AAh
00000000`77c90988 0f05            syscall
00000000`77c9098a c3              ret

NTDLL.DLL里几乎所有Zw*函数(除了ZwQuerySystemTime)都是这个样子,唯一不同的地方就是index(染红处)。
所以可以使用“山寨法”。。。
把上述机器码复制到一个字节数组里,然后用VirtualProtect修改内存属性,最后直接把字节数组当作函数来调用即可。
例子(调用ZwTerminateProcess):

  1. typedef NTSTATUS (__fastcall *SCTERMINATEPROCESS)(HANDLE,NTSTATUS);
  2. NTSTATUS MyTerminateProcess(HANDLE ProcessHandle, NTSTATUS ExitStatus)
  3. {
  4.         SCTERMINATEPROCESS ScTerminateProcess;
  5.         UCHAR strShellCode[]="\x4c\x8b\xd1\xb8\x29\x00\x00\x00\x0f\x05\xc3";
  6.         /*
  7.         00000000`775a0110 4c8bd1          mov     r10,rcx
  8.         00000000`775a0113 b829000000      mov     eax,29h
  9.         00000000`775a0118 0f05            syscall
  10.         00000000`775a011a c3              ret
  11.         */
  12.         DWORD xxx;
  13.         strShellCode[11]=0x90;
  14.         VirtualProtect(strShellCode,12,PAGE_EXECUTE_READWRITE,&xxx);
  15.         PVOID p=strShellCode;
  16.         ScTerminateProcess=(SCTERMINATEPROCESS)p;
  17.         return ScTerminateProcess(ProcessHandle, ExitStatus);
  18. }

  19. int main()
  20. {
  21.         DWORD pid=0;
  22.         printf("[KILL PROCESS] Input process id: ");
  23.         scanf("%ld", &pid);
  24.         HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,0,pid);
  25.         printf("status: 0x%x\n",MyTerminateProcess(hProcess,0));
  26.         return 0;
  27. }
复制代码
唯一不爽的是index可能需要硬编码,因为别人可能禁止你重载NTDLL.DLL,这样你就无法动态获得index了。
注:经KindOf提示,上面这句话作废!绕过Ring 3 Inline Hook可以完全不用硬编码!
另外,你是全局吗?不是的话,我跨进程读取另外一个进程的ntdll

见6楼。

2

主题

32

回帖

0

精华

铜牌会员

积分
287
发表于 2011-8-15 10:43:10 | 显示全部楼层
“因为别人可能禁止你重载NTDLL.DLL”?,不懂,WIN64下的程序不用加载这个dll也可以运行?
http://hi.baidu.com/zhouws1011/blog

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2011-8-15 11:13:01 | 显示全部楼层
KindOf 发表于 2011-8-15 10:43
“因为别人可能禁止你重载NTDLL.DLL”?,不懂,WIN64下的程序不用加载这个dll也可以运行?

“DLL重载”是我杜撰的术语。。。
意思就是复制某DLL并改名字然后重新LoadLibrary,以此绕过对此DLL的各种HOOK。

2

主题

32

回帖

0

精华

铜牌会员

积分
287
发表于 2011-8-15 13:22:24 | 显示全部楼层
Tesla.Angela 发表于 2011-8-15 11:13
“DLL重载”是我杜撰的术语。。。
意思就是复制某DLL并改名字然后重新LoadLibrary,以此绕过对此DLL的各 ...

那我CreateFile,ReadFile可以不?这样的话,直接先GetProcessAddr,转换成文件偏移,然后再从硬盘中读出来,那就是原始的了。
http://hi.baidu.com/zhouws1011/blog

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2011-8-15 13:41:54 | 显示全部楼层
KindOf 发表于 2011-8-15 13:22
那我CreateFile,ReadFile可以不?这样的话,直接先GetProcessAddr,转换成文件偏移,然后再从硬盘中读出来 ...

我直接Hook ZwReadFile,过滤一切对NTDLL.DLL这个文件的操作。。。
要知道ReadFile会调用到ZwReadFile。。。

2

主题

32

回帖

0

精华

铜牌会员

积分
287
发表于 2011-8-15 16:16:05 | 显示全部楼层
是createfile吧,否则的话可以改名。不过你上面也提了不给改名。

另外,你是全局吗?不是的话,我跨进程读取另外一个进程的ntdll

评分

参与人数 1水晶币 +100 +100 收起 理由
Tesla.Angela + 100 + 100 为你的第二句话加分!!!

查看全部评分

http://hi.baidu.com/zhouws1011/blog

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2011-8-15 16:40:05 | 显示全部楼层
KindOf 发表于 2011-8-15 16:16
是createfile吧,否则的话可以改名。不过你上面也提了不给改名。

另外,你是全局吗?不是的话,我跨进程 ...


你的思维不错!!!
我怎么就没有想到呢!!!
一般来说全局HOOK也不会HOOK到CSRSS之类的进程,所以绕过Ring 3 Inline Hook连硬编码都不需要了。。。

2

主题

32

回帖

0

精华

铜牌会员

积分
287
发表于 2011-8-15 17:03:12 | 显示全部楼层
。有分

PS:你刚刚提到的改名,我想的其实是copyfile一份。这个API没涉及到ntreadfile.不过其它的createfile之类肯定涉及到了。
http://hi.baidu.com/zhouws1011/blog

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2011-8-15 23:07:47 | 显示全部楼层
KindOf 发表于 2011-8-15 17:03
。有分

PS:你刚刚提到的改名,我想的其实是copyfile一份。这个API没涉及到ntreadfile.不过其它的cr ...

我的意思就是如此,hook住zwreadfile,让你无法复制文件。

0

主题

6

回帖

0

精华

初来乍到

积分
2
发表于 2011-11-1 01:17:02 | 显示全部楼层
mark

12

主题

144

回帖

0

精华

铜牌会员

积分
281
发表于 2011-11-21 00:27:32 | 显示全部楼层
围观一下

1

主题

39

回帖

0

精华

铜牌会员

积分
299
发表于 2011-12-25 14:52:42 | 显示全部楼层
ZwUnMapViewSection
NTDLL
KERNEL32
USER32
...

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-11 07:18:56 | 显示全部楼层
原來是這樣玩的
头像被屏蔽

4

主题

101

回帖

0

精华

初来乍到

积分
19658
发表于 2014-1-15 10:25:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表