SSDT UnHook For C

Win64 驱动内核编程-20.UnHook SSDT UNHOOK SSDT     要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的。于是,有了以下思路: 1.获得内核里 KiServiceTable 的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(变量名称:NtosBase) 3.获得内核文件在 PE32+结构体里的映像基址(变量名 阅读详情
SSDT UnHook For C-翻译女王的代码,百分之80%的相似度,
Copy code
#include <ntddk.h>
#include "PE.h"

typedef struct _tagSSDT {
    PVOID pvSSDTBase;
    PVOID pvServiceCounterTable;
    ULONG ulNumberOfServices;
    PVOID pvParamTableBase;
} SSDT, *PSSDT;
extern PSSDT    KeServiceDescriptorTable;

// 2个结构体
typedef struct _SYSTEM_MODULE
{
    ULONG    Reserved[2];
    ULONG    Base;
    ULONG    Size;
    ULONG    Flags;
    USHORT    Index;
    USHORT    Unknown;
    USHORT    LoadCount;
    USHORT    ModuleNameOffset;
    CHAR    ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

typedef struct _SYSTEM_MODULE_INFORMATION
{
    ULONG            uCount;
    SYSTEM_MODULE_INFORMATION    aSM[];
}MODULE_LIST,*PMODULE_LIST;

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemInformation(
    ULONG        SystemInformationClass,
    PVOID        SystemInformation,
    ULONG        SystemInformationLength,
    PULONG        ReturnLength
);

ULONG GetKernelBaseAddress(char* lpszModule)
{
    NTSTATUS nResult;
    ULONG ulNeededSize, uLoop, uKernelAddr;
    PMODULE_LIST pModuleList;
   
    uKernelAddr = 0;
    ZwQuerySystemInformation(11, &ulNeededSize, 0, &ulNeededSize);
    pModuleList = ExAllocatePool(NonPagedPool, ulNeededSize);
    nResult = ZwQuerySystemInformation(11, pModuleList, ulNeededSize, NULL);
   
    if (NT_SUCCESS(nResult))
    {
        //ntoskrnl is always first there
        uKernelAddr = pModuleList->aSM[0].Base;
        strcpy(lpszModule,"//SystemRoot//System32//");
        strcat(lpszModule,pModuleList->aSM[0].ModuleNameOffset+pModuleList->aSM[0].ImageName);
    }

    ExFreePool(pModuleList);

    return uKernelAddr;
}

ULONG RVAToRaw(PVOID lpBase,ULONG VirtualAddress)
{
    IMAGE_DOS_HEADER *pDosHeader;
    IMAGE_NT_HEADERS *pNtHeader;
    IMAGE_SECTION_HEADER *pSectionHeader;
    ULONG NumOfSections,uLoop;
    pDosHeader=(IMAGE_DOS_HEADER*)lpBase;
    if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
        return 0;
    pNtHeader=(IMAGE_NT_HEADERS*)((unsigned char*)lpBase+pDosHeader->e_lfanew);
    NumOfSections=pNtHeader->FileHeader.NumberOfSections;
    pSectionHeader = (IMAGE_SECTION_HEADER*)((ULONG)pNtHeader + sizeof(ULONG) + sizeof(IMAGE_FILE_HEADER) + pNtHeader->FileHeader.SizeOfOptionalHeader);
    VirtualAddress -= (ULONG)lpBase;
    for (uLoop=0;uLoop<NumOfSections;uLoop++)
    {
        pSectionHeader = (IMAGE_SECTION_HEADER*)((ULONG)pSectionHeader + sizeof(IMAGE_SECTION_HEADER) * uLoop);
        if(VirtualAddress>pSectionHeader->VirtualAddress&&VirtualAddress<pSectionHeader->VirtualAddress+pSectionHeader->SizeOfRawData)
        {
            ULONG Offset = VirtualAddress-pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;
            return Offset;
        }
    }
    return 0;
}

//服务停止时执行
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{
    DbgPrint("DriverUnload!");
}

//StartService时调用
NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
    NTSTATUS status=STATUS_SUCCESS;
    ULONG uKernelMoule,uImageBase,uSSDTCount,uSSDTBase,uSSDTRaw,uLoop,uOldAddress,uNewAddress;
    PULONG lpArraySSDT;
    char szKernelPath[256];
    ANSI_STRING aFileName;
    UNICODE_STRING uFileName;
    OBJECT_ATTRIBUTES ObjAttr;
    IO_STATUS_BLOCK ioStatus;
    FILE_POSITION_INFORMATION FilePos;
    HANDLE hFile;

    theDriverObject->DriverUnload=DriverUnload;
    // get system modules
    memset(szKernelPath,0,256);
    uKernelMoule = GetKernelBaseAddress(szKernelPath);
    uImageBase  = ((IMAGE_NT_HEADERS*)(uKernelMoule + ((IMAGE_DOS_HEADER*)uKernelMoule)->e_lfanew))->OptionalHeader.ImageBase;
    DbgPrint("Kernel ImageBase: 0x%.8X", uImageBase);
    DbgPrint("Kernel Base: 0x%.8X", uKernelMoule);
    DbgPrint("Kernel Module Path: %s", szKernelPath);
    //
    uSSDTCount = KeServiceDescriptorTable->ulNumberOfServices;
    uSSDTBase  = (ULONG)KeServiceDescriptorTable->pvSSDTBase;
    DbgPrint("SSDT BaseAddress: 0x%8X, SSDT Count: 0x%X", uSSDTBase, uSSDTCount);
    lpArraySSDT = ExAllocatePool(PagedPool, uSSDTCount * sizeof(ULONG));
    if (lpArraySSDT == NULL) return status;
    //计算SSDT数组的文件偏移
    uSSDTRaw = RVAToRaw(uKernelMoule, uSSDTBase);
    DbgPrint("SSDT RAW: 0x%.8X", uSSDTRaw);
    if (uSSDTRaw == 0)
    {
        DbgPrint("SSDT RAW Error");
        ExFreePool(lpArraySSDT);
        return status;
    }
    RtlInitAnsiString(&aFileName,szKernelPath);
    status = RtlAnsiStringToUnicodeString(&uFileName, &aFileName, TRUE);
    if(!NT_SUCCESS(status))
    {
        DbgPrint("RtlAnsiStringToUnicodeString Error");
        ExFreePool(lpArraySSDT);
        return status;
    }

    InitializeObjectAttributes(&ObjAttr, &uFileName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
    status = ZwOpenFile(&hFile, FILE_READ_DATA, &ObjAttr, &ioStatus, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT);
    if (NT_SUCCESS(status) && hFile)
    {
        FilePos.CurrentByteOffset.LowPart = uSSDTRaw;//1000;//uSSDTRaw;
        FilePos.CurrentByteOffset.HighPart = 0;
        status = ZwSetInformationFile(hFile, &ioStatus, &FilePos, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);
        if (NT_SUCCESS(status))
        {
            status = ZwReadFile(hFile, NULL, NULL, NULL, &ioStatus, lpArraySSDT, uSSDTCount * sizeof(ULONG), NULL, NULL);
            if (NT_SUCCESS(status))
            {
                for (uLoop=0; uLoop<uSSDTCount; uLoop++)
                {
                    uOldAddress = *(lpArraySSDT + uLoop) - uImageBase + uKernelMoule;
                    uNewAddress = *((PULONG)uSSDTBase + uLoop);
                    if (uOldAddress != uNewAddress)
                    {
                        DbgPrint("SSDT No.%X, Old: 0x%.8X, New: 0x%.8X", uLoop, uOldAddress, uNewAddress);
/*                        __asm
                        {//关中断
                            cli
                            mov eax,cr0
                            and eax,~0x10000
                            mov cr0,eax
                        }
                        *((PULONG)uSSDTBase + uLoop) = uOldAddress;
                        //fast_InterlockedExchange(*(uSSDTBase + uLoop), uOldAddress);
                        __asm
                        {//开中断
                            mov  eax,cr0
                            or  eax,0x10000
                            mov  cr0,eax
                            sti
                        }
*/
                    }
                }
                DbgPrint("SSDT TheEnd...");

            }
            else
                DbgPrint("Read File Error!");
        }
//        else
//            DbgPrint("Set File Pos Error!");
        if(hFile)
            ZwClose(hFile);
    }
    else
        DbgPrint("Open File Error!");
   
    RtlFreeUnicodeString(&uFileName);

    ExFreePool(lpArraySSDT);
    return status;
}

谈谈NP和HS的通用unhook 先简单说以下,NP和HS都hook了以下一些SSDT什么是SSDT?我不想说那些复杂的理论,希望以简单的事实帮助介绍先向大S道歉,下文如有冒犯,还请大S原谅怎么说呢,SSDT本身就是一个地址表,我们当他是个地址簿,也就是写了每个人的地址的记录表今天,偶想给大S送新年礼物,怎么送到大S家里呢?就得查看地址簿了上面是这样写的  大S: 游戏达人,外挂高人,破解牛人,脱壳圣人;分身有如月,堀北真希,花泽 阅读详情

相关推荐

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 450

Defeating Native API Hooker

一、在用户空间修改系统服务调度表(SSDT)SSDT位于内核空间,如果要修改SSDT的入口函数,rootkit都是通过驱动程序的方式载入再修改的。然而在用户空间可以通过直接读写/device/physicalmemory来修改SSDT的入口。(译注:修改SSDT入口是可以在用户空间进行,只是SSDT的入口函数必须是在内核空间,所以一般rootkit都是把修改后的程序放在驱动程序中,以便直接加载到内

1739

Kriging代理模型理论相关推导

代理模型,Kriging,加点准则

森屹的博客 1万+

windows平台xFsRedir程序更新(虚拟磁盘镜像存储方式改进和xFsRedir缓存原理等)

                                      by fanxiushu 2018-05-12 转载或引用请注明原始作者。xFsRedir是windows平台下的分布式网络文件系统程序。这个软件已经持续比较长的时间了,最近更新了部分功能。完整版本安装和使用请查阅如下链接:https://blog.youkuaiyun.com/fanxiushu/article/details/53...

fanxiushu的专栏 3366

C300 | 5680t | 新格林| AN5516 | 远程ONU升级指导

ONU的远程管理升级 1、ZTE C300 OLT : 1.1 环境拓扑: PC1(filezilla server)------(uplink_default-vlanID)OLT---------ONU | | mng1 1.2 配置部署: 1):PC1(filezilla server): IP:192.168.88.252 255.255.255.0 配置FTP-Server的用户名:gp...

Shelly的博客 3770

告别屏幕适配焦虑:用AndroidAutoSize 1.2.1搞定多尺寸设备(附AndroidX兼容方案)

本文详细介绍了AndroidAutoSize 1.2.1在屏幕适配中的应用,帮助开发者高效解决多尺寸设备适配问题。通过动态计算机制,AutoSize显著提升了UI一致性和开发效率,特别适合处理横竖屏切换、折叠屏等复杂场景。文章还提供了AndroidX兼容方案和性能优化建议,是Android开发者的实用指南。

weixin_42535461的博客 190

SSDT UnHook代码

 //CodeBy XiCao#include #include "PE.h"typedef struct _tagSSDT {    PVOID pvSSDTBase;    PVOID pvServiceCounterTable;    ULONG ulNumberOfServices;    PVOID pvParamTableBase;} SSDT, *PSSDT;extern

997

【驱动适配】高通sa522平台tac5x1x驱动适配全指南

本手册详细介绍了TAC5301-Q1音频编解码器在高通sa525平台Linux系统下的驱动适配流程。主要内容包括:1)TAC5301-Q1核心特性(车载级音频Codec、关键接口和功能);2)驱动适配依赖(高通声卡驱动、ALSA SoC框架等);3)I2S协议原理及主从模式说明;4)硬件准备与检查要点;5)完整的驱动移植步骤(代码移植、Kconfig/Makefile修改、设备树配置)。该手册适用于嵌入式音频开发工程师快速完成TAC5301-Q1芯片的驱动移植与验证工作。

嵌入式博哥的博客 305

SSDT Hook的两种方式

#ifndef _SSDT_H_ #define _SSDT_H_ #include typedef struct _SERVICE_DESCRIPTOR_TABLE { PULONG ServiceTable; PULONG CounterTable; ULONG TableSize; PUCHAR ArgumentTable; }SERVICE_DESCRIPTOR_TABLE,

倒计时 2502

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1416

条件DDPM:Diffusion model的第三个巅峰之作

前言:DDPM从2020年诞生,短短一年的时间,模型上有两个巨大的改进,其中一个就是condition的引入,最近大部分DDPM相关的论文都会讨论这一点,有些文章称之为latent variable。和当年GAN的发展类似,CGAN和DCGAN的出现极大程度上促进了GAN的发扬光大,意义重大。本文基于前面几篇文章继续聊一聊: 从VAE到Diffusion Model_沉迷单车的追风少年-优快云博客 为什么diffusion model扩散模型可以称为score-based models?_沉迷单车的.

沉迷单车的追风少年 1万+

RootKit hook之[二] SSDT hook

<br />谈到ssdt hook,先前有堕落天才的一篇文章《http://bbs1.pediy.com/showthread.php?p=285856#poststop"]SSDT Hook的妙用-对抗ring0 inline hook 》大家如果对基本概念不了解的话,可以看看这篇文章。另外,有一篇博客上也绘声绘色的描述了它。简单说说SSDT 。<br /><br /> 今天我们透过一个实例看看它的应用,这个实例来源于sudami前面发出的一篇文章<br />一VBS病毒过IS和微点了,无语...

kansa1988的专栏 466

【仿真技巧】Smart Eye Probe在ADS信号仿真中的应用

Smart_Eye_Probe是一个眼探头,允许灵活数量的输入通道,输入通道支持单端或差分信号的混合,并且,可以使用一个共同的时钟信号触发通道的眼图。目前,仅支持瞬态(Transient)和通道(Channel Sim)逐位模式(Bit by bit)模拟,不支持信道统计(Statistical)模式和DDR总线(DDRSim)仿真。

一只豌豆象的博客 1271

内核驱动开发HOOK SSDT

HOOK SSDT思路: 驱动加载时通过KeServiceDescriptorTable得到函数指针地址 -> 替换其地址为自定义函数地址 驱动卸载时恢复SSDT原来地址 代码部分: 对于KeServiceDescriptorTable的类型定义如下: typedef struct _SERVICE_DESCRIPTOR_TABLE { PULONG ServiceTableB...

weixin_34220834的博客 251

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Windows简单驱动编程(三):SSDT HOOK

ssdt hook NtOpenProcess win7 32环境,注释已标明一些解释 #include <ntddk.h> #include <ntstatus.h> ULONG uOldNtOpenProcess; //定义system_service_table结构体 typedef struct _KSYSTEM_SERVICE_TABLE { PULO...

yan_star的博客 754

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

getssdtserviceid_C/C++知识点之SSDTinlinehook(64位)

本文主要向大家介绍了 C/C++知识点之SSDTinlinehook(64位),通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。源码:https://github.com/haidragon/SSDTHOOK_win7x64/tree/master/SSDTHOOK_win7x64SSDT表的查找:https://blog.youkuaiyun.com/zfdyq0/article/deta...

weixin_39946313的博客 299

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

转SSDT Hook的妙用-对抗ring0 inline hook

1,SSDT SSDT即系统服务描述符表,它的结构如下(参考《Undocument Windows 2000 Secretes》第二章): typedef struct _SYSTEM_SERVICE_TABLE { PVOID ServiceTableBase; //这个指向系统服务函数地址表 PULONG ServiceCounterTableBase; UL

Tommy(凌飞)的专栏 1001

SSDT Hook的妙用-对抗ring0 inline hook

SSDT Hook的妙用-对抗ring0 inline hook 1,SSDT SSDT即系统服务描述符表,它的结构如下(参考《Undocument Windows 2000 Secretes》第二章): typedef struct _SYSTEM_SERVICE_TABLE { PVOID ServiceTableBase; //这个指向系统服务函数地址表 PULONG Ser

qq350625238的专栏 778

<转>ssdt hook 源码

来自网上。 typedef struct _SERVICE_DESCRIPTOR_TABLE { PVOID ServiceTableBase; PULONG ServiceCounterTableBase; ULONG NumberOfService; ULONG ParamTableBase; }SERVICE_DESCRIPTOR_TABLE,...

weixin_30580341的博客 69

YJX_Driver_032_自写驱动保护XX进程

1、 自写驱动保护XX进程(HOOK SSDT)  A、构建自己的内核函数(用来替换对应的内核函数)  C、Hook和UnHook函数构建  D、修改EXE和SYS对应源代码实现所谓保护  E、测试效果 【135】以28课的代码为例 新建一个hook.h单元   【200】实际上选用 第29/30课 的代码也是可以的     【380】hook.h 里面的代码: “ #pragm...

weixin_30914981的博客 207

hook zwQuerySysteminformation 隐藏进程

代码: #include //#include typedef unsigned long DWORD; #pragma pack(1) typedef struct ServiceDescriptorEntry{ unsigned int *ServiceTableBase; unsigned int *ServiceCountTableBase; unsigned int Nu

小驹的专栏 5411

SSDTHook实例--编写稳定的Hook过滤函数

讲解如何写Hook过滤函数,比如NewZwOpenProcess。打开进程。很多游戏保护都会对这个函数进行Hook。由于我们没有游戏保护的代码,无法得知游戏公司是如何编写这个过滤函数。   我看到很多奇形怪状的Hook过滤函数的写法。看得蛋痛无比。比如: http://bbs.pediy.com/showthread.php?t=126802 http://bbs.pediy.com/sh

Fly20141201. 的专栏 3447
上一篇: ndishook相关代码
下一篇: Ring0 inline hook For Delphi.
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值