📄 783.html
字号:
_asm<br />
{<br />
CLI //dissable interrupt<br />
MOV EAX, CR0 //move CR0 register into EAX<br />
AND EAX, NOT 10000H //disable WP bit <br />
MOV CR0, EAX //write register back<br />
}<br />
<br />
(NTCREATEPROCESSEX)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x32))= NewNtCreateProcessEx;<br />
<br />
_asm <br />
{<br />
MOV EAX, CR0 //move CR0 register into EAX<br />
OR EAX, 10000H //enable WP bit <br />
MOV CR0, EAX //write register back <br />
STI //enable interrupt<br />
}<br />
<br />
return STATUS_SUCCESS;<br />
}<br />
<br />
这样很不爽,每次都要这样看索引号,问了SOBEIT,可以通过从NTDLL中这样获取服务索引号:<br />
来自rookkit:<br />
<br />
#include <windows.h><br />
#include <stdio.h><br />
<br />
BOOL GetId( char *FuncName, ULONG *FunctionID )<br />
{<br />
//get the function's address<br />
PBYTE Function = (PBYTE)GetProcAddress( GetModuleHandle( "ntdll.dll" ), FuncName );<br />
/*<br />
do some sanity checks, <br />
make sure this function <br />
has a corresponding kernel <br />
level function<br />
*/<br />
<br />
*FunctionID = 0;<br />
<br />
//func not found...<br />
if ( Function == NULL )<br />
{<br />
return FALSE;<br />
}<br />
<br />
/*<br />
77F5B438 B8 00000000 MOV EAX, _FUNCTION_ID_<br />
77F5B43D BA 0003FE7F MOV EDX,7FFE0300<br />
77F5B442 FFD2 CALL EDX<br />
77F5B444 C2 1800 RETN XX<br />
*/<br />
<br />
//mov eax<br />
if ( *Function != 0xB8 )<br />
{<br />
return FALSE;<br />
}<br />
/*<br />
since the address of<br />
the function which <br />
actually makes the call <br />
(SYSCALL) may change, we just<br />
check for mov edx<br />
*/<br />
if ( *(Function + 5) != 0xBA )<br />
{<br />
return FALSE;<br />
}<br />
<br />
//call edx<br />
/*if ( *(PWORD)(Function + 10) != 0xD2FF )<br />
{<br />
return FALSE;<br />
}<br />
//retn<br />
if ( *(Function + 12) != 0xC2 )<br />
{<br />
return FALSE;<br />
}*/<br />
<br />
*FunctionID = *(PDWORD)(Function + 1);<br />
return TRUE;<br />
}<br />
<br />
int main(int argc, char* argv[])<br />
{<br />
ULONG Id;<br />
<br />
printf( "function name: NtCreateProcessEx\n" );<br />
<br />
GetId( "NtCreateProcessEx", &Id );<br />
printf( "function id: %08X\n", Id );<br />
return 0;<br />
}<br />
///////////////////////////////////////////////////////////////////////<br />
<br />
这样也不爽,要从用户态传到驱动层不方便,最后,用这个代码:<br />
<br />
#include "ntddk.h"<br />
#include "stdarg.h"<br />
#include "stdio.h"<br />
#include "ntiologc.h"<br />
#include "ntimage.h"<br />
<br />
<br />
#define DWORD unsigned long<br />
#define WORD unsigned short<br />
#define BOOL unsigned long<br />
#define BYTE unsigned char<br />
<br />
#define SEC_IMAGE 0x01000000<br />
<br />
typedef struct _SECTION_IMAGE_INFORMATION {<br />
PVOID EntryPoint; <br />
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -