xp的viostor驱动无法获取磁盘序列号的分析

        深信服的viostor驱动在获取序列号的时候,多了一个IDE处理的代码,位置在+1128处。它会在刚开机加载viostor.sys时机被调用,然后去读取注册表HKLM\\SYSTEM\CurrentControlSet\Services\viostor\Parameters的IDESNCompat,若为1则有此功能,若未0则不会得到正确的磁盘序列号。相关调用栈回溯是:

对DriverEntry逆向,如下处有调用isIDESerialNumber。

NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
  NTSTATUS v2; // esi
  char v3; // al
  struct _HW_INITIALIZATION_DATA HwInitializationData; // [esp+8h] [ebp-58h] BYREF
  char v6; // [esp+44h] [ebp-1Ch]
  __int16 v7; // [esp+46h] [ebp-1Ah]
  char *v8; // [esp+48h] [ebp-18h]
  __int16 v9; // [esp+4Eh] [ebp-12h]
  char *v10; // [esp+50h] [ebp-10h]
  int (__stdcall *v11)(PVOID, int, int); // [esp+54h] [ebp-Ch]
  char v12[8]; // [esp+58h] [ebp-8h] BYREF

  qmemcpy(v12, "10011AF4", sizeof(v12));
  dword_14630 = (int)DriverObject;
  sub_12252(DriverObject, RegistryPath);
  byte_1465C = RegistryPath == 0;
  memset(&HwInitializationData, 0, 0x50u);
  v7 = 4;
  v8 = &v12[4];
  v9 = 4;
  v10 = v12;
  HwInitializationData.HwInitializationDataSize = 80;
  HwInitializationData.DeviceExtensionSize = (ULONG)sub_112A8;
  HwInitializationData.HwReceivePacket = (PHW_RECEIVE_DEVICE_SRB)sub_1149A;
  HwInitializationData.HwCancelPacket = (PHW_CANCEL_SRB)CancelPkt_1D70;
  HwInitializationData.HwRequestTimeoutHandler = (PHW_REQUEST_TIMEOUT_HANDLER)sub_115C4;
  HwInitializationData.PerRequestExtensionSize = (ULONG)sub_10EC4;
  v11 = sub_116EC;
  v6 = 1;
  *(_DWORD *)&HwInitializationData.BusMasterDMA = 1592;
  *(_DWORD *)&HwInitializationData.TurnOffSynchronization = 2200;
  HwInitializationData.HwInterrupt = (PHW_INTERRUPT)5;
  HwInitializationData.DmaBufferSize = 1;
  HwInitializationData.NameExtensionArray = (PWCHAR *)16843009;
  v2 = ScsiPortInitialize(DriverObject, RegistryPath, &HwInitializationData, 0);
  v3 = isIDESerialNumber_1128();

GetIdeFormatSerialNumber是因为DriverEntry里注册了函数sub_11D70而后被调用。调用时机也是发生在刚开机viostor刚载入时。调用时的相关栈回溯如下:

GetIdeFormatSerialNumber的反编译如下:

_BYTE *__stdcall GetIdeFormatSerialNumber(_BYTE *P)
{
  unsigned int v1; // esi
  _BYTE *result; // eax
  int Length; // eax
  _BYTE *PoolWithTag; // edi
  int v5; // eax
  int v6; // eax
  char DstBuf; // [esp+Ch] [ebp-Ch] BYREF
  int v8; // [esp+Dh] [ebp-Bh]
  unsigned int v9; // [esp+14h] [ebp-4h] BYREF

  v1 = 0;
  DstBuf = 0;
  v8 = 0;
  v9 = 0;
  if ( !P )
    return 0;
  Length = RtlStringCchLength((int)P, 0x14u, &v9);
  if ( Length < 0 )
  {
    DbgPrint("GetIdeFormatSerialNumber failed in RtlStringCchLength:%x", Length);
    return 0;
  }
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPool, 0x28u, 'SEDI');
  if ( !PoolWithTag )
  {
    DbgPrint("GetIdeFormatSerialNumber ExAllocateWithTage failed.\n");
    return 0;
  }
  memset(PoolWithTag, 0, 0x28u);
  if ( v9 )
  {
    while ( v1 + 1 < v9 )
    {
      v5 = RtlStringCchPrintf(&DstBuf, 5, "%2x%2x", (char)P[v1 + 1], (char)P[v1]);
      if ( v5 < 0 )
        goto LABEL_16;
      v6 = sub_1119E(PoolWithTag, 40, &DstBuf);
      if ( v6 < 0 )
        goto LABEL_18;
      v1 += 2;
      if ( v1 >= v9 )
        break;
    }
  }
  if ( v1 + 1 == v9 )
  {
    v5 = RtlStringCchPrintf(&DstBuf, 5, "%2x", (char)P[v1]);
    if ( v5 < 0 )
    {
LABEL_16:
      DbgPrint("GetIdeFormatSerialNumber failed in RtlStringCbPrintf:%x", v5);
    }
    else
    {
      BYTE1(v8) = 0;
      v6 = sub_1119E(PoolWithTag, 40, &DstBuf);
      if ( v6 >= 0 )
        goto LABEL_15;
LABEL_18:
      DbgPrint("GetIdeFormatSerialNumber failed in RtlStringCbCat:%x", v6);
    }
    ExFreePoolWithTag(PoolWithTag, 'SEDI');
    return 0;
  }
LABEL_15:
  result = PoolWithTag;
  PoolWithTag[39] = 0;
  return result;
}

开源代码里面没有IDE处理代码,只有一种逻辑

初步看GetIdeFormatSerialNumber和isIDESerialNumber都比较简单,基本没有用到全局变量,应该可以直接抄反编译代码。因为我没有编译出xp版本viostor的环境,所以没法做实验了。

通过DeviceIoControl(SMART_RCV_DRIVE_DATA)来查询磁盘序列号。若采用深信服的viostor.sys,则可查询到outputbuffer+0x24处是正确的磁盘序列号文字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十四节TypeScript 联合类型

1、简介 联合类型可以通过管道&#xff08;|&#xff09;将变量设置多种类型&#xff0c;赋值时可以根据设置的类型来赋值。 注意&#xff1a;只能赋值指定的类型&#xff0c;如果赋值其它类型就会报错的。 2、创建联合类型的语法格式&#xff1a; Type1|Type2|Type3 实例&a…

【PostGIS】PostgreSQL15+对应PostGIS安装教程及空间数据可视化

一、PostgreSQL15与对应PostGIS安装 PostgreSQL15安装&#xff1a;下载地址PostGIS安装&#xff1a;下载地址&#xff08;选择倒数第二个&#xff09; 1、PostgreSQL安装 下载安装包&#xff1b;开始安装&#xff0c;这里使用默认安装&#xff0c;一直next直到安装完成&…

小狐狸ChatGPT系统 不同老版本升级至新版数据库结构同步教程

最新版2.6.7下载&#xff1a;https://download.csdn.net/download/mo3408/88656497 小狐狸GPT付费体验系统如何升级&#xff0c;该系统更新比较频繁&#xff0c;也造成了特别有用户数据情况下升级时麻烦&#xff0c;特别针对会员关心的问题出一篇操作教程&#xff0c;本次教程…

WT2605C高品质音频蓝牙语音芯片:外接功放实现双声道DAC输出的优势

在音频处理领域&#xff0c;双声道DAC输出能够提供更为清晰、逼真的音效&#xff0c;增强用户的听觉体验。针对这一需求&#xff0c;唯创知音的WT2605C高品质音频蓝牙语音芯片&#xff0c;通过外接功放实现双声道DAC输出&#xff0c;展现出独特的应用优势。 一、高品质音频处理…

Java 并发编程(八)-异步编程-CompletableFuture

目录 一、异步编程 1、CompletableFuture应用 1.1、CompletableFuture介绍 1.2、CompletableFuture应用 1.2.1、supplyAsync 1.2.2、runAsync 1.2.3、thenApply&#xff0c;thenApplyAsync 1.2.4、thenAccept&#xff0c;thenAcceptAsync 1.2.5、thenRun&#xff0c;t…

原来电脑并不需要重装系统才能恢复出厂设置,这个操作学起来!

前言 小伙伴们应该都知道手机上有恢复出厂设置的功能&#xff0c;如果想要把手机送给朋友或者卖给别人&#xff0c;就会先恢复出厂设置。 但换到Windows电脑上之后&#xff0c;如果出现同样的情况&#xff0c;就会第一时间想到重装系统。就好像Windows电脑上不存在恢复出厂设…

【教学类-42-01】20231224 X-Y 之间加法题判断题1.0(加法是否正确,写出正确答案)

