逆向一个直接IO硬盘的驱动

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

【文章标题】: 逆向一个直接IO硬盘的驱动
【文章作者】: prince
【作者邮箱】: cracker_prince@163.com
【作者QQ号】: 812937
【软件名称】: SectorOperator.sys
【下载地址】: http://bbs.pediy.com/showthread.php?s=&threadid=30708
【加壳方式】: 无
【编写语言】: ---
【使用工具】: IDA 5.0
【操作平台】: WINDOWS XP
【软件介绍】: 利用驱动直接IO硬盘
【作者声明】: 水平有限,了解不多,仅作参考。
--------------------------------------------------------------------------------
【前言】
  对直接IO硬盘比较感兴趣,找到了这个程序看了看,作者的办法有限制,只能正确操作第1-63个sector,原因未知,希望哪位大侠可以指点一下。现在的硬盘已经逐渐突破了几个级别容量的限制,所以新的协议应该也可以利用来正确IO硬盘,大家可以研究研究。本人纯属入门级选手,所以各位看到有什么解释的不妥或者直接让您喷饭地方,还请不吝赐教,

谢谢。
 
【详细过程】
  IDA载入驱动,可以很清楚地找到关键部分,其他地方见源码:

---------------------------------------------------------------------------
.text:004010F9 ; *************** S U B R O U T I N E ***************************************
.text:004010F9
.text:004010F9 ; Attributes: bp-based frame
.text:004010F9
.text:004010F9 ; int __stdcall sub_4010F9(int,PIRP Irp)
.text:004010F9 sub_4010F9     proc near           ; DATA XREF: start+24o
.text:004010F9
.text:004010F9 var_438       = dword ptr -438h
.text:004010F9 var_434       = byte ptr -434h
.text:004010F9 var_430       = byte ptr -430h
.text:004010F9 var_42C       = dword ptr -42Ch
.text:004010F9 var_22C       = dword ptr -22Ch
.text:004010F9 var_228       = byte ptr -228h
.text:004010F9 var_224       = byte ptr -224h
.text:004010F9 var_220       = dword ptr -220h
.text:004010F9 var_20       = dword ptr -20h
.text:004010F9 var_1C       = dword ptr -1Ch
.text:004010F9 var_18       = dword ptr -18h
.text:004010F9 var_14       = dword ptr -14h
.text:004010F9 var_10       = dword ptr -10h
.text:004010F9 var_C       = dword ptr -0Ch
.text:004010F9 var_8       = dword ptr -8
.text:004010F9 var_4       = dword ptr -4
.text:004010F9 Irp         = dword ptr 0Ch
.text:004010F9
.text:004010F9           push   ebp
.text:004010FA           mov   ebp, esp
.text:004010FC           sub   esp, 438h
.text:00401102           push   ebx
.text:00401103           push   esi
.text:00401104           push   edi
.text:00401105           mov   [ebp+var_18], 0C0000010h ; var_18 = STATUS_INVALID_DEVICE_REQUEST (0xC0000010)
.text:0040110C           mov   eax, [ebp+Irp]
.text:0040110F           mov   ecx, [eax+60h] ; ecx = IrpStack
.text:0040110F                           ; from wdm.h:
.text:0040110F                           ; #define IoGetCurrentIrpStackLocation( Irp ) ( (Irp)->Tail.Overlay.CurrentStackLocation )
.text:00401112           mov   [ebp+var_8], ecx ; var_8 = IrpStack
.text:00401115           mov   edx, [ebp+var_8]
.text:00401118           mov   eax, [edx+0Ch] ; eax = IrpStack->Parameters.DeviceIoControl.IoControlCode
.text:0040111B           mov   [ebp+var_4], eax ; var_4 = dwControlCode
.text:0040111E           mov   ecx, [ebp+Irp]
.text:00401121           mov   edx, [ecx+0Ch] ; edx = Irp->AssociatedIrp.SystemBuffer
.text:00401124           mov   [ebp+var_1C], edx ; var_1C = Irp->AssociatedIrp.SystemBuffer
.text:00401127           mov   eax, [ebp+var_8]
.text:0040112A           mov   ecx, [eax+8]   ; ecx = IrpStack->Parameters.DeviceIoControl.InputBufferLength
.text:0040112D           mov   [ebp+var_14], ecx ; var_14 =
.text:0040112D                           ; IrpStack->Parameters.DeviceIoControl.InputBufferLength
.text:00401130           mov   edx, [ebp+var_8]
.text:00401133           mov   eax, [edx+4]   ; eax =
.text:00401133                           ; IrpStack->Parameters.DeviceIoControl.OutputBufferLength
.text:00401136           mov   [ebp+var_C], eax ; var_C =
.text:00401136                           ; IrpStack->Parameters.DeviceIoControl.OutputBufferLength
.text:00401139           mov   byte ptr [ebp+var_10], 1 ; var_10 = 1
.text:00401139                           ; 读写操作标志
.text:0040113D           mov   ecx, [ebp+var_4] ; ecx = dwControlCode
.text:00401140           mov   [ebp+var_438], ecx ; var_438 = dwControlCode
.text:00401146           cmp   [ebp+var_438], 2220C0h ; dwControlCode == 0x2220c0 ? (写操作)
.text:00401150           jz     short loc_401167 ; 相等则跳走
.text:00401150
.text:00401152           cmp   [ebp+var_438], 2220C4h ; dwControlCode == 0x2220c4 ? (读操作)
.text:0040115C           jz     loc_401216     ; 相等则跳走
.text:0040115C
.text:00401162           jmp   loc_4012C7     ; 直接跳走返回
.text:00401162
.text:00401167 ; ---------------------------------------------------------------------------
.text:00401167
.text:00401167 loc_401167:                   ; CODE XREF: sub_4010F9+57j
.text:00401167           cmp   [ebp+var_14], 202h ; InputBufferLength == 0x202 ?
.text:0040116E           jnz   loc_401211     ; 不相等则跳走返回
.text:0040116E
.text:00401174           cmp   [ebp+var_C], 0 ; OutputBufferLength == 0 ?
.text:00401178           jnz   loc_401211     ; 不相等则跳走返回
.text:00401178
.text:0040117E           mov   edx, [ebp+var_1C]
.text:00401181           mov   [ebp+var_20], edx ; var_20 = Irp->AssociatedIrp.SystemBuffer
.text:00401184           mov   eax, [ebp+var_20]
.text:00401187           mov   cl, [eax]
.text:00401189           mov   [ebp+var_224], cl ; var_224 = SystemBuffer中的数据
.text:0040118F           mov   edx, [ebp+var_20]
.text:00401192           movsx   eax, byte ptr [edx+1] ; 下面的写操作部分不写注释了,参见读过程
.text:00401196           neg   eax
.text:00401198           sbb   eax, eax
.text:0040119A           and   eax, 10h
.text:0040119D           add   eax, 0A0h
.text:004011A2           mov   [ebp+var_228], al
.text:004011A8           mov   esi, [ebp+var_20]
.text:004011AB           add   esi, 2
.text:004011AE           mov   ecx, 80h
.text:004011B3           lea   edi, [ebp+var_220]
.text:004011B9           rep movsd
.text:004011BB           mov   dx, 1F6h
.text:004011BF           mov   al, [ebp+var_228]
.text:004011C5           out   dx, al       ; AT hard disk controller:
.text:004011C5                           ; Drive & Head.
.text:004011C5                           ; Read/Write: bits indicate head, drive for operation
.text:004011C6           mov   dx, 1F2h
.text:004011CA           mov   al, 1
.text:004011CC           out   dx, al       ; AT hard disk controller:
.text:004011CC                           ; Sector count.
.text:004011CC                           ; Read/Write count of sectors for operation
.text:004011CD           mov   dx, 1F3h
.text:004011D1           mov   al, [ebp+var_224]
.text:004011D7           out   dx, al       ; AT hard disk controller:
.text:004011D7                           ; Sector number.
.text:004011D7                           ; Read/Write current/starting logical sector number
.text:004011D8           mov   dx, 1F4h
.text:004011DC           mov   al, 0
.text:004011DE           out   dx, al       ; AT hard disk controller:
.text:004011DE                           ; Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)
.text:004011DF           mov   dx, 1F5h
.text:004011E3           out   dx, al       ; AT hard disk controller:
.text:004011E3                           ; Cylinder low (bits 0-7 of 10-bit cylinder number)
.text:004011E4           mov   dx, 1F7h
.text:004011E8           mov   al, 30h
.text:004011EA           out   dx, al       ; AT hard disk
.text:004011EA                           ; command register:
.text:004011EA                           ; 1?H = Restore to cylinder 0
.text:004011EA                           ; 7?H = Seek to cylinder
.text:004011EA                           ; 2?H = Read sector
.text:004011EA                           ; 3xH = Write sector
.text:004011EA                           ; 50H = Format track
.text:004011EA                           ; 4xH = verify read
.text:004011EA                           ; 90H = diagnose
.text:004011EA                           ; 91H = set parameters for drive
.text:004011EA
.text:004011EB
.text:004011EB loc_4011EB:                   ; CODE XREF: sub_4010F9+F5j
.text:004011EB           in     al, dx       ; AT hard disk
.text:004011EB                           ; status register bits:
.text:004011EB                           ; 0: 1=prev cmd error
.text:004011EB                           ; 2: Corrected data
.text:004011EB                           ; 3: Data Request. Buffer is busy
.text:004011EB                           ; 4: Seek completed
.text:004011EB                           ; 5: Write fault
.text:004011EB                           ; 6: Drive ready (unless bit 4=0)
.text:004011EB                           ; 7: Busy
.text:004011EC           test   al, 8
.text:004011EE           jz     short loc_4011EB
.text:004011EE
.text:004011F0           xor   ecx, ecx
.text:004011F2           mov   cx, 100h
.text:004011F6           lea   esi, [ebp+var_220]
.text:004011FC           mov   dx, 1F0h
.text:00401200           cli
.text:00401201           cld
.text:00401202           rep outsw
.text:00401205           sti
.text:00401206           mov   [ebp+var_18], 0 ; status = NT_SUCCESS (0)
.text:0040120D           mov   byte ptr [ebp+var_10], 0 ; var_10 = 0
.text:0040120D                           ; 表示是写操作
.text:0040120D
.text:00401211
.text:00401211 loc_401211:                   ; CODE XREF: sub_4010F9+75j
.text:00401211                           ; sub_4010F9+7Fj
.text:00401211           jmp   loc_4012C7
.text:00401211
.text:00401216 ; ---------------------------------------------------------------------------
.text:00401216
.text:00401216 loc_401216:                   ; CODE XREF: sub_4010F9+63j
.text:00401216           cmp   [ebp+var_14], 2 ; InputBufferLength == 2 ?
.text:0040121A           jnz   loc_4012C7     ; 不相等则跳走返回
.text:0040121A
.text:00401220           cmp   [ebp+var_C], 200h ; OutputBufferLength == 0x200 ?
.text:00401227           jnz   loc_4012C7     ; 不相等则跳走返回
.text:00401227
.text:0040122D           mov   ecx, [ebp+var_1C] ; ecx = Irp->AssociatedIrp.SystemBuffer
.text:00401230           mov   [ebp+var_22C], ecx ; var_22C = Irp->AssociatedIrp.SystemBuffer
.text:00401236           mov   edx, [ebp+var_22C] ; edx = Irp->AssociatedIrp.SystemBuffer (InputBuffer)
.text:0040123C           mov   al, [edx]     ; edx = *InputBuffer (要读取的扇区号码)
.text:0040123E           mov   [ebp+var_430], al ; var_430 = 目标扇区号
.text:00401244           mov   ecx, [ebp+var_22C]
.text:0040124A           movsx   edx, byte ptr [ecx+1] ; 取InputBuffer的第2个字节 (硬盘号?)
.text:0040124E           neg   edx         ; 取edx补码
.text:00401250           sbb   edx, edx     ; 带借位减法
.text:00401252           and   edx, 10h     ; edx &= 0x10
.text:00401255           add   edx, 0A0h     ; edx += 0xA0
.text:0040125B           mov   [ebp+var_434], dl ;
.text:00401261           mov   al, [ebp+var_434]
.text:00401267           mov   dx, 1F6h     ; 指定0x1f6端口
.text:0040126B           out   dx, al       ; 将计算结果写入0x1f6端口中
.text:0040126B                           ;
.text:0040126B                           ; 1f6h----低四位是起始LBA的bit24-bit27,
.text:0040126B                           ; 第五位是设备选择,0是master,1是slave.
.text:0040126B                           ; 我们读的是master,应设为0,第七位设为1表示使用LBA,
.text:0040126B                           ; 现在硬盘都使用LBA,应置起来。其他两个bit要求为1
.text:0040126B                           ;
.text:0040126B                           ; AT hard disk controller:
.text:0040126B                           ; Drive & Head.
.text:0040126B                           ; Read/Write: bits indicate head, drive for operation
.text:0040126B                           ;
.text:0040126B                           ;
.text:0040126C           mov   al, 1       ; al = 1
.text:0040126E           mov   dx, 1F2h     ; 指定0x1f2端口
.text:00401272           out   dx, al       ; 1f2h----操作的扇区个数
.text:00401272                           ;
.text:00401272                           ; AT hard disk controller:
.text:00401272                           ; Sector count.
.text:00401272                           ; Read/Write count of sectors for operation
.text:00401272                           ;
.text:00401272                           ;
.text:00401273           mov   al, [ebp+var_430] ; al = 目标扇区号
.text:00401279           mov   dx, 1F3h     ; 1f3h----起始LBA的bit0-bit7
.text:0040127D           out   dx, al       ; 设置目标扇区号
.text:0040127D                           ;
.text:0040127D                           ; AT hard disk controller:
.text:0040127D                           ; Sector number.
.text:0040127D                           ; Read/Write current/starting logical sector number
.text:0040127D                           ;
.text:0040127D                           ;
.text:0040127E           xor   al, al       ; al = 0
.text:00401280           mov   dx, 1F4h     ; 1f4h----起始LBA的bit8-bit15
.text:00401284           out   dx, al       ; AT hard disk controller:
.text:00401284                           ; Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)
.text:00401284                           ;
.text:00401284                           ;
.text:00401285           mov   dx, 1F5h     ; 1f5h----起始LBA的bit16-bit23
.text:00401289           out   dx, al       ; AT hard disk controller:
.text:00401289                           ; Cylinder low (bits 0-7 of 10-bit cylinder number)
.text:00401289                           ;
.text:00401289                           ;
.text:0040128A           mov   al, 20h       ; al = 0x20
.text:0040128C           mov   dx, 1F7h     ; 1F7 disk 0 status
.text:00401290           out   dx, al       ; AT hard disk
.text:00401290                           ; command register:
.text:00401290                           ; 1?H = Restore to cylinder 0
.text:00401290                           ; 7?H = Seek to cylinder
.text:00401290                           ; 2?H = Read sector
.text:00401290                           ; 3xH = Write sector
.text:00401290                           ; 50H = Format track
.text:00401290                           ; 4xH = verify read
.text:00401290                           ; 90H = diagnose
.text:00401290                           ; 91H = set parameters for drive
.text:00401290
.text:00401291
.text:00401291 loc_401291:                   ; CODE XREF: sub_4010F9+19Bj
.text:00401291           in     al, dx       ; 读取0x1f7端口数据
.text:00401291                           ;
.text:00401291                           ; AT hard disk
.text:00401291                           ; status register bits:
.text:00401291                           ; 0: 1=prev cmd error
.text:00401291                           ; 2: Corrected data
.text:00401291                           ; 3: Data Request. Buffer is busy
.text:00401291                           ; 4: Seek completed
.text:00401291                           ; 5: Write fault
.text:00401291                           ; 6: Drive ready (unless bit 4=0)
.text:00401291                           ; 7: Busy
.text:00401292           test   al, 8       ; 是否完成?
.text:00401294           jz     short loc_401291
.text:00401294
.text:00401296           xor   ecx, ecx     ; ecx = 0
.text:00401298           mov   cx, 100h     ; cx = 0x100
.text:0040129C           mov   dx, 1F0h     ; 1F0--存有结果数据
.text:004012A0           lea   edi, [ebp+var_42C]
.text:004012A6           cli               ; 关中断
.text:004012A7           cld               ; 清除方向标志
.text:004012A7                           ;
.text:004012A8           rep insw          
.text:004012A8                           ;
.text:004012AB           sti               ; 开中断
.text:004012AC           mov   ecx, 80h     ; ecx = 0x80
.text:004012B1           lea   esi, [ebp+var_42C] ; esi指向读出的数据
.text:004012B7           mov   edi, [ebp+var_1C] ; var_1C = Irp->AssociatedIrp.SystemBuffer
.text:004012BA           rep movsd           ; 将数据拷贝到SystemBuffer中
.text:004012BC           mov   [ebp+var_18], 0 ; status = NT_SUCCESS (0)
.text:004012C3           mov   byte ptr [ebp+var_10], 1 ; var_10 = 1
.text:004012C3                           ; 表示是读操作
.text:004012C3
.text:004012C7
.text:004012C7 loc_4012C7:                   ; CODE XREF: sub_4010F9+69j
.text:004012C7                           ; sub_4010F9:loc_401211j
.text:004012C7                           ; sub_4010F9+121j
.text:004012C7                           ; sub_4010F9+12Ej
.text:004012C7           cmp   [ebp+var_18], 0 ; 判断操作是否成功?
.text:004012CB           jnz   short loc_4012E4 ; 不成功则跳走
.text:004012CB
.text:004012CD           mov   eax, [ebp+var_10] ; eax = var_10
.text:004012CD                           ; 根据读写操作设置Information长度
.text:004012D0           and   eax, 0FFh
.text:004012D5           neg   eax
.text:004012D7           sbb   eax, eax
.text:004012D9           and   eax, 200h
.text:004012DE           mov   ecx, [ebp+Irp]
.text:004012E1           mov   [ecx+1Ch], eax ; 指定拷贝到User buffer的buffer size
.text:004012E1                           ; Irp->IoStatus.Information =
.text:004012E1
.text:004012E4
.text:004012E4 loc_4012E4:                   ; CODE XREF: sub_4010F9+1D2j
.text:004012E4           mov   edx, [ebp+Irp]
.text:004012E7           mov   eax, [ebp+var_18]
.text:004012EA           mov   [edx+18h], eax ; Irp->IoStatus.Status = status
.text:004012ED           xor   dl, dl       ; PriorityBoost
.text:004012EF           mov   ecx, [ebp+Irp] ; Irp
.text:004012F2           call   ds:IofCompleteRequest ; complete Irp
.text:004012F8           mov   eax, [ebp+var_18] ; 返回status
.text:004012FB           pop   edi
.text:004012FC           pop   esi
.text:004012FD           pop   ebx
.text:004012FE           mov   esp, ebp
.text:00401300           pop   ebp
.text:00401301           retn   8
.text:00401301
.text:00401301 sub_4010F9     endp


