SSDT原始地址, 现在地址

SSDT获取原始服务地址的方法与原理(灯灯灯灯,我肥来了..) 好吧,我胡汉三肥来了..(确实肥了- -),几个月没发什么文章.其实.我也只是一个新丁~欢迎大家交流,高手勿喷,谢谢合作^_^     对于SSDT,不知道的同学请自己百度,判断出SSDT被HOOK之后,如何恢复成原始服务地址?主要方法有两个,简单来说,一个Ring0,一个Ring3的方法(可能分类不够准确),我今天除了介绍方法之外,主要还是讲讲里面的原理吧,原理神马的才是最吸引人的对吧. 阅读详情

#include <windows.h>
#include <winnt.h>
#include <WindowsX.h>
#include <commctrl.h>
#include <stdio.h>
#define ibaseDD *(PDWORD)&ibase

HINSTANCE g_hInst;
HWND hWinMain,hList;
#define ID_LISTVIEW 104
#pragma comment(lib,"comctl32")


typedef ULONG NTSTATUS;
#define RVATOVA(base,offset) ((PVOID)((DWORD)(base)+(DWORD)(offset)))
#define ibaseDD *(PDWORD)&ibase
#define STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

typedef struct {
    WORD    offset:12;
    WORD    type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;


typedef ULONG (WINAPI *ZWQUERYSYSTEMINFORMATION)(
             DWORD    SystemInformationClass,
             PVOID    SystemInformation,
             ULONG    SystemInformationLength,
             PULONG    ReturnLength);
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;

typedef enum _SYSDBG_COMMAND {
// 以下是NT 5.1 新增的
    //从内核空间拷贝到用户空间,或者从用户空间拷贝到用户空间
    //但是不能从用户空间拷贝到内核空间   
SysDbgReadVirtualMemory = 8,
 
   //从用户空间拷贝到内核空间,或者从用户空间拷贝到用户空间
   //但是不能从内核空间拷贝到用户空间   
   SysDbgWriteVirtualMemory = 9,
 
} SYSDBG_COMMAND, *PSYSDBG_COMMAND;

typedef struct _MEMORY_CHUNKS {
    ULONG Address;
    PVOID Data;
    ULONG Length;
}MEMORY_CHUNKS, *PMEMORY_CHUNKS;

typedef NTSTATUS (NTAPI * ZWSYSTEMDEBUGCONTROL) (
             SYSDBG_COMMAND ControlCode,
             PVOID InputBuffer,
             ULONG InputBufferLength,
             PVOID OutputBuffer,
             ULONG OutputBufferLength,
             PULONG ReturnLength
             );

ZWSYSTEMDEBUGCONTROL ZwSystemDebugControl = NULL;

typedef struct _SYSTEM_MODULE_INFORMATION { //Information Class 11
    ULONG    Reserved[2];
    PVOID    Base;
    ULONG    Size;
    ULONG    Flags;
    USHORT    Index;
    USHORT    Unknown;
    USHORT    LoadCount;
    USHORT    ModuleNameOffset;
    CHAR    ImageName[256];
}SYSTEM_MODULE_INFORMATION,*PSYSTEM_MODULE_INFORMATION;

#define    SystemModuleInformation    11

typedef struct
{
CHAR fname[100];
ULONG address1;
ULONG address2;
} SSDT_LIST_ENTRY;

SSDT_LIST_ENTRY *ssdt_list;

/////////////////////////////////////////////////////////////////////////
BOOL LocateNtdllEntry()
{
HMODULE ntdll_dll   = NULL;

if (!(ntdll_dll = GetModuleHandle("ntdll.dll"))) return FALSE;
if ( !( ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(ntdll_dll, "ZwQuerySystemInformation" )))
   return FALSE;
if ( !( ZwSystemDebugControl = (ZWSYSTEMDEBUGCONTROL)GetProcAddress(ntdll_dll, "ZwSystemDebugControl" )))
   return FALSE;

return TRUE;
}

//////////////////////////////////////////////////////////////////////////
BOOL DebugPrivilege(TCHAR *PName,BOOL bEnable)
{
BOOL              fOk = FALSE;
HANDLE            hToken;
TOKEN_PRIVILEGES tp;

if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken))
{
   tp.PrivilegeCount           = 1;
   tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
   LookupPrivilegeValue(NULL,PName,&tp.Privileges[0].Luid);
   AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
   fOk=(GetLastError() == ERROR_SUCCESS);
   CloseHandle(hToken);
}
return fOk;
}

//////////////////////////////////////////////////////////////////////////
DWORD GetHeaders(PCHAR ibase,
     PIMAGE_FILE_HEADER *pfh,
     PIMAGE_OPTIONAL_HEADER *poh,
     PIMAGE_SECTION_HEADER *psh)
    
{
PIMAGE_DOS_HEADER mzhead=(PIMAGE_DOS_HEADER)ibase;

if    ((mzhead->e_magic!=IMAGE_DOS_SIGNATURE) ||
   (ibaseDD[mzhead->e_lfanew]!=IMAGE_NT_SIGNATURE))
   return FALSE;

*pfh=(PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
if (((PIMAGE_NT_HEADERS)*pfh)->Signature!=IMAGE_NT_SIGNATURE)
   return FALSE;
*pfh=(PIMAGE_FILE_HEADER)((PBYTE)*pfh+sizeof(IMAGE_NT_SIGNATURE));

*poh=(PIMAGE_OPTIONAL_HEADER)((PBYTE)*pfh+sizeof(IMAGE_FILE_HEADER));
if ((*poh)->Magic!=IMAGE_NT_OPTIONAL_HDR32_MAGIC)
   return FALSE;

*psh=(PIMAGE_SECTION_HEADER)((PBYTE)*poh+sizeof(IMAGE_OPTIONAL_HEADER));
return TRUE;
}


//////////////////////////////////////////////////////////////////////////
// 搜索函数名称
//////////////////////////////////////////////////////////////////////////
void FindExport()
{
PIMAGE_FILE_HEADER    pfh;
PIMAGE_OPTIONAL_HEADER    poh;
PIMAGE_SECTION_HEADER    psh;
PIMAGE_EXPORT_DIRECTORY ped;
DWORD *arrayOfFunctionNames;
DWORD* arrayOfFunctionAddresses;
WORD* arrayOfFunctionOrdinals;
DWORD functionOrdinal,functionAddress;

HMODULE hNtdll=GetModuleHandle(TEXT("ntdll.dll"));
GetHeaders((PCHAR)hNtdll,&pfh,&poh,&psh);
if (poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
{
   ped=(PIMAGE_EXPORT_DIRECTORY)(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress+(BYTE*)hNtdll);
   arrayOfFunctionNames=(DWORD*)(ped->AddressOfNames+(BYTE*)hNtdll);
   arrayOfFunctionAddresses = (DWORD*)( (BYTE*)hNtdll + ped->AddressOfFunctions);
   arrayOfFunctionNames = (DWORD*)( (BYTE*)hNtdll + ped->AddressOfNames);
   arrayOfFunctionOrdinals = (WORD*)( (BYTE*)hNtdll + ped->AddressOfNameOrdinals);
 
   for (int i=0;i<(int)(ped->NumberOfNames);i++)
   {
    char* fun_name= (char*)((BYTE*)hNtdll + arrayOfFunctionNames[i]);
    functionOrdinal = arrayOfFunctionOrdinals[i] + ped->Base - 1;
    functionAddress = (DWORD)( (BYTE*)hNtdll + arrayOfFunctionAddresses[functionOrdinal]);
    if (fun_name[0]=='N'&&fun_name[1]=='t')
    {
     WORD number=*((WORD*)(functionAddress+1));
     if (number>ped->NumberOfNames) continue;
     lstrcpy(ssdt_list[number].fname,fun_name);
    }
   }
}
}

DWORD FindKiServiceTable(HMODULE hModule,DWORD dwKSDT)
{
    PIMAGE_FILE_HEADER    pfh;
    PIMAGE_OPTIONAL_HEADER    poh;
    PIMAGE_SECTION_HEADER    psh;
    PIMAGE_BASE_RELOCATION    pbr;
    PIMAGE_FIXUP_ENTRY    pfe;
   
    DWORD    dwFixups=0,i,dwPointerRva,dwPointsToRva,dwKiServiceTable;
    BOOL    bFirstChunk;

    GetHeaders((PCHAR)hModule,&pfh,&poh,&psh);

    // loop thru relocs to speed up the search
    if ((poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) &&
        (!((pfh->Characteristics)&IMAGE_FILE_RELOCS_STRIPPED))) {
       
        pbr=(PIMAGE_BASE_RELOCATION)RVATOVA(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,hModule);
 
        bFirstChunk=TRUE;
        // 1st IMAGE_BASE_RELOCATION.VirtualAddress of ntoskrnl is 0
        while (bFirstChunk || pbr->VirtualAddress) {
            bFirstChunk=FALSE;
  
            pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));
  
            for (i=0;i<(pbr->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))>>1;i++,pfe++) {
                if (pfe->type==IMAGE_REL_BASED_HIGHLOW) {
                    dwFixups++;
                    dwPointerRva=pbr->VirtualAddress+pfe->offset;
                    // DONT_RESOLVE_DLL_REFERENCES flag means relocs aren't fixed
                    dwPointsToRva=*(PDWORD)((DWORD)hModule+dwPointerRva)-(DWORD)poh->ImageBase;
    
                    // does this reloc point to KeServiceDescriptorTable.Base?
                    if (dwPointsToRva==dwKSDT) {
                        // check for mov [mem32],imm32. we are trying to find
                        // "mov ds:_KeServiceDescriptorTable.Base, offset _KiServiceTable"
                        // from the KiInitSystem.
                        if (*(PWORD)((DWORD)hModule+dwPointerRva-2)==0x05c7) {
                            // should check for a reloc presence on KiServiceTable here
                            // but forget it
                            dwKiServiceTable=*(PDWORD)((DWORD)hModule+dwPointerRva+4)-poh->ImageBase;
                            return dwKiServiceTable;
                        }
                    }
                   
                }
     // should never get here
            }
            *(PDWORD)&pbr+=pbr->SizeOfBlock;
        }
    }   
   
    return 0;
}

DWORD    dwKSDT;                // rva of KeServiceDescriptorTable
DWORD    dwKiServiceTable;    // rva of KiServiceTable
DWORD    dwKernelBase,dwServices=0;
//////////////////////////////////////////////////////////////////////////
void GetSSDT()
{    
    HMODULE    hKernel;
    PCHAR    pKernelName;
    PDWORD    pService;
    PIMAGE_FILE_HEADER    pfh;
    PIMAGE_OPTIONAL_HEADER    poh;
    PIMAGE_SECTION_HEADER    psh;

ULONG n;

    // get system modules - ntoskrnl is always first there

    ZwQuerySystemInformation(SystemModuleInformation,&n,0,&n);
PULONG p=new ULONG[n];
    ZwQuerySystemInformation(SystemModuleInformation,p,n*sizeof(*p),0);
PSYSTEM_MODULE_INFORMATION module=PSYSTEM_MODULE_INFORMATION(p+1);

    // imagebase
    dwKernelBase=(DWORD)module->Base;
    // filename - it may be renamed in the boot.ini
    pKernelName=module->ModuleNameOffset+module->ImageName;
   
    // map ntoskrnl - hopefully it has relocs
    hKernel=LoadLibraryEx(pKernelName,0,DONT_RESOLVE_DLL_REFERENCES);
    if (!hKernel) {
        return;
    }

    // our own export walker is useless here - we have GetProcAddress :)
    if (!(dwKSDT=(DWORD)GetProcAddress(hKernel,"KeServiceDescriptorTable"))) {
        return;
    }

    // get KeServiceDescriptorTable rva
    dwKSDT-=(DWORD)hKernel;
    // find KiServiceTable
    if (!(dwKiServiceTable=FindKiServiceTable(hKernel,dwKSDT))) {
        return;
    }

    // let's dump KiServiceTable contents
   
    // MAY FAIL!!!
    // should get right ServiceLimit here, but this is trivial in the kernel mode
    GetHeaders((PCHAR)hKernel,&pfh,&poh,&psh);
    dwServices=0;

    for (pService=(PDWORD)((DWORD)hKernel+dwKiServiceTable);
*pService-poh->ImageBase<poh->SizeOfImage;
pService++,dwServices++)
{
   ssdt_list[dwServices].address1=*pService-poh->ImageBase+dwKernelBase;
}
FreeLibrary(hKernel);
//读取现在的
MEMORY_CHUNKS QueryBuff;
DWORD *address2=new DWORD[dwServices];
QueryBuff.Address = dwKernelBase+dwKiServiceTable;
QueryBuff.Data = address2;
QueryBuff.Length = sizeof(DWORD)*dwServices;
DWORD ReturnLength;
ZwSystemDebugControl
   (
   SysDbgReadVirtualMemory,
   &QueryBuff,
   sizeof(MEMORY_CHUNKS),
   NULL,
   0,
   &ReturnLength
   );

LV_ITEM lvi;
lvi.mask = LVIF_TEXT;
char tmp[10];
ListView_DeleteAllItems(hList);
for (int j=0;j<(int)dwServices;j++)
{
   lvi.iItem=j;
   lvi.iSubItem=0;
   lvi.pszText=tmp;
   wsprintf(tmp,"0x%02X",j);
   ListView_InsertItem(hList,&lvi);
   ListView_SetItemText(hList,j,1,ssdt_list[j].fname);
   wsprintf(tmp,"0x%08X",ssdt_list[j].address1);
   ListView_SetItemText(hList,j,2,tmp);
   wsprintf(tmp,"0x%08X",address2[j]);
   ssdt_list[j].address2=address2[j];
   ListView_SetItemText(hList,j,3,tmp);
 
   //搜索模块
   for (int i=0;i<(int)*p;i++)
   {
    if (ssdt_list[j].address2 > ( DWORD)module[i].Base&&ssdt_list[j].address2 < (DWORD)module[i].Base + module[i].Size )
    {
     ListView_SetItemText(hList,j,4,module[i].ImageName);
     break;
    }
   }
}
   
delete [] p;
delete [] address2;
}

