浅析Windows NT/2000环境切换(http://webcrazy.yeah.net)

x64dbg源码解析:从编译到调试,打造自己的Windows调试器 调试器是逆向工程与安全研究中的核心工具,其本质是一种事件驱动的状态机,通过Windows调试API与目标进程交互。从OllyDbg到x64dbg,调试器的演进不仅体现在对x64程序的原生支持,更在于开源生态带来的可扩展性。理解断点机制(如软件断点、硬件断点)、调试循环以及符号解析,是掌握调试器原理的关键。x64dbg作为一款开源调试器,高度兼容OllyDbg的操作习惯,同时提供完善的插件SDK,使得开发者能够根据实际需求定制功能。本文从源码视角分析x64dbg的工程结构、核心模块与构建流程,并分享从零编译过 阅读详情
浅析Windows NT/2000环境切换
                  WebCrazy( tsu00@263.net)
                       注:本文最初见于 www.nsfocus.com

    本文假设您已经了解Windows NT/2000系统体系,对Windows NT/2000内部KPEB/KTEB等数据结构与内核工作方式已有一定的概念,对80x86保护模式,Intel/AT&T格式汇编语言有过学习,能熟练使用SoftICE for Windows NT,且曾经接触过Microsoft Visual Studio及其附带工具,翻阅过Linux内核代码,如果您对这些方面不甚了解,请自行参阅相关书籍。

    环境切换(Context Switch)牵涉到很多方面的内容,本文仅对与其有关的几个数据进行详细的讨论,并给出取得这些数据的部分程序段,还列出Windows 2000的少量环境切换代码。另外文中讨论的系统内部数据均未来自Microsoft官方文档,在Windows NT/2000的下个版本甚至目前各版本间均会有差别,所以我尽量详细的将文中所涉及的软硬件列于下面,所有因硬件体系、软件版本不同等因素引起的差异,请自行根据您的情况予以调整。

⊙ x86平台单处理机Windows 2000 Server Build 2195
⊙ Numega SoftICE 4.05 for Windows NT/2000 Build 334
⊙ Linux 2.0.30内核
⊙ Datarescue IDA 4.0.4.362
⊙ Microsoft Visual Studio 6.0 SP3
⊙ Windows 2000 DDK

    80x86产生的环境切换有以下几种可能:
    1.当前任务执行一个FAR CALL或JMP指令,而选择器指向一个TSS描述符或一个任务门。
    2.当前任务执行IRET指令返回先前任务,IRET只在EFLAGS寄存器中的NT位置1时产生切换。
    3.发生一个中断或异常情况,并且IDT项是个任务门。

    Linux内核中有如下代码:

    /*
    /usr/src/linux/include/asm-i386/system.h
    仅列出单处理器实现代码
    */

    #define switch_to(prev,next) do { /
    __asm__("movl %2,"SYMBOL_NAME_STR(current_set)"/n/t" /
    "ljmp %0/n/t" /
    "cmpl %1,"SYMBOL_NAME_STR(last_task_used_math)"/n/t" /
    "jne 1f/n/t" /
    "clts/n" /
    "1:" /
    : /* no outputs */ /
    :"m" (*(((char *)&next->tss.tr)-4)), /
    "r" (prev), "r" (next)); /
    /* Now maybe reload the debug registers */ /
        .
        .
        .
    } /
    } while (0)

    这段代码使用了上面讨论的第一种情况。

    众所周知,Linux是个开放源代码的操作系统,而Microsoft则没如此“大方”,但我们仍能对其进行些逆向工程,可喜的是网上目前已经有很多人对此有过研究,现摘录Mark Russinovich部分成果( http://www.sysinternals.com/tips.htm):

    //
    // NT's main
    // NTOSKRNL main
    //
    int main( boot parameters )
    {
        //
        // Fire up NT!
        //
        KiSystemStartup();
        return 0;
    }


    从中可看出ntoskrnl.exe(PE格式,可方便的使用反汇编工具进行分析)是NT OSLOADER真正调用内核的开始,其对文件对象(File)、作业对象(Job)、进程对象(Process)、线程对象(Thread)、纤程对象(Fiber)、文件映射对象(FileMapping)、事件对象(Event)、互斥对象(Mutex)、信号对象(Semaphore)等许多内核对象进行管理,其也负责线程调度,内存管理,进程间通信等所有操作系统功能,让它们协调工作,我们要讨论的线程切换代码也在此模块中。

    用IDA等对ntoskrnl.exe进行反汇编所得的结果,其分析的工作量恐怕大家都是可想而知的。在我们讨论Windows 2000环境切换详细代码前,还是先让我们看看以下几个重要的与环境切换有关的系统数据:

    1 进程Context
    进程Context是指80x86在保护模式下内存分页机制中当前进程的页目录所在的物理地址,其存放在系统CR3寄存器中,在Windows 2000中所处的位置为KPEB偏移后18h处,看看SoftICE的输出结果吧(限于篇幅,我对输出结果进行了删减,但仍对重要数据进行注解,应注意的是与您当前运行的程序等系统环境密切相关,随机性很强,下同):

    :cpu //显示当前cpu的寄存器值

    Processor 00 Registers
    ----------------------
    CS:EIP=0008:80069582 SS:ESP=0010:8046FD98
    EAX=8046BDF0 EBX=FFDFF000 ECX=FFDFF878 EDX=0000BA5A
    ESI=8046BDF0 EDI=8046BB60 EBP=FFDFF800 EFL=00000213
    DS=0023 ES=0023 FS=0030 GS=0000

    CR0=8000003B PE MP TS ET NE PG
    CR2=76EE18EC
    CR3=00030000
           |
           |_当前进程的CR3
    CR4=000002D1 VME PSE MCE PGE
        .
        .
        .

    :proc idle

    Process KPEB    PID Threads Pri User Time  Krnl Time  Status
    *Idle   8046BB60 0    1      0  00000000   0000BA5A   Running
      |        |
      |        |_Idle进程的KPEB
      |_系统中当前进程(SoftICE中用不同颜色突出,且前面有个*)

    :dd 8046bb60+18 l 4 //dd Idle's KPEB+18h
    0010:8046BB78 00030000 00000000 00000000 00000000 ................
                     |
                     |_Idle进程Context
    :addr
    CR3      LDT Base:Limit KPEB Addr PID Name
    00030000                FE4E1C60  0008 System
    02D59000                FF8E6540  0090 smss
    01D41000                FF8E17E0  00AC csrss
    00686000                FE51BAE0  00C0 winlogon
    0095D000                FF8A7AE0  00DC services
    0276E000                FF8A5D60  00E8 lsass
    00394000                FF881020  0180 svchost
    02CAE000                FF884020  01A4 SPOOLSV
    00882000                FF85B560  01D0 msdtc
    02993000                FF83F020  0238 svchost
    00D2F000                FF83D760  024C llssrv
    0063A000                FF837860  0274 regsvc
    02EFA000                FF6ECD60  0318 dfssvc
    00A5E000                FF823A20  0328 inetinfo
    03612000                FF6AF860  0384 explorer
    003A2000                FF68E460  03B4 internat
    003A7000                FF68CD60  0130 OSA
    008C1000                FF6769A0  03E8 svchost
    01BAA000                FF65A020  01C0 cmd
    00822000                FF86C960  038C conime
    03362000                FF6B3540  0388 notepad
    *00030000               8046BB60  0000 Idle
        |
        |__当前进程Context,是不是与上一命令输出结果一致。

    可以用同样的方法进行再次进行验证。

    2.Context Switches Times 线程已被操作系统调度次数
    当每次操作系统调用线程时,都会将这个值加一的。Visual Studio所附的工具Spy++,在Thread窗口中Thread Properties中Context Switches指出系统中该线程已调度的次数(Spy++只有在Windows NT/2000中运行时才会显示出这个值,9x中则没有)。Switch Times在系统中所处的位置在KTEB的偏移4ch处。

    :thread idle
    TID  Krnl TEB StackBtm StkTop   StackPtr User TEB Process(Id)
    0000 8046BDF0 8046D040 80470040 8046FD90 00000000 Idle(00)
    :dd 8046bdf0+4c l 4
    0010:8046BE3C 0000E778 00000000 00000002 00000000 x...............
                    |
                    |_指出当前Idle线程已经被系统调用0E778h(十进制59256)次了。用e命令改改再看看Spy++的输出结果!

    3.线程所属进程的KPEB与进程名 //分别位于KTEB+44h与KPEB+1fch处
    具体见我在《 再谈Windows NT/2000内部数据结构》( Nsfocus Magazine 11)一文所述。

    应该指出的是,以上讨论只是针对Windows 2000 Server Build 2195的,如果您的系统不是的话或想知道如何得到这些值的具体位置,请参阅我以下的叙述的方法:

    通过找突破口,正像上面我所描述的Context Switches Times在Spy++中显示的一样,然后可以用逆向工程法,我也是用这个方法来取得这个具体位置的。

    举个例子吧!我曾经对SoftICE for NT中的addr命令输出结果(包含进程Context)来自何处感到困惹,也曾经在国外的一些著名的新闻组中提问过,不过至今仍没人应答(可能是我的英文水平太差,人家看不懂什么意思吧!)

    addr命令输出结果见上。

    后来无奈之下我还是想到CR3(存放进程页目录物理地址的寄存器)应与特定的进程有关,其应该存放在KPEB结构中(实际上的确是这样的)。而如果真是这样的话,不是只要枚举(Enum)出系统中所有的KPEB,则能得到所有的CR3值(当然前提是找出其相对KPEB的偏移值),相应的使用我在《 再谈Windows NT/2000内部数据结构》( Nsfocus Magazine 11)的方法就可以取出所有进程的进程名了吗?(PID也是一样的)。

    我在通过分析PSAPI.DLL中枚举系统进程的函数后(EnumProcesses等),发现系统启动后的第一个进程system的KPEB是存放在ntoskrnl.exe导出的PsInitialSystemProcess指出的地址处的,而系统中各个KPEB由一链表联结着,至于链表的定义在Windows 2000 DDK中的ntdef.h中如下定义的:

    typedef struct _LIST_ENTRY {
        struct _LIST_ENTRY *Flink;
        struct _LIST_ENTRY *Blink;
    } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

    有了KPEB,跟踪相应的代码(这段反汇编代码我将在下面列出),就能找出偏移地址18h处的CR3值。

    以上操作,在Windows 9x中可由Kernel32.dll中序号为1的Undocumented函数(NONAME,Softice Export列表中显示为ORD_0001)实现,但因为Windows 9x与NT/2000的内核的不同,Softice for 9x与NT的addr命令输出的格式也完全不同。至于在Windows NT/2000中不知道是否有现成的函数可以得到结果,至少现在我也没找到,这可是题外话。

    因为上面的叙述还是比较抽象,我还是将SoftICE的输出结果列于此,更利于理解:

    :dd PsInitialSystemProcess l 4
    0008:8046A844 FE4E1C60 E1000968 00000000 00000000 `.N.h...........
                    |
                    |_System进程的KPEB

    :dd @PsInitialSystemProcess+18 l 4
    0008:FE4E1C78 00030000 00000000 00000000 00000000 ................
                    |
                    |_System进程的Context

    :dd @PsInitialSystemProcess+9c l 4 //9ch是PID相对KPEB的位置
    0008:FE4E1CFC 00000008 FF8E65E0 8046A180 00000000 .....e....F.....
                     |
                     |_System进程PID

    :dd @PsInitialSystemProcess+1fc l 10 //1fch是Process Name相对KPEB的位置
    0008:FE4E1E5C 74737953 00006D65 00000000 00000000 System..........
                                                        |
                                 System进程Process Name_|
    :? @(@PsInitialSystemProcess+a0)-a0
    //计算System指向的下一个进程的KPEB,0a0h是链状结构相对KPEB的偏移
    FF8E6540 4287522112 (-7445184) "巈@"
      |
      |_System进程KPEB指向的下一个KPEB,从Process Name可知为smss.exe(见下)

    :dd @(@PsInitialSystemProcess+a0)-a0+18 l 4
    0008:FF8E6558 02D59000 02D5A000 00000000 00000000 ................
                    |
                    |_smss.exe的进程Context

    :dd @(@PsInitialSystemProcess+a0)-a0+9c l 4
    0008:FF8E65DC 00000090 FF8E1880 FE4E1D00 00000518 ..........N.....
                     |
                     |_smss.exe的PID

    :dd @(@PsInitialSystemProcess+a0)-a0+1fc l 10
    0008:FF8E673C 73736D73 6578652E 00000000 00000000 smss.exe........
                                                        |
                               smss.exe进程Process Name_|
    :dd @(@(@PsInitialSystemProcess+a0))-a0+18 l 4

            .
            . (可以用Softice用同样的方法一直跟踪到链表结束)
            .


    实现代码段如下:

    /*
    由于以下代码段均要求获取系统数据结构,即要求在Ring 0状态下运行,所
    以必须位于NT/2000设备驱动程序中。因设备驱动程序的架构,决定的代码的长
    度较长,此处仅列出关键代码段,您可以找本WDM的书,将此程序段置入您的代码中,
    或是直接联系我( tsu00@263.net)。
    */

        .
        .
        .
    PLIST_ENTRY KPEBListHead, KPEBListPtr;          //PLIST_ENTRY定义见上
    ULONG KPEBListOffset=0xa0;                      //定义链表相对KPEB的偏移值
    ULONG ProcessNameOffset=0x1fc;                  //定义ProcessName相对KPEB的偏移值
    ULONG ProcessContextOffset=0x18;                //定义Process Context相对KPEB的偏移值
    ULONG PIDOffset=0x9c;                           //定义PID相对KPEB的偏移值

    if(((USHORT)NtBuildNumber)!=2195){
        DbgPrint("Only test on Windows 2000 Server Build 2195!/n");
        return;
    }

    DbgPrint("/n CR3/t/tKPEB Addr/tPID/t Name");
    DbgPrint("/n ---/t/t-------- /t---/t ----/n");

    KPEBListHead=KPEBListPtr=(PLIST_ENTRY)(((char *)PsInitialSystemProcess)+KPEBListOffset);
    while (KPEBListPtr->Flink!=KPEBListHead) {
        void *kpeb;
        char ProcessName[16];
        ULONG ProcessContext;
        ULONG PID;

        //取KPEB
        kpeb=(void *)(((char *)KPEBListPtr)-KPEBListOffset);

        //取ProcessName
        memset(ProcessName, 0, sizeof(ProcessName));
        memcpy(ProcessName, ((char *)kpeb)+ProcessNameOffset, 16);

        //取Process Context
        ProcessContext=*(ULONG *)(((char *)kpeb)+ProcessContextOffset);

        //取PID
        PID=*(ULONG *)(((char *)kpeb)+PIDOffset);

        //向Debugger输出结果
        DbgPrint(" %08X/t%08X/t%04X/t %s/n",ProcessContext, kpeb,PID,ProcessName);

        //指向下一链表
        KPEBListPtr=KPEBListPtr->Flink;
    }

            .
            .
            .

    使用Checked方式编译运行后调试器输出结果如下(俨然就是一个最底层的EnumProcesses实现方法):

    CR3      KPEB Addr PID  Name
    ---      --------  ---  ----
    00030000 FE4E1C60  0008 System
    02D59000 FF8E7920  0090 smss.exe
    003C1000 FE520520  00AC csrss.exe
    026C6000 FE51A020  00A8 winlogon.exe
    03209000 FF8A8D60  00DC services.exe
            .
            . 略
            .

    我之所以花如此大的篇幅去讲述进程Context的获得,似乎与环境切换的主题不相一致,主要是由于Windows NT/2000的封闭性,我觉得真正要明白环境切换,Linux平台就可以比较容易理解,在NT中重要是知道如何取得些与此有关的重要数据结构,然后再与x86平台体系结构联系在一起,就能更好的帮助自己理解。使用上面所述的类似方法,还可以找出很多KPEB/KTEB重要信息,如进程优先级(KPEB+62h)、进程在内核态与用户态所使用的时间(KPEB+38h与KPEB+3ch)、线程ID(KTEB+1e4h)等等,可与linux的task_struct等结构比较比较。

    好了谈了这么多,我还是简单说说Windows 2000中的环境切换代码吧。

    那么Windows NT/2000什么情况下发生环境切换呢?曾见过一DDK FAQ中是这样描述的:

    Q:What are the causes of a context switch in Windows NT?
    A:There are only two ways that a thread context is switched.
        1.The thread yields it's quantum by blocking on something(event,semaphore,etc.).
        2.The time period is up.This is caused by a timer interrupt.

    KiDispatchInterrupt是NT/2000中定时进行环境切换例程,以下列出其部分代码:

    ;Linux中实现类似功能的代码位于/usr/src/linux/kernel/sched.c
    00403A58 KiDispatchInterrupt proc near
    00403A58
    00403A58 var_C = dword ptr -0Ch
    00403A58 var_8 = dword ptr -8
    00403A58 var_4 = dword ptr -4
    00403A58
    00403A58 mov ebx, ds:0FFDFF01Ch
    00403A5E lea eax, [ebx+800h]
    00403A64 cli
    00403A65 cmp eax, [eax]
    00403A67 jz short loc_403A86
    00403A69 push ebp
    00403A6A push dword ptr [ebx]
    00403A6C mov dword ptr [ebx], 0FFFFFFFFh
    00403A72 mov edx, esp
    00403A74 mov esp, [ebx+81Ch]
    00403A7A push edx
    00403A7B mov ebp, eax
    00403A7D call sub_460BA4
    00403A82 pop esp
    00403A83 pop dword ptr [ebx]
    00403A85 pop ebp
   
            .
            .(限于篇幅,此处略去部分,感兴趣的自己步步跟踪)
            .

    ;另CR3切换代码:

    ;Linux中实现此功能的代码位于/usr/src/linux/include/asm-i386/pgtable.h
    ;由宏定义SET_PAGE_DIR实现,请参考之。

    ;此时EDI存储KPEB(自己用SoftICE跟跟),执行后EAX则为进程Context
    ;这句结合mov cr3,eax是不是可以跟踪到CR3在KPEB的具体位置的呢,我就是从这儿跟踪到的。
    00403B87 mov eax, [edi+18h]
    00403B8A mov ebp, [ebx+40h]
    00403B8D mov ecx, [edi+30h]
    00403B90 mov [ebp+1Ch], eax
    00403B93 mov cr3, eax ;EAX->CR3
    00403B96 mov [ebp+66h], cx
    00403B9A xor eax, eax
    00403B9C cmp [edi+20h], ax
    ;转去错误处理,必要时还会调用KeBugCheck,出现可怕的蓝屏死机.
    00403BA0 jnz short loc_403BCE
    ;LDTR置空选择器
    00403BA2 lldt ax
    00403BA5 lea ecx, [ecx]
    00403BA7
    00403BA7 loc_403BA7: ; CODE XREF: .text:00403B7Dj
    00403BA7 ; .text:00403BFAj
    ;将Context Switches Times加一
    00403BA7 inc dword ptr [esi+4Ch]
    00403BAA inc dword ptr [ebx+5C0h]
    00403BB0 pop ecx
    00403BB1 mov [ebx], ecx
    00403BB3 cmp byte ptr [esi+49h], 0
    00403BB7 jnz short loc_403BBD
    00403BB9 popf
    00403BBA xor eax, eax
    00403BBC retn
    00403BBD loc_403BBD: ; CODE XREF: .text:00403BB7j
    00403BBD popf
    00403BBE jnz short loc_403BC3
    00403BC0 mov al, 1
    00403BC2 retn
    00403BC3 loc_403BC3: ; CODE XREF: .text:00403BBEj
    00403BC3 mov cl, 1
    00403BC5 call ds:HalRequestSoftwareInterrupt
    00403BCB xor eax, eax
    00403BCD retn

            .
            .(略)
            .


    部分代码我尚未进行注解,主要是一些代码与代码运行环境有关,如处理NT执行体的错误检查(包括有效性、安全性等),而且我这儿也未列出代码,如果你有兴趣的话用SoftICE步步跟踪可以发现很多NT内部机制。

    Windows 2000是抢占式多线程操作系统,文中并未涉及到线程调度的具体方法。真正线程调度切换,还要考虑很多因素,如线程状态(是否可调度等)、线程优先级(Priority)、线程的亲缘性(Affinity)等,这些具体的重要信息,也都由ntoskrnl.exe模块处理,我也不可能都详细的在此列出。本文只讨论如何获得这信息,不过若想知道得更多,仍可以根据文中的讨论对其进行进一步的分析。

    我曾经接触过单片机,也曾经对其似乎从头开始设计一个OS(可能只是几条指令,单片机高手千万别见笑)感到不解,但当我接触过NT Kernel后才觉得自己是多么的可笑。不过在接触NT内核时,可大量参照Linux代码,毕竟她们原理应该是一样的,虽然Linux不是一个微内核OS,而NT/2000是。个人认为linux的task_struct与NT的KPEB,linux中的Bottom half机制与NT的DPC(延时过程调用)等有其相似的地方(虽然在机制上实现方法上仍有很大的不同)。由于Microsoft未提供任何官方文档且NT内核的复杂性(曾有人批评NT的微内核比Linux还要大呢),本文所讨论的,我也不能保证其绝对的正确性,如果您发现任何错误之处或是有什么建议,请予以告之,谢谢!

    参考资料:
    1.Jeffrey Richter
        <<Programming Applications for Microsoft Windows,Fourth Edition>>
    2.Linux相关文档
    3.Mark Russinovich相关文档
    4.Intel Corp<<Intel Architecture Software Developer's Manual,Volume 3>>
过游戏驱动保护 过各大游戏驱动保护 实现是在驱动层hook关键函数 附PG3补丁方法 立即下载

相关推荐

DBG x86 windows程序调试工具

WinDbg是一个功能非常强大的调试器。它支持多种调试任务,如用户态调试、内核态调试、转储文件调试和远程调试。与此同时WinDbg还具有很好的灵活性和可扩展性。虽然是一个典型的GUI应用程序,但是它的大多数调试功能还是以手工输入命令的方式来工作的。目前版本的WinDbg提供了130多条标准命令,140多条元命令和难以计数的扩展命令。 WinDbg使用工作空间来描述和存储调试项目的属性、参数及调试器设置等信息。工作空间与vc中的项目文件很相似。WinDbg定义了两种工作空间,一种为默认工作空间,另一种为命名的工作空间。当没有明确使用某个命名空间时,WinDbg总是使用默认工作空间。 WinDbg在安装后就有预先创建了一些列默认空间。分别为基础工作空间、默认内核工作空间、默认远程调试工作空间、特定处理器工作空间、默认用户态工作空间。它们分别定义了在WinDbg在各种条件下的一些配置、参数设置等。

过游戏保护驱动

整理自CrazyWolf的博客 学习下过游戏驱动保护的方法。 篇一: ////////////////////////////////////////////////////////////////////////// //define #define SsdtTbaleSize 0x11C //////////////////////////////////////////////////

把梦想放飞在蓝色的天空里... 5106

调试器的设计与实现

基于 Windows 平台调试器的设计与实现 - 黄 奇

使用dbg调试程序

<br />1. 使用gcc编译程序时要加 -g 选项,生产调试信息。<br /> <br />2. 使用dbg 启动被调试的程序。<br /> <br />3. <br />    使用set args xxx yyy zzz 设置程序的启动参数<br />    使用list 命令查看加载的源文件,<br />    使用break 命令添加断点,break后面可以加行号,或者函数名<br />    使用info break 查看当前设置的断点<br />    使用run (或r)运行程序<br /

crazy Crypto 3008

Debuggers And Tools x86和x64都可用

win7上qt5安装后不能后不能调试,需要安装相应的Debuggers And Tools, 我把X64 Debuggers And Tools-x64_en-us.msi和X86 Debuggers And Tools-x86_en-us.msi都放在一起的,可以下载以后直接解压,选择自己需要的版本直接安装,再重启Qt Creater即可。

C++版本调试器仿ollydebug实现.zip

### 内容概要 这是一款基于 Windows 10 系统,使用 VS2015 以 C/C++ 语言开发的调试工具。它具备建立调试机制(创建和附加)、显示和修改汇编代码、查看和修改内存数据与栈、查看和修改寄存器、查看调试程序模块等基础功能。拥有永久性与一次性的多种断点功能,如软件断点、硬件断点等。还具备条件断点、反反调试、支持插件功能等高级特性。此外,还有解析导出表导入表、解析符号、源码调试、DUMP 等附加功能,以及删除断点、显示断点列表等实用小功能。 ### 适用人群 适用于软件开发人员、逆向工程师、安全研究人员。 ### 使用场景及目标 软件开发中用于调试纠错;逆向分析时助于剖析软件;安全研究里可分析恶意软件,各功能助力高效完成相关任务。 ### 其他说明 依赖特定系统和开发环境,操作不当可能致系统或程序异常,反反调试等操作需合法合规 。

再谈Windows NT/2000环境切换(http://webcrazy.yeah.net)

再谈Windows NT/2000环境切换                           WebCrazy(tsu00@263.net)    线程是Windows NT/2000环境切换的最基本单位。在浅析Windows NT/2000环境切换>>(Nsfocus Magazine 12)一文中,我只对进程CR3切换进行了较详细的讨论,但未涉及线程调度的内容,本文将尽量讲述这些部分内容。在

FreeXploiT 2805

STM32 上 FreeRTOS 的启动与任务调度详解

4. SysTick定时器:FreeRTOS启动调度器后,会接管STM32的SysTick定时器,用于生成系统节拍,因此不要在HAL库中重复配置SysTick(比如HAL_Init()中已配置,无需再手动调用SysTick_Config()),否则会导致系统节拍异常,任务延迟不准。2. 任务栈大小需按需配置,不是越大越好(浪费RAM),也不能太小(会导致栈溢出),比如简单的传感器读取任务,1024字(4096字节)足够,复杂任务(比如串口接收+数据解析)可调整为2048字。

qq_40170041的博客 866

小议Windows NT/2000分页机制(http://webcrazy.yeah.net)

 小议Windows NT/2000分页机制                     WebCrazy(tsu00@263.net)    内存管理是操作系统最重要的一部分,其决定了操作系统的性能。Intel X86采用分段、分页的内存机制,Windows NT/2000充分利用了此项先进的机制。段内IA-32体系使用页目录(Page Directory)与页表(Page Table,SoftIC

FreeXploiT 1966

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 227

电磁仿真新手必看:如何用CST Studio Suite 2023完成第一个PCB辐射仿真?

本文详细解析了如何使用CST Studio Suite 2023进行PCB辐射仿真,适合电磁仿真新手快速上手。从工程准备、求解器配置到端口设置和后处理技巧,全面覆盖三维全波电磁场仿真软件的核心操作步骤,帮助工程师精准预测和解决PCB电磁辐射问题。

y7z8a9的博客 733

Windows NT/2000/XP下不用驱动的Ring0代码实现(http://webcrazy.yeah.net)

 Windows NT/2000/XP下不用驱动的Ring0代码实现                  WebCrazy(http://webcrazy.yeah.net/)     大家知道,Windows NT/2000为实现其可靠性,严格将系统划分为内核模式与用户模式,在i386系统中分别对应CPU的Ring0与Ring3级别。Ring0下,可以执行特权级指令,对任何I/O设备都有访问权等等

FreeXploiT 1614

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

本次安装实验基于苹果m2芯片的mac系统,使用vmware fusion搭建三台ubuntu24分布式虚拟机,确保在三台机器上安装了Java jdk8,并配置了免密码登录,网络互通,防火墙关闭,授时服务器已经同步。访问apche官网源,下载3.3.4版本,我们用二进制通用版即可,因为hadoop运行在java环境,跨平台性使得无需编译arm架构版本。至此,Hadoop的安装完成,包括hdfs文件存储系统,mapreduce计算框架,yarn资源管理系统均能正常、稳定使用。

qq_31412425的博客 2160

【第52节】Windows编程必学之从零手写C++调试器下篇(仿ollydbg)

本文介绍的调试器通过Windows API和C/C++语言实现了完整的调试功能链,从基础的进程控制到高级的反反调试和插件机制,覆盖了开发者在调试过程中的核心需求。其设计思路和实现方法不仅适用于Windows平台,也为其他操作系统的调试工具开发提供了参考。这个调试器项目主要收获:1. Windows调试器的核心实现原理,包括断点机制、进程控制和内存操作2. 反调试对抗技术,如PEB结构修改和API Hook的实现3. 良好的软件架构设计,展示了如何构建可扩展的模块化系统。

攻城狮7号的博客 1万+

PYNQ-Z2 开发板从镜像烧录到 Jupyter 交互全流程指南

本文详细介绍了PYNQ-Z2开发板从镜像烧录到Jupyter交互的全流程指南,包括硬件解析、镜像烧录技巧、设备启动与网络配置、Jupyter Notebook深度使用以及实战案例分享。通过具体步骤和实用技巧,帮助开发者快速上手PYNQ-Z2开发板,实现高效的FPGA开发和智能家居控制应用。

weixin_28736355的博客 438

为YOLO11更换Backbone(一):轻量化之星GhostNet

摘要: 本文重点介绍了轻量化Backbone网络GhostNet及其在YOLO11中的应用。首先分析了Backbone网络在目标检测中的重要性,指出其需平衡特征提取能力和计算效率的需求。然后详细解析了GhostNet的核心思想,包括其通过"幽灵模块"生成冗余特征的设计原理,该模块使用1×1卷积生成少量内在特征,再通过廉价线性变换生成更多幽灵特征,显著降低了计算量。GhostNet的创新设计使其在保持精度的同时大幅减少了参数和FLOPs,为YOLO11等目标检测模型提供了高效的轻量化解决方

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1498

gdb(lldb)调试器

1.什么是程序的调试?      程序调试的目的就是找出程序中隐藏的故障,校正那些不正常的指令,使程序能够正常工作。   2.调试的类别     程序的调试有几种不同的级别。最高级别当然是编程人员通过自己肉眼观察和推断,找出那些有毛病的代码并修改之。最低级别是对汇编代码进行调试。由于汇编语言代码的复杂、冗长与不直观。在汇编级对程序进行调试是一件比较费力的事。    

Song2Crazy的专栏 1135

〔重庆理工大学〕大学物理实验--变温霍耳效应及其参数测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 3044

Windows 2000内核KPEB/KTEB详细结构(http://webcrazy.yeah.net/)

Windows 2000内核KPEB/KTEB详细结构            WebCrazy(http://webcrazy.yeah.net/)    EPROCESS与ETHREAD结构在Windows NT/2000内核的地位是不言而喻的。他们结构中的成员包含了内核的方方面面,是两个比较大的结构。在Windows 2000 Server Build 2195 Free Ke

FreeXploiT 2134

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态

执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准,机械臂就能准确地移动到摄像头识别的特定像素位置。这种能力是执行精确拾放任务(如分类、堆垛和分拣)的基础,即使在摄像机的确切位置和方向未知的情况下也是如此。机器人-摄像机系统有两种构型:眼在手内和眼在手外。在眼在手内构型中,摄像头直接安装在机器人手臂的末端执行器上。相反,在眼在手的构型中,摄像头固定在一个静止的物体上,机器人手臂在其视野内。

机器人控制与仿真应用 3348

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

自定义注解处理器idea调试debug方式

自定义注解处理器idea调试debug方式

weixin_50060562的博客 1444

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VirtualBox中不能正常使用OpneGL的问题

VirtualBox中不能正常使用OpenGL的问题 问题解决过程 VirtualBox版本:4.3.12 系统类型:Ubuntu 14.04 按照网上常见的教程 Ubuntu 安装OpenGL,安装OpenGL库与实用工具包等,如下: $ sudo apt-get install build-essential $ sudo apt-get install li...

weixin_34198797的博客 1177

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

DebugView使用详解

DebugView是一个系统调试信息输出的捕获工具。 在程序中使用如下函数:   1> OutputDebugString 或者在MFC中使用TRACE   2> 内核模式中使用Out_Debug_String,DbgPrint ,_Debug_Printf_Service 编译程序为DEBUG版本,然后运行程序(不是在vs 中运行,是单独运行),打开debu...

weixin_30505225的博客 842

PEB结构块解析

peb结构块解析: 项目需要获取程序运行的一些状态,目前只能获取寄存器信息,故采用fs寄存器获取peb信息,本文主要探索peb中可以获得的进程信息。 windbg信息如下:win xp 下,和win7不一样,下面为xp环境dt nt!_peb +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions :

liutianheng654的博客 1万+

KPROCESS IDT PEB Ldr 《寒江独钓》内核学习笔记(3)

继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构。   1. 相关阅读材料 《深入理解计算机系统(原书第2版)》     二. KPROCESS KPROCESS,也叫内核进程块。我们在开始学习它的数据机构之前,首先要思考的一个问题是,它和EPROCESS名字感觉差不多,那它们之间是什么关系呢?它们在内核区域中都位于那一层呢? 我们先来看一张图: w...

weixin_34116110的博客 340
上一篇: 小议Windows NT/2000分页机制(http://webcrazy.yeah.net)
下一篇: 再谈Windows NT/2000环境切换(http://webcrazy.yeah.net)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值