作品展示&#xff1a; 背景需求&#xff1a; 很多大班孩子很熟练做“0-5&#xff0c;0-10的加法、或减法题目&#xff0c;需要新的题型来换花样。除了”比大小“&#xff0c;我能想起的就是”判断加法题答案是否正确。 WORD模板 代码展示&#xff1a; X-Y 之间的所有加法题的…

Pytorch项目(模型训练与优化),肺癌检测项目之六

数据优化方案 数据优化方案1&#xff1a;重复抽样 &#xff08;1&#xff09;对多数类的样本实施欠采样&#xff0c;减少多数类数量 &#xff08;2&#xff09;对少数类的样本实施过采样&#xff0c;增加少数类数量 数据优化方案2&#xff1a;数据增强 数据增强&#xff08…

IntelliJ IDEA 2023.3 最新版如何如何配置?IntelliJ IDEA 2023.3 最新版试用方法

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Vue 在同一个项目中,判断pc端和移动端,显示不同风格的页面(附pc端移动端显示效果图)

实现思路 1、修改index.html页面的meta 2、增加pc端移动端的判断 3、设置路由&#xff0c;根据不同的端&#xff0c;调用各自的路由&#xff0c;显示不同的页面 index.html 修改如下 <meta name"viewport" content"widthdevice-width,initial-scale1.0,minim…

智能算法(GA、DBO等)求解阻塞流水车间调度问题(BFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

[VScode]Jupyter自动生成目录

用到插件Jupyter TOC 插件主页有一张动图介绍这个功能怎么用&#xff1a; 点击标签页面&#xff0c;右上角3个点那个位置&#xff0c;不是正文里单元格的右上角&#xff1b; 选Generate table of contents就可以自动生成目录 VScode 还有好多好多功能等待你发现呢&#xff0…

大数据深度学习朴素贝叶斯深度解码:从原理到深度学习应用

大数据深度学习朴素贝叶斯深度解码&#xff1a;从原理到深度学习应用 文章目录 大数据深度学习朴素贝叶斯深度解码&#xff1a;从原理到深度学习应用一、简介贝叶斯定理的历史和重要性定义例子 朴素贝叶斯分类器的应用场景定义例子常见应用场景 二、贝叶斯定理基础条件概率定义…

Java研学-HTTP 协议

一 概述 1 概念和作用 概念&#xff1a;HTTP 是 HyperText Transfer Protocol (超文本传输协议)的简写&#xff0c;它是 TCP/IP 协议之上的一个应用层协议。简单理解就是 HTTP 协议底层是对 TCP/IP 协议的封装。   作用&#xff1a;用于规定浏览器和服务器之间数据传输的格式…

人工智能轨道交通行业周刊-第69期(2023.12.11-12.24)

本期关键词&#xff1a;集装箱智能管理、智慧工地、智能应急机器人、车辆构造、大模型推理 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨…

安洵杯 re + 其他部分题解

第11&#xff0c;比较小丑&#xff0c;差了一步队伍wp应该会发吧&#xff0c;不知道&#xff0c;我先放点跟我有关系的 Re mobilego so的check看了一会比较南崩&#xff0c;但是看flag的密文形式很像简单位置替换所以直接输编码表&#xff0c;jeb动调然后得到替换表解密就行…

[c]扫雷

题目描述 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。 玩家翻开一个非地雷格时&#xff0c;该格将会出现一个数字——提示周围格子中…

C语言沉浸式刷题【C语言必刷题】

1.猜凶手 某地发生了一起谋杀案&#xff0c;警察通过排查确定杀人凶手必为四个嫌疑犯的一个&#xff0c;以下是4个嫌犯的供词。已知&#xff08;请编写代码找出凶手&#xff09; A说&#xff1a;不是我。 B说&#xff1a;是C。C说&#xff1a;是D。D说&#xff1a;C再胡说。 程…

PCIe surprise down异常与DPC功能分析-part2

DPC是PCIe协议中的一项功能&#xff0c;旨在防止由于一个设备的错误而影响到整个系统。当一个PCIe设备检测到严重的、不可恢复的错误时&#xff0c;它可能会触发DPC过程。在这个过程中&#xff0c;PCIe开关会隔离受影响的下游端口&#xff0c;阻止任何进一步的数据传输和请求通…

百分百能遇到的接口自动化测试面试题,看完的现在已经在办理入职了...

1. 什么是接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试是指使用自动化工具对接口进行测试&#xff0c;验证接口的正确性、稳定性和性能等方面的指标。 2. 为什么要进行接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试可以提高测试效率&#xff0c;减…