一个小型的用于监视进程产生和撤销驱动逆向分析

逆向随笔——对可以过TP的注入驱动的一次逆向 前言: 逆一些东西,有点收获,就写篇随笔记录一下。因为写的随便,就不发看雪了。 今天一个朋友给我发了一个说是可以过TP的注入驱动,希望我逆一下看看是什么套路。 正文: 接收过来压缩包,看了一下 loadddll32和64分别是用在32和64的驱动,MemOpe和dnf.exe都是测试用例(不过我是用自己写的123.exe进行测试)。 先跑起来,看看线程和模块上有没有什么特别的地方 有一个线程P... 阅读详情
一个小型的用于监视进程产生和撤销驱动逆向分析



前两天,闪电狼兄给了一个Themida_1.0.0.5加壳的新版绝影凯旋vip1.65,
狼把它目录中一个驱动NTProcDrv.sys让偶分析分析,注意这不是Themida_1.0.0.5驱动,不过它也保护这Themida加壳的主程序.早前错认了!

由于偶是菜鸟加壳盲.只好"雾"里看花去捏裸笨的NTProcDrv.sys.

作者声明: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
由于我误解了狼兄错认它是Themida的驱动.错误改过来了!
西裤兄,不过代码全部是自己逆地.原来有开源的.



逆向一下:

1:设备对象自定义扩展结构体如下:
typedef struct _DeviceExtension {  
          ULONG size;         //0x0        
          PHANDLE EventHandle; //0x04
          PRKEVENT KernelEvent;   //+0x08
          HANDLE ParentId;     //+0x0C
          HANDLE ProcessId;   //+0x010
          ULONG IsCreate;     //+0x014
          } NTProcDrvDeviceExtension;

2:IRP_MJ_DEVICE_CONTROL中是点关键东东.

3:IoCreateNotificationEvent 建立事件通知与下面的回调和exe交互

4:PsSetCreateProcessNotifyRoutine 进程事件回调

由于偶是菜鸟加壳盲,不敢碰Themida_1.0.0.5加壳的EXE.只好找软肋逆.
代码如下:

//////////////////////////////////////////////////////////////////////////////
//       *       NTProcDrv.sys         *    
//       *   be reversed by qiweixue[BCG]   *
//       *   CopyRight:http://
www.pediy.com   *  
/////////////////////////////////////////////////////////////////////////////

#include <ntddk.h>
#define NTProcDrv_IOCTL_METHOD_BUFFERED 0x22E000

typedef struct _DeviceExtension {  
          ULONG size;         //0x0        
          PHANDLE EventHandle; //0x04
          PRKEVENT KernelEvent;   //+0x08
          HANDLE ParentId;     //+0x0C
          HANDLE ProcessId;   //+0x010
          ULONG IsCreate;     //+0x014
          } NTProcDrvDeviceExtension;

         
VOID
NTProcDrvUnloadDriver(
  IN PDRIVER_OBJECT     DriverObject
  );
 
NTSTATUS  
NTProcDrvCreateClose(
  IN PDEVICE_OBJECT DeviceObject,
  IN PIRP Irp
  );
   
NTSTATUS
NTProcDeviceControl(
  IN PDEVICE_OBJECT DeviceObject,
  IN PIRP Irp
  );
   
VOID
NTProcDrvNotifyRoutine (
  IN HANDLE ParentId,
  IN HANDLE ProcessId,
  IN BOOLEAN Create
  );


UNICODE_STRING DeviceNameString;  
UNICODE_STRING LinkDeviceNameString;  
UNICODE_STRING EventDeviceNameString;
PDEVICE_OBJECT GloalDeviceObject;

NTSTATUS
DriverEntry(
  IN PDRIVER_OBJECT DriverObject,
  IN PUNICODE_STRING RegistryPath
  )

