Tesla.Angela 发表于 2011-8-15 09:26:24

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

忽然发现,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):
typedef NTSTATUS (__fastcall *SCTERMINATEPROCESS)(HANDLE,NTSTATUS);
NTSTATUS MyTerminateProcess(HANDLE ProcessHandle, NTSTATUS ExitStatus)
{
        SCTERMINATEPROCESS ScTerminateProcess;
        UCHAR strShellCode[]="\x4c\x8b\xd1\xb8\x29\x00\x00\x00\x0f\x05\xc3";
        /*
        00000000`775a0110 4c8bd1          mov   r10,rcx
        00000000`775a0113 b829000000      mov   eax,29h
        00000000`775a0118 0f05            syscall
        00000000`775a011a c3            ret
        */
        DWORD xxx;
        strShellCode=0x90;
        VirtualProtect(strShellCode,12,PAGE_EXECUTE_READWRITE,&xxx);
        PVOID p=strShellCode;
        ScTerminateProcess=(SCTERMINATEPROCESS)p;
        return ScTerminateProcess(ProcessHandle, ExitStatus);
}

int main()
{
        DWORD pid=0;
        printf(" Input process id: ");
        scanf("%ld", &pid);
        HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,0,pid);
        printf("status: 0x%x\n",MyTerminateProcess(hProcess,0));
        return 0;
}
唯一不爽的是index可能需要硬编码,因为别人可能禁止你重载NTDLL.DLL,这样你就无法动态获得index了。
注:经KindOf提示,上面这句话作废!绕过Ring 3 Inline Hook可以完全不用硬编码!

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

见6楼。

KindOf 发表于 2011-8-15 10:43:10

“因为别人可能禁止你重载NTDLL.DLL”?,不懂,WIN64下的程序不用加载这个dll也可以运行?

Tesla.Angela 发表于 2011-8-15 11:13:01

KindOf 发表于 2011-8-15 10:43 static/image/common/back.gif
“因为别人可能禁止你重载NTDLL.DLL”?,不懂,WIN64下的程序不用加载这个dll也可以运行?

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

KindOf 发表于 2011-8-15 13:22:24

Tesla.Angela 发表于 2011-8-15 11:13 static/image/common/back.gif
“DLL重载”是我杜撰的术语。。。
意思就是复制某DLL并改名字然后重新LoadLibrary,以此绕过对此DLL的各 ...

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

Tesla.Angela 发表于 2011-8-15 13:41:54

KindOf 发表于 2011-8-15 13:22 static/image/common/back.gif
那我CreateFile,ReadFile可以不?这样的话,直接先GetProcessAddr,转换成文件偏移,然后再从硬盘中读出来 ...

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

KindOf 发表于 2011-8-15 16:16:05

是createfile吧,否则的话可以改名。不过你上面也提了不给改名。

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

Tesla.Angela 发表于 2011-8-15 16:40:05

KindOf 发表于 2011-8-15 16:16 static/image/common/back.gif
是createfile吧,否则的话可以改名。不过你上面也提了不给改名。

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

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

KindOf 发表于 2011-8-15 17:03:12

:lol。有分

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

Tesla.Angela 发表于 2011-8-15 23:07:47

KindOf 发表于 2011-8-15 17:03 static/image/common/back.gif
。有分

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

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

woshewuaa 发表于 2011-11-1 01:17:02

mark

testid 发表于 2011-11-21 00:27:32

围观一下

x64asm 发表于 2011-12-25 14:52:42

ZwUnMapViewSection
NTDLL
KERNEL32
USER32
...

kk1025 发表于 2013-4-11 07:18:56

原來是這樣玩的

wangmin1944 发表于 2014-1-15 10:25:32

页: [1]
查看完整版本: [原创开源]Win64上绕过Ring 3 Inline Hook