--------------------------------------------------------------------------------
【总结】
    以上是很清晰的0x1f0 - 0x1f7的端口操作过程,未列出的端口或者想了解更详细的信息请自己Google吧。
   源代码见附件。

硬盘篇1-IDE硬盘的直接IO

对硬盘进行操作的常用端口是1f0h~1f7h号端口,各端口含义如下:
端口号 读还是写 具体含义
1F0H 读/写 用来传送读/写的数据(其内容是正在传输的一个字节的数据)
1F1H 读 用来读取错误码
1F2H 读/写 用来放入要读写的扇区数量
1F3H 读/写 用来放入要读写的扇区号码
1F4H 读/写 用来存放读写柱面的低8位字节
1F5H 读/写 用来存放读写柱面的高2位字节(其高6位恒为0)
1F6H 读/写 用来存放要读/写的磁盘号及磁头号
第7位 恒为1
第6位 恒为0
第5位 恒为1
第4位 为0代表第一块硬盘、为1代表第二块硬盘
第3~0位 用来存放要读/写的磁头号
1f7H 读 用来存放读操作后的状态
第7位 控制器忙碌
第6位 磁盘驱动器准备好了
第5位 写入错误
第4位 搜索完成
第3位 为1时扇区缓冲区没有准备好
第2位 是否正确读取磁盘数据
第1位 磁盘每转一周将此位设为1,
第0位 之前的命令因发生错误而结束
写 该位端口为命令端口,用来发出指定命令
为50h 格式化磁道
为20h 尝试读取扇区
为21h 无须验证扇区是否准备好而直接读扇区
为22h 尝试读取长扇区(用于早期的硬盘,每扇可能不是512字节,而是128字节到1024之间的值)
为23h 无须验证扇区是否准备好而直接读长扇区
为30h 尝试写扇区
为31h 无须验证扇区是否准备好而直接写扇区
为32h 尝试写长扇区
为33h 无须验证扇区是否准备好而直接写长扇区
注:当然看完这个表你会发现,这种读写端口的方法其实是基于磁头、柱面、扇区的硬盘读写方法,不过大于8G的硬盘的读写方法也是通过端口1F0H~1F7H来实现的^_^

 