{
 
  HANDLE HEventHandle;
  PKEVENT PEnvent;
PDEVICE_OBJECT deviceObject = NULL;
NTSTATUS ntStatus;
NTProcDrvDeviceExtension     *DevExt=NULL;

RtlInitUnicodeString( &DeviceNameString,   L"//Device//NTProcDrv" );
RtlInitUnicodeString( &LinkDeviceNameString,L"//DosDevices//NTProcDrv");

ntStatus = IoCreateDevice(
          DriverObject,
          sizeof(NTProcDrvDeviceExtension),              
          &DeviceNameString,
          FILE_DEVICE_UNKNOWN,
          0,
          FALSE,
          &deviceObject );

  if (!NT_SUCCESS( ntStatus ))
  {

    return ntStatus;
  }

  ntStatus = IoCreateSymbolicLink(
          (PUNICODE_STRING) &LinkDeviceNameString,
          (PUNICODE_STRING) &DeviceNameString
          );

  if (!NT_SUCCESS(ntStatus))
  {
    IoDeleteDevice(deviceObject);
    return ntStatus;
  }
  GloalDeviceObject=deviceObject;
  DriverObject->DriverUnload =NTProcDrvUnloadDriver;
 
  DriverObject->MajorFunction[IRP_MJ_CREATE] = NTProcDrvCreateClose;
  DriverObject->MajorFunction[IRP_MJ_CLOSE] = NTProcDrvCreateClose;
  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NTProcDeviceControl;  
 
  RtlInitUnicodeString(&EventDeviceNameString,L"//BaseNamedObjects//NTProcDrvProcessEvent");
 
  PEnvent=IoCreateNotificationEvent(
                &EventDeviceNameString,
                DevExt->EventHandle
                );  
  DevExt=(NTProcDrvDeviceExtension*)(deviceObject->DeviceExtension);
  DevExt->KernelEvent=PEnvent;
  KeClearEvent(DevExt->KernelEvent);
 
  ntStatus= PsSetCreateProcessNotifyRoutine((PCREATE_PROCESS_NOTIFY_ROUTINE)NTProcDrvNotifyRoutine,0);
 
  return ntStatus;
}


void
NTProcDrvUnloadDriver(
  IN PDRIVER_OBJECT DriverObject
  )
{
  PDEVICE_OBJECT deviceObject = DriverObject->DeviceObject;
  IoDeleteSymbolicLink( &LinkDeviceNameString );
  if ( deviceObject != NULL )
  {
    IoDeleteDevice( deviceObject );
  }
}

NTSTATUS
NTProcDrvCreateClose(
  IN PDEVICE_OBJECT DeviceObject,
  IN PIRP Irp
  )  
{
  Irp->IoStatus.Status = STATUS_SUCCESS;  
  Irp->IoStatus.Information = 0;
  IoCompleteRequest( Irp, IO_NO_INCREMENT );
  return STATUS_SUCCESS;
}

NTSTATUS
NTProcDeviceControl(
  IN PDEVICE_OBJECT DeviceObject,
  IN PIRP Irp
  )
{  

  NTSTATUS ntStatus;
  ULONG   IoCtlCode;
  PIO_STACK_LOCATION IrpStack;
  ULONG           inBufLength;
  ULONG           outBufLength;
  PVOID           InOutBuf;
  NTProcDrvDeviceExtension     *DevExt=NULL;

  ntStatus=STATUS_UNSUCCESSFUL;
  IrpStack = IoGetCurrentIrpStackLocation(Irp);//+60
  outBufLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;//+4
  inBufLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;//+8
  IoCtlCode =IrpStack->Parameters.DeviceIoControl.IoControlCode; //C
  InOutBuf = Irp->AssociatedIrp.SystemBuffer;  
  switch(IoCtlCode)
  {
 
  case NTProcDrv_IOCTL_METHOD_BUFFERED:

      if(outBufLength<0x0C)break;
      DevExt=(NTProcDrvDeviceExtension*)DeviceObject->DeviceExtension;
    *((PLONG)InOutBuf)=(ULONG) (DevExt->ParentId);
    *((PLONG)InOutBuf+1)=(ULONG)(DevExt->ProcessId);
    *((PLONG)InOutBuf+2)=(char)(DevExt->IsCreate);
      ntStatus=STATUS_SUCCESS;
  break;

default:
    Irp->IoStatus.Status = ntStatus;
    if(!NT_SUCCESS(ntStatus))
      {
      Irp->IoStatus.Information = outBufLength;
      }  
  Irp->IoStatus.Information = outBufLength;      
  }

  IofCompleteRequest(Irp,IO_NO_INCREMENT);
 
  return ntStatus;
}
 
