void nt_sleep(DWORD milliseconds)
static NTSTATUS(__stdcall *NtDelayExecution)(BOOL Alertable, PLARGE_INTEGER DelayInterval) = (NTSTATUS(__stdcall*)(BOOL, PLARGE_INTEGER)) GetProcAddress(GetModuleHandleA(("ntdll.dll")), ("NtDelayExecution"));
static NTSTATUS(__stdcall *ZwSetTimerResolution)(IN ULONG RequestedResolution, IN BOOLEAN Set, OUT PULONG ActualResolution) = (NTSTATUS(__stdcall*)(ULONG, BOOLEAN, PULONG)) GetProcAddress(GetModuleHandleA(("ntdll.dll")), ("ZwSetTimerResolution"));
static bool once = true;
printf("ZwSetTimerResolution %p\n",ZwSetTimerResolution);
if (once && ZwSetTimerResolution!=NULL) {
ULONG actualResolution;
ZwSetTimerResolution(1, true, &actualResolution);
once = false;
LARGE_INTEGER interval;
interval.QuadPart = -1 * (int)(milliseconds * 10000);
printf("NtDelayExecution %p\n",NtDelayExecution);
if(NtDelayExecution!=NULL)
NtDelayExecution(false, &interval);
void nt_sleep(DWORD milliseconds){ static NTSTATUS(__stdcall *NtDelayExecution)(BOOL Alertable, PLARGE_INTEGER DelayInterval) = (NTSTATUS(__stdcall*)(BOOL, PLARGE_INTEGER)) GetProcAddress(GetModuleHandleA(("ntdll.dll")), ("NtDelayExecution")); static NT
VC里面快速调用Nt系列函数示例方法,以NtTerminateProcess结束自己为例
当初研究的目的也只是为了一个稳定通用的ring3 inline hook bypass
funaddr + 5的方法除外,如果你还有其他方法或思路,欢迎交流指导!
Windows 引导过程
Windows 内核中的各个组件和各种机制在起作用以前,必须首先被初始化。此初始化工作是在系统引导时完成的。当用户打开计算机的电源开关时,计算机便开始运行,但操作系统并不立即获得控制权,而是BIOS 代码首先获得控制,它执行必要的硬件检测工作,并允许用户通过一些功能键来配置当前系统中的硬件设置,甚至诊断硬件问题,然后才将控制权交给操作系统。
1.1 内核加载
在windows中使用带上头文件#include <windows.h>;
在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#include <unistd.h>;
在windows中,Sleep中的第一个英文字符为大写的"S" ,在linux下不要大写,在标准C中是sleep, 不要大写,简单的说wind
typedef LONG(__stdcall *__PFN_NtDelayExecution)(BOOLEAN Alertable, PLARGE_INTEGER Interval);
void DSSleep(DWORD dwMs)
static __PFN_NtDelayExecution fn = 0;
static bool bInited = false
83 4B 0007C008 NlsAnsiCodePage
84 4C 0007C010 NlsMbCodePageTag
85 4D 0007C018 NlsMbOemCodePageTag
86 ...
当你分析一个dump文件的时候,调试里面最艺术的地方就是知道哪些东西是可以忽略的,而哪些是你想要的东西。
特别是在你分析一个程序停止响应(hang)的bug时,了解这些常见线程对你非常有帮助,浏览线程各堆栈列表的时候,你可以知道不是这个线程出问题了,也不是那个线程…………
因为大部分时间我是跟asp.net打交道,所以我将通过分析w3wp.exe(IIS 6里面用来执行asp.net页面代码的进程...
public class SleepExample {
public static void main(String[] args) {
System.out.println("程序开始执行");
try {
Thread.sleep(3000); // 暂停 3 秒钟
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("程序继续执行");
在上面的示例中,我们使用了 Thread 类的 sleep() 方法来暂停程序的执行。在 try-catch 块中,我们将线程暂停了 3 秒钟,然后程序继续执行。