逆向一个基于驱动的恶意程序 本程序发现于机器狗变种病毒释放恶意程序的下载列表中:穿透还原系统后的机器狗病毒在机器启动后会从指定网址下载多个恶意程序,本程序即其中之一,其功能为通过底层键盘过滤方式盗取用户键盘输入信息。因程序使用了底层键盘过滤技术,故而可记录大部分软件的键盘输入,包括网游、QQ、邮箱的帐户输入信息等。 一、原理:     此程序随系统进程internat.exe启动而被执行,程序通过加载自身资源里的两个驱动来隐 阅读详情

相关推荐

构建逆向分析专用虚拟机:从平台选型到实战配置全指南

虚拟化技术通过创建隔离的软件模拟计算机环境,为核心原理。它利用宿主机硬件资源,通过虚拟机监控器(VMM)实现多个操作系统实例的并行运行与资源调度。这项技术的核心价值在于为软件测试、安全研究和开发部署提供了安全、可复现且资源可控的沙箱环境。在网络安全领域,这尤其关键,例如进行恶意软件分析或漏洞研究时,一个隔离的**虚拟机**环境能有效防止对宿主系统的污染和攻击。**逆向工程**作为安全分析的核心手段,常常需要动态运行和调试未知或可疑的二进制文件。因此,一个专为逆向分析优化的虚拟机,通过精心配置的**工具链**