void
NTProcDrvNotifyRoutine (
  IN HANDLE ParentId,
  IN HANDLE ProcessId,
  IN BOOLEAN Create
  )
{

  PDEVICE_OBJECT deviceObject=NULL;
  NTProcDrvDeviceExtension *DevExt=NULL;
  deviceObject=GloalDeviceObject;
DevExt=deviceObject->DeviceExtension;
  DevExt->ParentId=ParentId;
  DevExt->ProcessId=ProcessId;
  DevExt->IsCreate=(char)Create;
  KeSetEvent(DevExt->KernelEvent,0,0);
  KeClearEvent(DevExt->KernelEvent);
return ;
}
   
欢迎找bug.idb文件.c文件,源驱动都在附件中.
 
驱动开发(8)处理设备I/O控制函数DeviceIoControl 本博文由优快云博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: 在上面的两篇博文中,介绍了IRP与派遣函数,以及我们通过了一个例子“磁盘设备的绝对读写”来演示了在应用程序中是如何向一个设备发出I/O请求的。这篇博文将演示在驱动程序中处理一个非常简单的I/O请求——由DeviceIoControl这个Win32API经过一系列的调用,在内核中 阅读详情

相关推荐

钉钉Java面经及参考答案

TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自

大模型大数据攻城狮的专栏 238

c语言中.dat是什么文件,c 盘目录下的windata.dat是什么文件 可以删吗

Ntuser.dat、Ntuser.ini、Ntuser.dat及LOG日志文件都属于用户配置文件,就是系统用户的一些记录和配置,你不要删除!在当前用户下你也是删不掉的!是注册表文件Windows操作系统是由许多文件组成的,注册表也不例外,对于Windows 9x系统,注册表底层是由System.dat和User.dat两个文件组成的。它们是二进制文件,不能用文本编辑器查看。它们一般存放于Wind...

weixin_35203997的博客 4037

【信息科学与工程学】计算机科学与自动化——第一百五十五篇 缓存系统设计02

编号176-190共15个条目,覆盖了缓存互连网络(环形/交叉开关)、硅光互连、散热设计、3D封装TSV、信号完整性、冗余设计、老化补偿、电磁兼容、时钟分布、JTAG测试、安全硬件、调试探针、容错路由、体偏置、共振时钟。:编号161-175共15个条目,聚焦于缓存硬件设计与配置,涵盖了MESI协议、多级TLB、分支预测BTB/BHT、自适应预取引擎、ECC纠错汉明码、路分区硬件、非暂时性存储旁路、缓存冲刷指令、缓存锁定、压缩硬件、嗅探过滤器、虚拟化EPT、QoS限速、内置自测BIST、电源管理DVFS。

weixin_49199313的博客 180

逆向基础-Windows驱动开发(一)

驱动开发

AppWhite_Star的博客 1431

扩展内核函数 PsSetCreateProcessNotifyRoutine 等的蹲坑数量

扩展内核函数 PsSetCreateProcessNotifyRoutine 等的蹲坑数量

【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识

问题:前端如何获取并生成设备唯一标识?核心要点:浏览器原生信息有限,但通过组合多个维度可生成设备指纹(Device Fingerprint),用于唯一标识设备。常见方式浏览器信息(User-Agent)屏幕与系统参数本地存储标识(localStorage / cookie)第三方指纹库(如 FingerprintJS)方式优点缺点手动组合指纹实现简单不稳定,识别率低持久化强容易被用户清除识别率高、稳定性好依赖第三方库IP 地址识别网络识别粗略共享网络环境下重复可能大。

qq_59344127的博客 1796

初学驱动逆向,笔记一。

初学驱动逆向,在《windows驱动开发技术详解》中随便找个例子逆逆看 [ \chapter09\SpecialStartIOTest ]。 水平很菜,各路牛人笑过。 逆向该例子的DriverEntry和CreateDevice函数,这两个函数在《windows驱动开发技术详解》的例子中十分常见。 并逆向的本范例驱动的核心部分 HelloDDKRead 函数,没什么技术含量。 经验:需要熟

Diomedes's Place 2059

3D Gaussian Splatting环境配置和运行

使用conda命令根据environment.yml文件创建虚拟环境时,安装的pytorch是使用conda install 命令来安装的,实际上并不能成功安装带有gpu的pytorch,而这两个模块的安装依赖于带gpu的pytorch。如果不注释掉这三行,直接安装会报错

m0_46360757的博客 3326

某超级注入程序的驱动逆向

