[原创开源]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楼。 “因为别人可能禁止你重载NTDLL.DLL”?,不懂,WIN64下的程序不用加载这个dll也可以运行? KindOf 发表于 2011-8-15 10:43 static/image/common/back.gif
“因为别人可能禁止你重载NTDLL.DLL”?,不懂,WIN64下的程序不用加载这个dll也可以运行?
“DLL重载”是我杜撰的术语。。。
意思就是复制某DLL并改名字然后重新LoadLibrary,以此绕过对此DLL的各种HOOK。 Tesla.Angela 发表于 2011-8-15 11:13 static/image/common/back.gif
“DLL重载”是我杜撰的术语。。。
意思就是复制某DLL并改名字然后重新LoadLibrary,以此绕过对此DLL的各 ...
那我CreateFile,ReadFile可以不?这样的话,直接先GetProcessAddr,转换成文件偏移,然后再从硬盘中读出来,那就是原始的了。 KindOf 发表于 2011-8-15 13:22 static/image/common/back.gif
那我CreateFile,ReadFile可以不?这样的话,直接先GetProcessAddr,转换成文件偏移,然后再从硬盘中读出来 ...
我直接Hook ZwReadFile,过滤一切对NTDLL.DLL这个文件的操作。。。
要知道ReadFile会调用到ZwReadFile。。。 是createfile吧,否则的话可以改名。不过你上面也提了不给改名。
另外,你是全局吗?不是的话,我跨进程读取另外一个进程的ntdll KindOf 发表于 2011-8-15 16:16 static/image/common/back.gif
是createfile吧,否则的话可以改名。不过你上面也提了不给改名。
另外,你是全局吗?不是的话,我跨进程 ...
你的思维不错!!!
我怎么就没有想到呢!!!
一般来说全局HOOK也不会HOOK到CSRSS之类的进程,所以绕过Ring 3 Inline Hook连硬编码都不需要了。。。 :lol。有分
PS:你刚刚提到的改名,我想的其实是copyfile一份。这个API没涉及到ntreadfile.不过其它的createfile之类肯定涉及到了。 KindOf 发表于 2011-8-15 17:03 static/image/common/back.gif
。有分
PS:你刚刚提到的改名,我想的其实是copyfile一份。这个API没涉及到ntreadfile.不过其它的cr ...
我的意思就是如此,hook住zwreadfile,让你无法复制文件。 mark 围观一下 ZwUnMapViewSection
NTDLL
KERNEL32
USER32
... 原來是這樣玩的
页:
[1]