int main()
{
ssdt_list=new SSDT_LIST_ENTRY[500];
LocateNtdllEntry();
FindExport();
DebugPrivilege (SE_DEBUG_NAME,TRUE);
GetSSDT();
//恢复SSDT
DWORD *address1=new DWORD[dwServices];
for (int i=0;i<(int)dwServices;i++)
{
   //address1[i]=ssdt_list[i].address1;
   printf("原始地址:0x%08X,现在地址:0x%08X,SSDTName=%s/n",ssdt_list[i].address1,ssdt_list[i].address2,ssdt_list[i].fname);
}
MEMORY_CHUNKS QueryBuff;
QueryBuff.Address=dwKiServiceTable+dwKernelBase;
QueryBuff.Data=address1;
QueryBuff.Length=dwServices*sizeof(DWORD);
DWORD ReturnLength;
ZwSystemDebugControl
   (
   SysDbgWriteVirtualMemory,
   &QueryBuff,
   sizeof(MEMORY_CHUNKS),
   NULL,
   0,
   &ReturnLength
   );
printf("恢复SSDT成功!/n");
// system("pause");
return 0;
}

深入解析Shadow SSDT服务函数原始地址获取技术 回顾这场长达二十年的攻防拉锯战,你会发现:SSDT Hook 曾经是 Rootkit 的标配技能;Shadow SSDT 的出现标志着微软开始推行纵深防御理念;PatchGuard 让“默认拒绝”成为内核设计的新哲学;如今的终端安全早已超越单一技术点,走向体系化对抗。而对于我们这些技术人员来说,理解这些底层机制的意义远不止于“炫技”。当你知道不仅是一个隐藏的结构,更是现代操作系统自我保护思想的具体体现时,你会更加敬畏每一行代码背后的工程智慧。 阅读详情

相关推荐

R0层获取ShadowSSDT函数原始地址实例

本实例由VS2008开发,在提供了一套驱动开发框架的同时,又演示了如何获取Shadow SSDT表函数原始地址的办法。 主要函数:ULONG GetShadowSSDT_Function_OriAddr(ULONG index); 原理说明: 根据特征码搜索导出函数KeAddSystemServiceTable来获取Shadow SSDT基址,以及通过ZwQuerySystemInformation()函数获取win32k.sys基址,然后解析PE定位到Shadow SSDT在win32k.sys的偏移地址,并通过进一步计算来得到Shadow SSDT表函数的原始地址。 这里只测试了三个函数:(460)NtUserMessageCall、(475)NtUserPostMessage和(502)NtUserSendInput,具体使用时可以举一反三,网上完整的源代码实例并不太多,希望可以帮到真正有需要的朋友。 系统环境: 在WinXP SP3系统 + 瑞星杀毒软件 打印输出: [ LemonInfo : Loading Shadow SSDT Original Address Driver... ] [ LemonInfo : 创建“设备”值为:0 ] [ LemonInfo : 创建“设备”成功... ] [ LemonInfo : 创建“符号链接”状态值为:0 ] [ LemonInfo : 创建“符号链接”成功... ] [ LemonInfo : 驱动加载成功... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 开始... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP Enter IRP_MJ_DEVICE_CONTROL... ] [ LemonInfo : 获取ShadowSSDT表 (460)NtUserMessageCall 函数的“当前地址”为:0xB83ECFC4,“起源地址”为:0xBF80EE6B ] [ LemonInfo : 获取ShadowSSDT表 (475)NtUserPostMessage 函数的“当前地址”为:0xB83ECFA3,“起源地址”为:0xBF8089B4 ] [ LemonInfo : 获取ShadowSSDT表 (502)NtUserSendInput 函数的“当前地址”为:0xBF8C31E7,“起源地址”为:0xBF8C31E7 ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP_MJ_DEVICE_CONTROL 成功执行... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 结束... ] [ LemonInfo : UnLoading Shadow SSDT Original Address Driver... ] [ LemonInfo : 删除“符号链接”成功... ] [ LemonInfo : 删除“设备”成功... ] [ LemonInfo : 驱动卸载成功... ]