1、起因 从哥们儿那找到了一个超级注入的工具,打开一看加了vmp,然后还有驱动的驱动,于是这里把驱动提取出来,简单分析一下。 1.1运行 让程序先把驱动释放出来,可以看到这里需要买卡,然后才会释放驱动加载(简单破解一下就行,不是重点) 1.2破解之后 下一个CreateServiceA断点,让它在加载驱动之前断下,接着将驱动拷贝出来。从下图可以看到虽然驱动有签名,但是个过期签名,高版本windows10上是加载不上的。 2、驱动分析 好消息是驱动没有加壳,可以f5分析一下 2.1W.

被遗弃的庸才博客 3197

光模块基础知识【快速入门】02

光模块是用于交换机与设备之间传输的载体,是光纤通信系统中的核心器件。主要作用是发射端将设备的电信号转换成光信号。 光纤通道光模块和以太网光模块 光纤通道光模块 光纤通道(FC, Fiber Channel)是一种高速网络数据传输协议。光纤通道协议可以有序无损地传输原始数据,它主要用于在数据中心、电脑服务器、交换机与存储网络中进行数据传输。 FC光模块遵循FC协议,充当着光纤通道系统之间的接口,也是光纤存储网络设备间的接口。它们主要用于数据中心的光纤通道存储网络链接中。 FC光模块具有小型化和低.

Jin Hanquan的博客 3万+

python 中心线提取_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就...

weixin_42204453的博客 4290

软考——架构师笔记

该文章可作为系统架构设计师考试的参考笔记。

weixin_43930239的博客 705

ADS2019学习笔记:三、SPICE model导入

以BZX84-C33 SPICE model为例,学习如何在ADS2019中导入SPICE model。

qq_42945911的博客 6495

3.Linux基础开发⼯具【由浅入深-Linux】

在 Windows 环境中,我们习惯了双击 或 文件并一路点击“下一步”来安装软件。但在 Linux 的世界里,软件的分发和安装理念有着本质的不同。Linux 强调权限控制、模块化和依赖管理。为了帮您构建完整的 Linux 系统管理知识体系,我们可以将 Linux 下安装软件的方式归纳为五大主流阵营。这是 Linux 下最正统、也是日常使用频率最高的方式。它又细分为“在线仓库安装”和“本地包安装”两种场景。1. 在线仓库安装(如同手机自带的 App Store) 操作系统维护着一个庞大的软件云端仓库。通

插花弄玉的博客 912

智能驾驶感知模块评测实战:如何用回灌测试提升BEV模型准确率(附数据集处理技巧)

本文深入探讨了如何通过诊断型回灌测试系统性地提升智能驾驶BEV感知模型的准确率与鲁棒性。文章详细拆解了从场景切片、时空对齐到多维指标分析的完整评测流水线,并针对BEV模型特有的深度估计、特征融合等环节提供了优化思路,旨在帮助工程师将海量路采数据转化为精准的模型迭代燃料。

weixin_29045585的博客 395

复旦微实现串口在线升级BOOT.BIN

将该 demo 生成的 app(升级用)和 fsbl、最简化 bit 文件(可选)打包成 BOOT.BIN,作为 golden image 烧写在 qspi flash 偏移 0 地址开始的位置,其中最简化 bit 文件为在线升级功能提供必要的物理通道(如果不需要,可以不打包该文件),golden image 一旦发布基本不需要进行升级,由该 golden image 负责和上位机进行通信交互,完成业务 app、业务 bit 文件、uboot 以及操作系统 image 等文件在线升级,在qspi flash

wangjie36的博客 3174

磁盘机病毒驱动部分逆向分析

;对磁盘机病毒驱动部分进行逆向分析,这是简单的逆向代码,可以了解磁盘机驱动部分的原理。  .386  .model flat, stdcall  option casemap:none;+++++++++++++++++++++++++++++++++++++++++++++++++++++; include文件定义;++++++++++++++++++++++++++++++++++++++

herx1的专栏 1014

用 ABAP OAuth 2.0 Client 直连 SAP SuccessFactors:从体系到落地的一条龙实践指南

