首页
社区
课程
招聘
[转帖]随意将函数执行权限提高到Ring0源代码
发表于: 2008-7-15 08:23 9285

[转帖]随意将函数执行权限提高到Ring0源代码

2008-7-15 08:23
9285
支持: Windows 2K以上的操作系统,
用途: 提供超级简单使用的API:ProcessRing0(),
可将delphi中的任意函数由原來的Ring3权限提升到系统的最高级别Ring 0,
这样我们就可以随意对系统的I/O进行操作了。

下载地址:

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不知道有没有 VC 的这样的代码!?
2008-7-15 09:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好深奥哦~~~
2008-7-15 10:16
0
雪    币: 284
活跃值: (25)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
谁能转成VC的就好了
2008-7-15 12:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
/************************************************************************
* <WinRing.hpp> Ver 1.0
*
* Adjust the privilege of Application from Ring 3 to Ring 0
*
* Caution: 1. WinRing.sys support Win2K/WinXP serial only.
*           2. Don't use VCL in your procedure that it will be adjusted to Ring 0.
*          3. Don't use any command about Far-Jump.
*
* Copyright by Chun-Hsueh Lin, 03/12/2003
************************************************************************/
#ifndef DRIVER
#define DRIVER        "WINRING"
#endif
#ifndef DEVIO_H
#define DEVIO_H

//===============================================
#ifndef CTL_CODE
#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
#define METHOD_BUFFERED                 0
#define METHOD_IN_DIRECT                1
#define METHOD_OUT_DIRECT               2
#define METHOD_NEITHER                  3
#define FILE_ANY_ACCESS                 0
#define FILE_READ_ACCESS                                ( 0x0001 )    // file & pipe
#define FILE_WRITE_ACCESS                                ( 0x0002 )    // file & pipe
#define FILE_DEVICE_UNKNOWN             0x00000022
#endif

#define WINRING_Access                CTL_CODE(                \
                        FILE_DEVICE_UNKNOWN,                \
                        0x999,                                \
                        METHOD_BUFFERED,                \
                        FILE_ANY_ACCESS)
#endif

//===============================================
class TRingData
{
public:
        ULONG AdjRing0Entry;
        ULONG RegData[7];
};
//===============================================

HANDLE DriverHandle;

TRingData Ring;
DWORD retbyte;

#define WinRing();        DeviceIoControl(DriverHandle, WINRING_Access, &Ring, sizeof(Ring), &Ring, sizeof(Ring), &retbyte, 0);

bool BuildDriverService()
{
        SC_HANDLE scHandle, srvHandle;
        scHandle=OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
        if (!scHandle)
        {
                return false;
        }
        srvHandle=OpenService(scHandle,DRIVER,SERVICE_ALL_ACCESS);
        if (srvHandle==0)
        {
                char path[MAX_PATH]={0};
                String DriverPath=ExtractFilePath(Application->ExeName)+DRIVER+".sys";
                strcat(path, DriverPath.c_str());
               
                srvHandle=CreateService(
                        scHandle,
                        DRIVER,
                        DRIVER,
                        SERVICE_ALL_ACCESS,
                        SERVICE_KERNEL_DRIVER,
                        SERVICE_DEMAND_START,
                        SERVICE_ERROR_NORMAL,
                        path,
                        0,0,0,0,0);
        }
        if (srvHandle==0)
          return false;

        StartService(srvHandle,0,0);
        CloseServiceHandle(srvHandle);
        CloseServiceHandle(scHandle);
        return true;
}

//===============================================
bool DeleteDriverService()
{
        SERVICE_STATUS  srvStatus;
        SC_HANDLE scHandle,srvHandle;

        scHandle=OpenSCManager(0,0,SC_MANAGER_ALL_ACCESS);
        if (!scHandle)
        {
                return false;
        }

        srvHandle=OpenService(scHandle,DRIVER,SERVICE_ALL_ACCESS);
        if (srvHandle)
        {
                ControlService(srvHandle,SERVICE_CONTROL_STOP,&srvStatus);

                DeleteService(srvHandle);
        }
        CloseServiceHandle(srvHandle);
        CloseServiceHandle(scHandle);
        return true;
}

//===============================================
bool OpenDriver()
{
        if (!BuildDriverService())
          return false;
        DriverHandle=CreateFile(
                "\\\\.\\" DRIVER,
                GENERIC_READ|GENERIC_WRITE,
                0,
                0,
                OPEN_EXISTING,
                0,
                0);

        if (DriverHandle==INVALID_HANDLE_VALUE)
        {
                return false;
        }
        return true;
}

//===============================================
bool CloseDriver()
{
        CloseHandle(DriverHandle);
        if (!DeleteDriverService())
          return false;
        return true;
}

//===============================================
BYTE OSVersion;
void __fastcall (__closure *Ring3ProcName)();

        // Get major version numbers of Windows
        // OSVersion=4 : Win9x serial
        // OSVersion=5 : WinNT serial
//===============================================
void OpenWinRing()
{
        OSVersion = LOBYTE(LOWORD(GetVersion()));
        if (OSVersion!=4)
        {
          if (!OpenDriver())
          {
            ShowMessage("Driver not ready!!!");
            CloseDriver();
            Application->Terminate();
          }
        }
}

//===============================================
void CloseWinRing()
{
        if (OSVersion !=4)
        {
          if (!CloseDriver())
            ShowMessage("Close Driver Fail!");
        }
}

//===============================================
void __fastcall SaveAllReg(void)
{
        asm {
          push eax
          mov eax, offset Ring.RegData
          mov [eax][04], ebx
          mov [eax][08], ecx
          mov [eax][12], edx
          mov [eax][16], esi
          mov [eax][20], edi
          mov [eax][24], ebp
          mov ebx, eax
          pop eax
          mov [ebx], eax}
}

//===============================================
void __fastcall Ring0Proc()
{
        DWORD Adj0Address;
        SaveAllReg();
        asm mov Adj0Address, offset ADJRing0
        Ring.AdjRing0Entry=Adj0Address;
        WinRing();
        asm{
          jmp ADJRing3
ADJRing0:
          mov eax, [esp+4]}
        Ring3ProcName();
        asm{
          ret
ADJRing3:}
}

#define ProcessRing0(x) Ring3ProcName=x; Ring0Proc();
2008-7-15 17:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不知为什么我的电脑会出现"Driver not ready!!!"   有的时候不出现
2008-7-15 17:24
0
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
牛人啊
2008-7-15 19:49
0
雪    币: 210
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我的一直是"driver not ready"什么原因呢?哪位高人指点下!
2008-7-16 08:37
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
WINRING.sys 都没有提供
2008-7-16 11:56
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
没驱动。。。。。。。。。。。
2008-7-16 14:21
0
雪    币: 210
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
高手们,提供下驱动呀!
2008-7-16 15:17
0
雪    币: 224
活跃值: (147)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
12
我来提供一个吧,没什么实际作用

WinRing.rar
上传的附件:
2008-7-16 16:30
0
雪    币: 210
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=wynney;481921]我来提供一个吧,没什么实际作用

为什么没有实际作用呢?
2008-7-17 00:28
0
雪    币: 217
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
驱动代码见这里
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=27086
和这里
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=27088
还有这里
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=27089
2008-7-17 16:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错的东东 学习了
2008-7-18 14:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习一下
2008-11-19 02:58
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
感谢,已经下载。
2008-11-19 09:01
0
游客
登录 | 注册 方可回帖
返回
//