RING3下SSDT原始地址的获取

#include "stdafx.h"#include #include using namespace std;#define RVATOVA(base,offset)             ((PVOID)((DWORD)(base)+(DWORD)(offset)))#define ibaseDD *(PDWORD)&ibase#define STATUS_

KernelEx的专栏 2635

Shadow SSDT服务函数原始地址

可以獲取到Shadow SSDT服务函数原始地址,这更是大多数朋友所期待的。

SSDT Restore in ring0的部分代码

NTSTATUS GetModuleBaseInformation(IN PCHAR pModuleName,OUT PSYSTEM_MODULE_INFORMATION psmi) {PSYSTEM_MODULE_INFORMATION psmi2=0;ULONG     i;ULONG     uCount;PCHAR     pName;ULONG     dData;PCHAR     B

1028

Mathtype公式排版避坑指南:固定行距20磅下如何完美显示上下标(实测有效)

本文针对学术论文在固定行距20磅要求下,Mathtype公式上下标显示不全或被裁剪的问题,提供了实测有效的解决方案。文章深入剖析了固定行距与公式排版的冲突原理,并详细指导用户通过调整Mathtype的“定义间距”参数(如下标深度、上标高度),以及利用“格式化公式”功能进行批量处理,确保公式在严格遵守期刊格式要求的同时清晰完整显示。

weixin_29228203的博客 1071

Power BI----各类切片器的使用

首先介绍切片器的最基础的创建和效果演示,紧跟着介绍切片器在多页中的同步和本身与报表的联动,再然后介绍关于切片器属性的设置,使得交互更加美观,最后介绍几种很好看的第三方的切片器样式和自己构建的可折叠的切片器.........

Itsme_MrJJ的博客 2万+

驱动开发:Win10枚举完整SSDT地址表

在WinDBG中可看到完整的输出内容,当然有些函数没有被导出,起源地址是拿不到的。函数顺便把当前地址拿到,并通过循环方式得到完整的SSDT列表。根据上一章节的内容扩展,枚举完整SSDT表我们可以这样来实现。我们运行这段程序,即可得到整个系统中所有的SSDT表地址信息;得到当前地址很容易实现,只需要将函数名字符串通过。表基地址了,找到后我们可根据序号获取到指定。表信息,则可以定义字符串列表,以此循环调用。函数得到,当然在此之间也可以调用系统提供的。函数的原始地址,而如果需要输出所有。中已经教大家如何寻找。

微软技术分享 2万+

杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

很多的工程师,在开发杰理蓝牙芯片的第一步就会有一个很深的疑惑,关于key的 1、什么是key文件? 2、Key文件是如何产生的? 3、为什么需要他key文件? 4、如何添加key文件? 5、以及实际开发中的一些报错该如何处理?

qyvhome的博客 4102

获取SSDT,SSSDT原始函数地址

SSDT 当前函数地址 = KiSeviceTable + *(KiServiceTalbe + index * 4); TableRVA = KiSeviceTable - 内核真实加载地址 ; ImageBase = 0x140000000;(理想加载地址) ImageKiSeviceTable = ImageBase + TableRVA; LoadDLLBase = LoadLi

zhuhuibeishadiao 4886

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 5333

你的小龙虾 OpenClaw 还很笨?快给它装上这几个核心技能(OpenClaw 必装skills整理)

🦞 刚装小龙虾OpenClaw? 本文分享一些OpenClaw必装技能,从视觉理解到智能学习,让它从“会聊天”变“会干活” 🚀

XiaoqiangClub的博客 871

内核层获取SSDT中函数原始地址

标 题: 【下载】内核层获取SSDT中函数原始地址 作 者: QEver 时 间: 2011-08-30,20:32:28 链 接: http://bbs.pediy.com/showthread.php?t=139524 昨天在看雪看到《【下载】发个获得SSDT函数名和索引号的代码》,一时兴起整理了一份内核层根据ntdll.dll和nt模块文件来获取SSDT函数原始的地址的代码,可以

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1563

App爬虫实战篇-以华为真机手机爬取集换社的app为例

在开始学习这篇文章之前,建议你先按照之前2篇文章(和),配置必要的环境,才可以继续完成本章节内容。

youbingchen的博客 781

SSDT获取原始服务地址的方法与原理

转自:http://blog.youkuaiyun.com/gaa_ra/article/details/6989406     好吧,我胡汉三肥来了..(确实肥了- -),几个月没发什么文章.其实.我也只是一个新丁~欢迎大家交流,高手勿喷,谢谢合作^_^     对于SSDT,不知道的同学请自己百度,判断出SSDT被HOOK之后,如何恢复成原始服务地址?主要方法有两个,简单来说,一个Ring0,一个Ri

cdsntxz158的专栏 4669

Open3d Qt的环境配置

目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。

阁楼 920

ESP32 双雷达融合盲区车辆接近预警系统设计与实现

/ 超声波传感器引脚// 触发引脚// 回声引脚// 预警模块引脚// 蜂鸣器引脚// LED引脚// 串口配置(毫米波雷达用UART2)#define BAUD_RATE 115200 // 雷达串口波特率(IWR6843默认配置)// 预警阈值(可根据实际需求调整)// 高危区阈值(3m)// 预警区阈值(10m)// 传感器数据存储// 毫米波雷达距离(m)// 毫米波雷达速度(km/h)// 超声波距离(m)// 融合后距离(m)

weixin_42300449的博客 747

getssdtserviceid_SSDT原始地址,现在地址

#include #include #include #include #include #define ibaseDD *(PDWORD)&ibaseHINSTANCE g_hInst;HWND hWinMain,hList;#define ID_LISTVIEW 104#pragma comment(lib,"comctl32")typedef ULONG NTSTATUS;#defi...

weixin_39899691的博客 163

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

初识SSDT、读取内核API地址

SSDT 表的初步学习 1 理论知识 大概思路和理论知识 首先明白应用层到 内核层 会通过一张SSDT 表、、我们要根据SSDT结构和索引号来获取函数的当前地址 如果检测一下这个函数有木有被HOOK我们要在获取这个函数的起源地址 对比一下即可知道、、 1 读取SSDT表函数当前地址 了解SSDT结构 系统服务描述符表 在ntoskrnl.exe导出KeService...

weixin_34064653的博客 117

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

恢复在WIN64上的SSDT钩子

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33755554的博客 256

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SSDT结构简记

Windows内核新手上路1——挂钩SSDT          这个系列记录学习我学习windows内核的点点滴滴,高手请直接无视。          文章核心内容:挂钩SSDT中函数列NtOpenProcess,NtDuplicateObject,NtCreateThread,NtOpenThread,NtWriteVirtualMemory,过滤进程操作来保护目标进程空间。   SSD

whatday的专栏 1246

SSDT结构

SSDT的全称是System Services Descriptor Table,系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable 这个表 typedef struct ServiceDescriptorTable { PVOID ServiceTableBase; //System Service Dispatch Table 的基地址

zcc1414的专栏 707

java 钩子 64位 操作系统_恢复在WIN64上的SSDT钩子

要恢复SSDT,首先要获得SSDT各个函数的原始地址,而SSDT各个函数的原始地址,自然是存储在内核文件里的。于是,有了以下思路:1.获得内核里KiServiceTable的地址(变量名称:KiServiceTable)2.获得内核文件在内核里的加载地址(变量名称:NtosBase)3.获得内核文件在PE32+结构体里的映像基址(变量名称:NtosImageBase)4.在自身进程里加载内核文件并...

weixin_42365898的博客 343
上一篇: RING3下SSDT原始地址的获取
下一篇: PspCreateProcessNotifyRoutine,PspCreateThreadNotifyRoutine,PspLoadImageNotifyRoutine表全部清空
普通网友
博客等级 码龄17年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值