ABAP SMI允许在后端对外部服务的OData端点进行定义与自定义化配置,并以受信连接的方式暴露给ABAP应用调用。它并不替代OAuth,而是扮演端点与自定义参数的集中化定义者,最终认证依旧由完成。对于需要在ABAP后端发起临时或补充型OData调用的场景,SMI是一个轻量而清晰的集成入口。scope的客户端应用已经完成注册,API DomainCompany ID、证书或密钥都已归档。ABAP的Profile与Client已建立并绑定,OA2C_GRANT可见绿色访问状态。SMI。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 286

利用签名驱动漏洞过游戏反作弊引擎

自己写的驱动没有签名,系统不加载 设置电脑为测试模式加载驱动,某些游戏在该模式下不运行 ASUS EIO64.sysMmMapIoSpace/MmUnmapIoSpaceIOMap64.sysMmMapIoSpace/MmUnmapIoSpaceATSZIO64.sysZwMapViewOfSection/ZwUnmapViewOfSection/MmGetPhysicalAddres...

做一个快乐学习者 7940

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

PsSetCreateProcessNotifyRoutine监控进程创建

PsSetCreateProcessNotifyRoutine函数用来注册一个进程创建的回调函数,当有新从进程被创建时,就把父进程的ID,和子进程(被创建的进程)ID传给回调函数,通过回调函数,可以监控新创建的进程 NTSTATUS PsSetCreateProcessNotifyRoutine( _In_ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRouti...

Sven的忘却日记 5930

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[原创]通过PsSetCreateProcessNotifyRoutineEx和PsSetCreateThreadNotifyRoutine实现进程与线程监控

PsSetCreateProcessNotifyRoutineEx是Windows提供得一个可以通过设置回调函数实现进程监控的内核API。其在文档的定义如下: 1 2 3 4 5 NTSTATUS PsSetCreateProcessNotifyRoutineEx( INPCREATE_PROCESS_NOTIFY_ROUTINE_EXNotifyRoutine, INBOOLEAN...

追逐光芒,追随内心 2356

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

PsSetCreateProcessNotifyRoutine妙用

最近要做一个进程监控的程序,功能很简单,就是创建和退出进程的时候,能触发我们的事件。首先的第一想法,是Hook ZwCreateProcess,结果调试的时候发现,很多创建进程的动作,并没有通过这个API执行,所以自然就是没办法监控进程的创建,于是回到本质,从创建进程的动作过程来分析,创建新的进程,其大致要经历以下步骤:(1)打开可执行文件,以FILE_EXECUTE权限打开;(2)将

yushiqiang1688的专栏 1万+

驱动开发:内核监控进程与线程创建

监控进程的启动与退出可以使用 `PsSetCreateProcessNotifyRoutineEx` 来创建回调,当新进程产生时,回调函数会被率先执行,然后执行我们自己的`MyCreateProcessNotifyEx`函数,并在内部进行打印输出。而检测线程操作与检测进程差不多,检测线程需要调用`PsSetCreateThreadNotifyRoutine` 创建回调函数,然后就可以检测线程的创建了。

微软技术分享 1万+

IoCreateNotificationEvent 中文翻译

IoCreateNotificationEvent 该例程创建或者打开一个命名的通知事件用于通知一个或多个线程一个事件已经发生. PKEVENT  IoCreateNotificationEvent( IN PUNICODE_STRING EventName,   指向一个以NULL结尾的UNICODE字符串,该字符串包含事件的名称 OUT PHANDLE EventHandle

cosseen的专栏 1552

64位下使用回调函数实现监控(上)

在32位的系统下,我们想要实现某些监控十分简单,只需要找到对应的API实现挂钩操作即可检测进程。但在64位系统下随着的引入,导致我们如果继续使用挂钩API的方式进行监控会出现不可控的情况发生。微软也考虑到了用户程序的开发,所以开放了方便用户调用的系统回调API函数,在64位系统下的监控,使用系统回调相对于直接hook的方式往往是更值得青睐的一方。

星星我啊,已经很努力在学习了, 有人一起学习吗?Ziansec-1 1348

应用程序与驱动程序交互函数DeviceIoControl详解

这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL(DeviceIoControl函数会产生此IRP),MinorFunction 为自己定义的控制码的IRP,系统就调用相应的处理IRP_MJ_DEVICE_CONTROL的派遣函数,你在派遣函数中判断Mi...

zz_strive_2012的专栏 3210
上一篇: 使用RTL-8139网卡制作硬盘还原卡
下一篇: 一个驱动木马的分析
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值