weixin_30825581的博客 388

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

驱动开发

AppWhite_Star的博客 1431

Win10硬盘分区后盘符出现黄色感叹号?别慌,这是BitLocker在‘待机’,教你两步彻底关闭它

本文详细解析了Win10硬盘分区后盘符出现黄色感叹号的原因,指出这是BitLocker加密功能的待机状态。提供了通过控制面板和命令行两种方法彻底关闭BitLocker的步骤,帮助用户解决这一常见问题,同时确保数据安全。

weixin_30839881的博客 594

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

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

被遗弃的庸才博客 3197

QMCDecode:逆向解析QQ音乐QMC加密格式,实现音频跨平台播放

音频加密技术是数字版权管理(DRM)的核心手段之一,旨在保护音乐、有声书等内容在分发过程中的版权。其基本原理是通过特定算法对原始音频数据进行混淆或加密,使其只能在授权平台或设备上解码播放。从技术价值看,加密平衡了版权方利益与内容传播需求,但也带来了用户跨平台使用的壁垒。在实际应用场景中,用户常遇到已下载的加密音频无法在其他播放器或设备上播放的问题,这催生了针对特定加密格式的逆向工程解决方案。本文聚焦于QQ音乐广泛使用的QMC系列加密格式,深入探讨其流混淆(Stream Obfuscation)原理,并详细介

读书、思考、生活 478

游戏美术资源逆向分析:从AssetStudio解包到Blender重构的完整工作流

在游戏开发和数字内容创作领域,逆向工程是一种深度解构技术,它允许开发者通过解析游戏资源文件来研究其内部结构和实现原理。这项技术的核心在于理解资源封装格式和序列化机制,通过工具链对压缩或加密的资产进行提取与转换。从技术价值看,逆向分析为美术师和技术美术提供了直接的工业级案例参考,能够量化学习顶级作品的模型拓扑、UV拆分、材质着色等具体实现,极大提升了学习效率和实践深度。在应用场景上,它主要服务于个人学习研究、技术方案验证以及合规的二次创作,例如将提取的模型在Blender中重新拓扑、在Substance Pa

weixin_34357887的博客 453

初学驱动逆向,笔记一。

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

Diomedes's Place 2059

Windows内核驱动开发:深入解析I/O请求包(IRP)处理机制与实战

在操作系统内核开发中,I/O(输入/输出)子系统是连接用户应用程序与硬件设备的核心桥梁,其设计直接决定了系统的性能与稳定性。其基本原理是通过统一的抽象接口(如虚拟文件操作)屏蔽底层硬件差异,由I/O管理器将用户请求转化为标准化的内核对象进行处理。这一机制的技术价值在于实现了高效、安全的数据传输与设备控制,是构建文件系统、网络协议栈及各类设备驱动的基础。在Windows平台,该机制的具体实现依赖于两个核心概念:驱动程序对象与设备对象,以及贯穿始终的I/O请求包(IRP)。IRP作为I/O请求的载体,其生命周期

weixin_30633405的博客 399

【driver】Windows 内核与驱动

内核空间与内核模块 内核空间 内核空间: 每个进程拥有4GB的独立的内存空间,在低2G是不同的,但是高2G内存空间对于所有的进程来说都是相同的。 内核模块 每个驱动程序每一个都是一个模块,称为”内核模块“,都可以加载到内核中,遵守PE结构。但是本质上讲,任意一个.sys文件与内核文件没有区别。 内核并不是一个孤立的整体,而是由多个模块一起组成的。比如我们逆向的ntoskrnl.exe文件,其实也只是其中的一个模块,我们自己编译的sys文件也是,但是并不是每一个模块都对应着一块驱动,比如安全人员写的驱动

dr0op's blog 1165

QClaw:微信协议级桥接工具,零逆向实现大模型直连微信

微信私有协议长期是AI接入的高壁垒,开发者需逆向TLS、解析Protobuf、维护登录态,俗称‘啃小龙虾’。QClaw作为轻量级本地协议网关,不依赖itchat或OpenClaw等逆向工程,而是以合法客户端身份直连微信PC版标准通道,将加密二进制流实时翻译为结构化JSON事件(如message、file_received、mini_program),并支持反向指令下发。其核心价值在于剥离协议复杂性,提供开箱即用的HTTP Webhook接口与REST API,使LLM可直接感知微信上下文、毫秒级响应私聊/群

