阅读:2574回复:2
VanCheer版主,听说你对汇编极其熟悉,能否帮一下忙?
在Windows 2000平台上,通过这段代码,可以在不编写驱动程序的前提下直接操作系统空间内存(诸如写0xFFDDEEEE等),但是不太明白其中的原理。先给50分,如果答案令人满意,再加50分。当然拉,你也许不对分感兴趣,我这样做只是为了肯定你的付出。呵呵~~~
void __declspec(naked) ModifyPrivilegeStub() { __asm { // // Prolog // PUSHAD PUSHFD PUSH FS MOV EBX,00000030h MOV FS,BX SUB ESP, 50h MOV EBP,ESP // // Setup the exception frame to NULL // MOV EBX,DWORD PTR CS:[0FFDFF000h] MOV DWORD PTR DS:[0FFDFF000h], 0FFFFFFFFh MOV DWORD PTR [EBP],EBX // // Save away the existing KSS EBP // MOV ESI, DWORD PTR CS:[0FFDFF124h] MOV EBX,DWORD PTR [ESI+00000128h] MOV DWORD PTR [EBP+4h],EBX MOV DWORD PTR [ESI+00000128h],EBP // // Save away the kernel time and the thread mode (kernel/user) // MOV EDI,DWORD PTR [ESI+00000137h] MOV DWORD PTR [EBP+8h],EDI // // Set the thread mode (kernel/user) based on the code selector // MOV EBX,DWORD PTR [EBP+7Ch] AND EBX,01 MOV BYTE PTR [ESI+00000137h],BL STI // // 执行自己的代码========================================================= // .................. // // 结束执行自己的代码===================================================== // // Epilog // // Restore the KSS EBP // MOV ESI,DWORD PTR CS:[0FFDFF124h] MOV EBX,DWORD PTR [EBP+4] MOV DWORD PTR [ESI+00000128h],EBX // // Restore the exception frame // MOV EBX,DWORD PTR [EBP] MOV DWORD PTR FS:[00000000],EBX // // Restore the thread mode // MOV EBX,DWORD PTR [EBP+8h] MOV ESI,DWORD PTR FS:[00000124h] MOV BYTE PTR [ESI+00000137h],BL ADD ESP, 50h POP FS POPFD POPAD RETF } } |
|
沙发#
发布于:2003-06-07 15:48
水区已回答
|
|
|
板凳#
发布于:2003-09-15 16:34
不会吧,看你的代码你已经通过CALLGATE进入RING0了,当然可以访问系统地址空间啊.
|
|
|