请问在98下面如何进入ring0?
希望给出源码!谢谢
希望给出源码!谢谢
解决方案 »
- web 登陆流程
- MFC界面问题,紧急在线求救!
- 进程间通讯:共享内存方式
- 送分贴, KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove)请进。
- 如何判断自己的程序是否运行在安全模式下?
- 关于一个错误(BUG)
- 我在CPtrList中存放几个对象,需要查找倒合适的将其删除,如何操作?
- 我已做了cab文件,为什么客户端还是下载不了我做的ActiveX控件?超急急急急
- 怎么关联两个窗口
- 关于mfc多线程进度条的问题
- CEditView,怎样使得view已开始就不可以输入,mfc建造的editview
- SOS!!! 如何把char、int、long等类型转化成 BYTE 的格式?谢谢!
To: All Mark:
Subj: NT下获得Ring0的技术(一)
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
NT下如何取到Ring0级执行权(1) 黄飞
98/8 (注:引用本文请先征得作者同意,谢谢!)
===============================================
这些天几个战友讨论95/98下RING0执行权讨论得热火朝天,
也提出了很好得实现方法.本文就NT下的这个问题进行探讨.RING0意味这什么?
熟悉汇编的朋友很清楚,取到RING0级的执行权,整个OS的
内存将暴露在你的眼皮下,可以直接操纵硬件端口,操纵
系统寄存器...不得了了... :)
NT的保护?
NT是纯的32位OS,MS引以位傲的操作系统,引用了许多VMS.
UNIX等先进操作系统的概念,把自己的核心数据结构,代码
利用INTEL CPU的保护机制"完好"的包了起来.至今我仍未
发现在这方面NT有什么大的漏洞.我下面介绍的技术也有
一定缺陷.
概述:
NT下要使自己的程序在RING0执行,要做一下工作:
(1).写出自己要在RING0执行的代码
(2).写一个NT Driver,提供RING0调用Win32接口
(3).写一个NT Service,提供动态Create.Remove
NT Driver的功能
(4).写自己的调用APP,与Service.Ring0 Code连接.
下面详细介绍各个部分:
1.NT driver部分
即使在NT driver中,NT Driver的封装机制也不让你
透过HAL层去直接操纵硬件,幸运的是,在NT的Kernel
中隐藏着一组GDT操作接口,但是由于MS的XX...
所有这些东东都是未公开的. :(
为此,我做的第一项工作就是挖掘,下面是挖出的金子,
大家共享吧 . :)
// Undocumented DDK
// <begin>
NTSTATUS KeI386AllocateGdtSelectors( OUT PUSHORT SelArray,
IN int NumOfSelectors );
NTSTATUS KeI386ReleaseGdtSelectors( OUT PUSHORT SelArray,
IN int NumOfSelectors );
NTSTATUS KeI386SetGdtSelector( IN ULONG sels, IN PVOID desc );
// ...
// <end>
第3个可是我辛苦了一天的结果,NT不知被我搞死了多少次. :(
参数意义很好懂,看名字就行了.
另外,写过NT Driver的朋友一看就应该知道,这些API都是要在
Driver中才能调用的.我就不罗嗦了. 好了,敲的手都累了,这些天比较忙,只好抽空再写下一部分了.===============================================(1) Over.... Huang Fei
... =========
-!- xMail 1.00
! Origin: Shanghai Shake-River BBS.(021-59572197) (6:654/1001)
?Area: 编程语言 Programr.China 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? Msg#: 4986 Date: 27 Aug 98 16:19:04
From: Huang Fei Read: Yes Replied: No
To: All Mark:
Subj: NT下获得RING0的技术(二)
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
NT下如何取到Ring0级执行权(2) 黄飞
98/8 (注:引用本文请先征得作者同意,谢谢!)
===============================================
CALLGATE技术使用:
一个不留神,被感冒病毒袭击了,好在用康太克98杀了一通,总算
暂时喘了口气. :(
这些天老板看的太紧,抽空凑了几个字,各位不要奸笑. :)
OK,上次贴过了关键的3个Undocument API,想想在NT Driver
部分里另外一个要点是CallGate技术应用,下面是CallGate部分
程序原码:
注:我就不详细解释了,定义及使用原理见Matt在95奥秘
一书中的讲解.有兴趣者可以自己看看.
#pragma pack(1)
typedef struct
{
unsigned short limit_0_15;
unsigned short base_0_15;
unsigned char base_16_23;
unsigned char accessed : 1;
unsigned char readable : 1;
unsigned char conforming : 1;
unsigned char code_data : 1;
unsigned char app_system : 1;
unsigned char dpl : 2;
unsigned char present : 1;
unsigned char limit_16_19 : 4;
unsigned char unused : 1;
unsigned char always_0 : 1;
unsigned char seg_16_32 : 1;
unsigned char granularity : 1;
unsigned char base_24_31;
} CODE_SEG_DESCRIPTOR;typedef struct
{
unsigned short offset_0_15;
unsigned short selector;
unsigned char param_count : 4;
unsigned char some_bits : 4;
unsigned char type : 4;
unsigned char app_system : 1;
unsigned char dpl : 2;
unsigned char present : 1;
unsigned short offset_16_31;
} CALLGATE_DESCRIPTOR;
#pragma pack()
...
ring0_desc.limit_0_15 = 0xFFFF;
ring0_desc.base_0_15 = 0x0000;
ring0_desc.base_16_23 = 0x00;
ring0_desc.accessed = 0;
ring0_desc.readable = 1;
ring0_desc.conforming = 0;
ring0_desc.code_data = 1;
ring0_desc.app_system = 1;
ring0_desc.dpl = 0;
ring0_desc.present = 1;
ring0_desc.limit_16_19 = 0xF;
ring0_desc.unused = 0;
ring0_desc.always_0 = 0;
ring0_desc.seg_16_32 = 1;
ring0_desc.granularity = 1;
ring0_desc.base_24_31 = 0x00;
callgate_desc.offset_16_31 = (USHORT) \
((((ULONG)func_address) >> 16) & 0xFFFF);
callgate_desc.offset_0_15 = (USHORT)func_address;
callgate_desc.selector = extension->GdtSelectors[0];
callgate_desc.param_count = Count;
callgate_desc.some_bits = 0;
callgate_desc.type = 0xC;
callgate_desc.app_system = 0;
callgate_desc.dpl = 3;
callgate_desc.present = 1;
...
上面建立了一个RING0 CODE描述符和一个对应的CallGate描述符,
利用他们在加上(1)中介绍的3个Undocumented API,就可以提供一个
后门用以刺入NT的RING0级. ;)2. NT Service部分
NT Service是NT提出的一个新概念(虽然95/98里有雏形),通过一个集中化的
SCM( Service Control Manager )管理各种重要的后台进程,例如RAS,DHCP,
后台打印,网络消息等等,有关Service的详细信息可以在MSDN中找到.
简便期间,我这里把NT Service部分和Win32 APP部分合二为一,省去Interface
部分,直接和RING0 Code连接就行了.当然,实际使用中最好以DLL方式提供Win32
的API接口.
下面是原码:// cgateapp.c
//
#include <windows.h>#define FILE_DEVICE_CALLGATE 0x00008300
#define CALLGATE_IOCTL_INDEX 0x830// DDK micros
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0// Driver control codes
#define IOCTL_CALLGATE_CREATE CTL_CODE( FILE_DEVICE_CALLGATE, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS )
...
太长了,接下次吧. :)
===============================================(2) Over.... Huang Fei
... =========
-!- xMail 1.00
! Origin: Shanghai Shake-River BBS.(021-59572197) (6:654/1001)?Area: 编程语言 Programr.China 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? Msg#: 4987 Date: 27 Aug 98 16:22:22
From: Huang Fei Read: Yes Replied: No
To: All Mark:
Subj: NT下获得RING0的技术(三)
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
NT下如何取到Ring0级执行权(3) 黄飞
98/8 (注:引用本文请先征得作者同意,谢谢!)
===============================================
续(2)
...
#define IOCTL_CALLGATE_RELEASE CTL_CODE( FILE_DEVICE_CALLGATE, \
CALLGATE_IOCTL_INDEX+1, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS )#define STR_DEVICENAME TEXT("callgate")
#define STR_COMPDEVNAME TEXT("\\\\.\\callgate")
#define STR_DRVEXEPATH TEXT("c:\\test\\cgatedrv.sys")VOID CallDriver( HANDLE hDevice );/* Declare the function present in RING0.ASM */
void func(int *cr0, int *cr2, int *cr3);
static void __declspec( naked ) NowInRing0()
{
....
}void GotoRing0()
{
DWORD dwExcept;dwExcept = (DWORD)NowInRing0;_asm {
mov eax, fs:[0]
push eax
sidt [esp-02h]
pop ebx
mov idt, ebx
add ebx, 0x1C
mov int_idt, ebxmov eax, [ebx]
mov [Base], eax
mov ax, [ebx-4]
mov [Entry], axcli
mov esi, dwExcept
push esi
mov [ebx-4], si
shr esi, 16
mov [ebx+2], si
pop esi
stiint 3
}
}大概是这样晕,他说大概是这样!我不知道这样是正确的吗?
是不是一调这个函数就进入RING0了呢?
我见过的读取硬盘序列号的程序就是用的那个。
http://vip.6to23.com/nowcan1/tech/diskid.htm