weixin_33735077的博客 528

IDA Pro大文件逆向分析性能优化:从内存管理到实战调优

在软件逆向工程领域,处理大型二进制文件时,性能优化是提升分析效率的核心挑战。其本质是内存管理问题,涉及物理内存、虚拟内存与磁盘I/O之间的高效协同。理解内存交换机制与进程地址空间管理原理,对于构建稳定的分析环境至关重要。从技术价值看,优化能显著缩短分析时间,降低工具崩溃风险,提升逆向工程的工作流可靠性。应用场景广泛覆盖固件分析、游戏模块逆向、大型商业软件剖析等。本文聚焦于IDA Pro这一主流逆向工具,针对其处理大文件时的卡顿问题,系统阐述了从硬件配置、系统参数到软件内部设置的全链路优化方案,特别是通过调整

weixin_30784501的博客 427

逆向快速入门

内核的基本操作,多线程和数据结构 内核的基本操作 UNICODE_STRING 为什么字符串很重要 大型工程中10%~20%的代码都与字符串操作有关 面试里面也有很多字符串相关问题 字符串涉及到指针操作 字符串是编程第二个重要关口 字符串分两类:0结尾和非零结尾 char * 在c语言中使用,以‘\0’

1976

Intel RST 14.5.0.1081驱动包(Win10 64位),适配Ab initio量子化学计算存储需求

这个Intel Rapid Storage Technology驱动版本专为Windows 10 64位系统打包,核心文件包括SetupRST.exe安装程序和mup.xml配置文件,重点优化了在Ab initio类量子化学计算环境下的存储表现。驱动支持NVMe与SATA混合阵列识别,稳定对接Intel芯片组平台,在高精度、高吞吐量的本地计算任务中提升I/O响应效率。安装后可启用RST控制台进行RAID状态监控、硬盘健康检查、固件级缓存策略配置等操作,适用于需要频繁读写大型分子轨道数据、电子密度矩阵或波函数

defi6farmer的博客 263

Unity资源逆向利器uTinyRipper:解包、降级与资源迁移实战指南

在Unity开发与资源管理中,资源序列化格式的兼容性问题常成为开发者的痛点。Unity引擎将资源序列化为平台相关的二进制或YAML格式,不同版本间的格式差异导致项目无法直接跨版本打开。uTinyRipper作为一款开源逆向工程工具,通过深度解析Unity的类型树(TypeTree)与元数据,重建对象ID与引用关系,实现了对资源数据块的精确读取与格式转换。其技术价值在于打破了资源黑盒,使开发者能够解析、提取和转换各类Unity资源文件,无论其来自哪个版本或是否已打包为AssetBundle。在应用场景上,它广

weixin_34060741的博客 322

若依框架整合Flowable:从零构建企业级流程中心

本文详细介绍了如何将若依框架与Flowable工作流引擎整合,构建企业级流程中心。通过环境配置、依赖添加、数据库设置等核心步骤,实现流程定义管理、任务处理服务等关键功能,并结合实际案例展示请假审批流程的实现与动态表单集成。文章还提供了性能优化和生产建议,帮助开发者高效构建稳定可靠的工作流系统。

weixin_28365523的博客 230

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3016

6.基础IO【由浅入深-Linux】

为了让程序员不用去记那些繁琐的数值,系统头文件中预定义了一堆宏。为了方便演示,我们用简化的 8 位二进制来模拟;下面的数值只是教学模拟,不是 Linux 中这些宏的真实取值假设的简化版底层宏定义 (每个宏只有 1 个比特位是 1,其余全是 0)1// 二进制: 0000 00012// 二进制: 0000 00104// 二进制: 0000 01008。

插花弄玉的博客 406

从0到1搭建StarRocks3.4.1存算一体架构(VM 虚拟机版)

本文详细介绍了如何在VM虚拟机上从零搭建StarRocks 3.4.1存算一体架构。首先阐述了StarRocks作为高性能分布式SQL数据仓库的优势,重点讲解了其存算一体架构的设计原理。随后提供完整的安装指南,包括环境准备(3台CentOS 8虚拟机配置)、网络互通验证、Java环境配置、软件包解压安装等关键步骤。文章特别详细说明了FE和BE节点的配置文件修改(fe.conf和be.conf)以及必要的防火墙端口开放配置。通过图文并茂的方式,帮助开发者和运维人员快速掌握StarRocks集群部署方法,为后续

小 tom的博客 1334

现场实录:一次PLC通信超时导致的停机事故,我是如何用日志逆向定位并修复的

现场实录:PLC通信超时导致产线停机,我用日志逆向定位并修复的完整过程

weixin_47236438的博客 441

相场断裂模型中的各向异性机制:从裂纹密度到驱动力的数值实现

断裂力学是研究材料在载荷作用下裂纹萌生与扩展规律的基础学科,其核心在于理解材料失效的能量准则与路径选择。传统方法通常预设裂纹路径,而相场断裂模型通过引入连续的相场变量,将裂纹模拟转化为一个能量最小化问题,能够自发预测裂纹的萌生、扩展与分叉,在工程失效分析中具有重要价值。当材料具有显著的方向依赖性时,如单晶、复合材料或轧制金属板,各向同性假设会失效,此时需引入各向异性机制。该机制的核心在于改造两个关键部分:一是裂纹密度函数,通过引入各向异性张量来定义不同方向上形成裂纹微结构的能量成本;二是临界能量释放率(断裂

weixin_31421613的博客 298

利用正射影像对斜射图像进行反向投影

因此,RANSAC算法可以通过计算inliners和outliers的数量来评估估计关键点的质量,确保与其他点不一致的点不会在Homography矩阵中被估计。然后,它通过考虑关键点周围区域中图像的梯度大小和方向来计算每个提取的关键点的方向。由于单应性矩阵的计算可能会受到两个图像中异常值的存在的影响,这将导致矩阵的不正确估计并导致沿图像的对准和映射不良。FLANN匹配器的方法基于K近邻搜索的概念,即从图像中找到k个近邻。找到相机在正射影像坐标系中的位置并在正射影像上绘制重叠区域的边界框。

gis收藏家的博客 1513

【硬核逆向】混合型病毒核心原理深度拆解:双中断适配技术与完整传染发作流程全景解析

📑 目录导航"引言:为什么混合型病毒是“病毒之王”?""基石回顾:INT 13H 与 INT 21H 的“楚河汉界”""核心难点:为何不能简单线性叠加?""灵魂技术:双中断适配与无缝衔接机制""全景复盘:完整传染发作流程图级解析""实战代码:从驻留到挂钩的汇编实现""经典案例:One_Half 与 CIH 的混合基因""攻防博弈:检测、清除与常见误区""现代启示:从 DOS 混合病毒到 UEFI Bootkit""FAQ 与扩展阅读"在计算机安全的教科书中,病毒通常被分为引导型、文件型和混合型三类。前两者

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 277

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481
上一篇: 一份非常棒的inline hook 代码
下一篇: 比较流行的数据库挂马
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值