首页
社区
课程
招聘
[求助]请高手老师改进拦截硬盘序列号程序的兼容性
发表于: 2010-11-8 22:18 26483

[求助]请高手老师改进拦截硬盘序列号程序的兼容性

2010-11-8 22:18
26483
该程序是咱们论坛前辈编写的程序,用来拦截应用程序读取硬盘物理序列号,发现只要是通过仅使用硬盘物理序列号加密的软件可以实现完全拦截,并修改成自己设置的序列号。

但是发现兼容性很差,在2台台式电脑及二台笔记本上测试,通过率50%,一台台式电脑和一台笔记本电脑上运行直接蓝屏,另外两台电脑运行正常。

不知道这个蓝屏是跟什么有关?都是XP系统。

我将源程序和编译后的程序又发一次,希望这里的编程老师能改进一下,或是说明其原因?
谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (33)
雪    币: 37
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
顺便把蓝屏的DUMP文件发过来就好解决了
2010-11-9 21:54
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
蓝屏显示,意思是试图修改内存只读信息造成系统崩溃。
我分析了小程序所使用的所有动态连接库系统文件,将可以运行的系统中动态连接库文件全部复制到不能运行软件的电脑系统中,发现依然蓝屏。
故而分析结论是,运行软件造成的蓝屏,并不是由于兼容性问题,而是由于硬件与程序运行不兼容导致。
=======================
具体问题出在哪里,我还是不太清楚,但是估计只有两种方式才能彻底解决:
1、在运行软件造成蓝屏的电脑上调试改进程序。
2、更换电脑。(只有50%的电脑上才能正常运行,其余机器蓝屏。)
2010-11-10 08:27
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有空的时候发上来,不少DUMP文件呢。
2010-11-10 08:28
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
修改ring3内存 没有进行可写测试 要加 ProbeForRead ProbeForWrite
2010-11-10 11:59
0
雪    币: 1283
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
改序列号,可以用LPK试试!
2010-11-10 15:54
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我已经将DUMP文件发上来了。
该程序在电脑上运行,蓝屏,显示 hdhook.sys 运行错误。

具体如下:

STOP:0X000000BE(0X80505588,0X00505121,0XB93622CC,0X0000000B)

HDHOOK.SYS:ADDRESS F78793A1 BASE AT F7B79000 DATESTAMP 452E16A3

选择最小内存保存dump ,则有以下文件。请老师分析。
上传的附件:
2010-11-12 19:58
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
使用winDbg调试Dump文件,显示:

ATTEMPTED_WRITE_TO_READONLY_MEMORY (be)
An attempt was made to write to readonly memory.  The guilty driver is on the
stack trace (and is typically the current instruction pointer).
When possible, the guilty driver's name (Unicode string) is printed on
the bugcheck screen and saved in KiBugCheckDriver.
Arguments:
Arg1: 80505588, Virtual address for the attempted write.
Arg2: 00505161, PTE contents.
Arg3: b90da2cc, (reserved)
Arg4: 0000000b, (reserved)

==========================
Kernel symbols are WRONG. Please fix symbols to do analysis.

MODULE_NAME: HdHook

FAULTING_MODULE: 804d8000 nt

DEBUG_FLR_IMAGE_TIMESTAMP:  452e16a3

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  WRONG_SYMBOLS

BUGCHECK_STR:  0xBE

LAST_CONTROL_TRANSFER:  from f7aaa50e to f7aaa3a1

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
b90da348 f7aaa50e 85ce9dd8 00000001 00000000 HdHook+0x3a1
b90da380 804f019f 85ca36c0 00000000 806e7410 HdHook+0x50e
b90da3a4 805817f7 85ca36c0 85c3a348 85ce9dd8 nt+0x1819f
b90da440 8057a274 00000094 00000000 00000000 nt+0xa97f7
b90da474 8054264c 00000094 00000000 00000000 nt+0xa2274
b90da4a4 7c92e514 badb0d00 0012f320 85c2b1d0 nt+0x6a64c
b90da4a8 badb0d00 0012f320 85c2b1d0 e128e4d0 0x7c92e514
b90da4ac 0012f320 85c2b1d0 e128e4d0 bf80340a 0xbadb0d00
b90da4b0 85c2b1d0 e128e4d0 bf80340a e128e4d0 0x12f320
b90da4b4 e128e4d0 bf80340a e128e4d0 b90da4d0 0x85c2b1d0
b90da4b8 bf80340a e128e4d0 b90da4d0 bf802970 0xe128e4d0
b90da4bc e128e4d0 b90da4d0 bf802970 e128e4d0 win32k+0x340a
b90da4c0 b90da4d0 bf802970 e128e4d0 00000000 0xe128e4d0
b90da4c4 bf802970 e128e4d0 00000000 bf800000 0xb90da4d0
b90da4d0 bf800000 bf800023 bbe80023 7c92e514 win32k+0x2970
00000000 00000000 00000000 00000000 00000000 win32k

STACK_COMMAND:  kb

FOLLOWUP_IP:
HdHook+3a1
f7aaa3a1 c704810ea3aaf7  mov     dword ptr [ecx+eax*4],offset HdHook+0x30e (f7aaa30e)

SYMBOL_STACK_INDEX:  0

FOLLOWUP_NAME:  MachineOwner

IMAGE_NAME:  HdHook.sys

SYMBOL_NAME:  HdHook+3a1

BUCKET_ID:  WRONG_SYMBOLS

Followup: MachineOwner
2010-11-12 20:24
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
根据上面情况好像是这句话引发的错误:
在 hdhook.sys 驱动中的:

000103A1 mov dword ptr [ecx+4*eax],0001030E

这个是用w32Dasm反编译出来的,不知道在C语言程序中,如果改变源程序来解决这个错误呢?

谢谢多位老师的指导。
2010-11-12 20:56
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
获得ring0特权,对CR0控制寄存器的第16位WP位置0,即可所有内存地址任意修改。

可以解决这个问题

如何根据这个修改源程序啊?谢谢各位了。
2010-11-12 22:13
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
HookZwDeviceIoControlFile proc FileHandle:HANDLE,Event:DWORD,ApcRoutine:DWORD,ApcContext:PVOID,IoStatusBlock:
PIO_STATUS_BLOCK,IoControlCode:DWORD,InputBuffer:DWORD,InputBufferLength:
DWORD,OutputBuffer:DWORD,OutputBufferLength:DWORD

invoke RealZwDeviceIoControlFile,FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,
IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,OutputBufferLength
mov edi,eax
.if IoControlCode==7c088h && OutputBufferLength >14h
         invoke IsSubString,OutputBuffer,DiskSerial,OutputBufferLength,14h
         .if eax
          mov ecx, 14h
           sub ecx, eax
@@:     
            mov dl, [ecx+eax]
           mov [eax], dl
          inc eax
           dec esi
           jnz @b
                        mov eax, edi
         .endif

.endif
ret
HookZwDeviceIoControlFile endp
HookStart proc
        .if IsHooked==0
  mov eax, ds:ZwDeviceIoControlFile
  mov ecx, buffer
  push esi
  mov edx, [eax+1]
  mov esi, [ecx]
  mov edx, [esi+edx*4]
  pop esi
  mov RealZwDeviceIoControlFile, edx
  mov eax, [eax+1]
  mov ecx, [ecx]
  mov dword ptr [ecx+eax*4], offset HookZwDeviceIoControlFile
==================================
汇编是在这里,但是VC程序不知道怎么修改完善。
2010-11-12 22:36
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
希望有愿意深入的研究的老师指点迷津,能够修改第一帖中附近中的VC源程序,可以在任何机器上使用。
2010-11-13 07:26
0
雪    币: 37
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
PUCHAR Locate = IsSubString(OutputBuffer,__DiskSerial,OutputBufferLength,DISK_SERIAL_BUFF_LENGTH);
指出的是这句上下有问题。

但是我不知道你的DUMP文件和你的SYS驱动是否一致
因为WINDBG提示
BUCKET_ID:  WRONG_SYMBOLS

学驱动看下WINDBG如何看DUMP是很有必要的

建议看看张帆的《windows驱动开发技术详解》
2010-11-13 13:24
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我DUMP的文件和我的hdhook.sys是一致的。
我想在你的帮助下,应该已经找到问题的关键所在了。
请老师们看:

   //判断IoControlcode是不是取序列号的值
      if((0x7c088 ==IoControlCode) && OutputBufferLength >DISK_SERIAL_BUFF_LENGTH){
  
          //判断返回值中是否包含当前的硬盘序列号,是的话用假的替换
          PUCHAR Locate = IsSubString(OutputBuffer,__DiskSerial,OutputBufferLength,DISK_SERIAL_BUFF_LENGTH);
          if(Locate){
              UCHAR i;
              for(i=0;i<20;i++){
                  Locate[i]= __ChangeTo[i];
              }
          }
      }
      return(rc);
  }

==============================================
也就是程序在对比IoControlcode是不是取序列号的值的时候,发现返回值确实包括硬盘序列号,然后程序在准备以假的序列号替换的时候,对物理内存地址的0x7c088写入假的硬盘序列号时,由于Write Protect的情况,导致程序将假序列号写入物理内存地址的时候发生蓝屏,也就是蓝屏后的提示“试图将数据写入只读内存中”的情况。

我看一些帖子,这种情况只需要将WP位设置为0,就可以禁用写保护的功能,然后将假序列号写入物理内存地址中就可以了。
================================================
以下是我找的文献:

cr0是系统内的控制寄存器之一。控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。

控制寄存器最初出现于低级的286处理器中,以前称之为机器状态字(machine status word),在386以后它们被重命名为控制寄存器(control register)。cr0寄存器直到486的处理器版本才被加入了“写保护”(Write Protect,WP)位,WP位控制是否允许处理器向标记为只读属性的内存页写入数据,如果我们将WP位设置为0,就可以禁用写保护的功能。

禁用和启用写保护的内联汇编代码如下所示:
// 关闭写保护
__asm
{
cli ;
mov eax, cr0
and eax, ~0x10000
mov cr0, eax
}

// 恢复写保护
__asm
{
mov eax, cr0
or eax, 0x10000
mov cr0, eax
sti ;
}

需要注意的是,这里的cli和sti都是特权指令,必须在ring0才能使用的。

除了cr0之外,还有4个控制寄存器。cr1未被使用(或者被偷偷使用了,但没有在文档中说明),cr2在处理器处于保护模式时存储上一个导致页故障的地址,cr3存储页目录的地址,cr4在Pentium系列(包括486的后期版本)处理器中才实现,它处理的事务包括诸如何时启用虚拟8086模式等。
=========================================================

各位老师,我虽然懂MASM的语言,但是对VC语言不通,所以不会修改VC程序。能否将hdhook.c这个源程序的 写内存的位置之前,将这个内存位置的写保护去掉啊。

谢谢了,等待各位老师的回复。
2010-11-13 21:42
0
雪    币: 1329
活跃值: (5184)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
不错!!!
支持一下并收藏!!
2010-11-14 00:07
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
16
BSOD是因为取ZwDeviceIoControlFile的SSDT里的id号取的出现问题了~

话说,建议检查操作系统版本号然后硬编码~
2010-11-14 01:57
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
目前共有4台电脑测试该程序,其中是2台台式机,2台笔记本电脑。

一、
其中一个台式机 XP SP3系统,Inter Core 2 DUO E4600 双核 2.4G 1G内存 双硬盘 主硬盘IDE,附属硬盘SATA,根据软件调试跟中,发现软件取的是SATA接口硬盘的物理序列号,并未使用IDE接口硬盘的物理序列号。该计算机运行后蓝屏,截取的DUMP就是在这个机器上。

二、
另外一台台式机 XP sp3系统,单核 2.8G 1.G内存,单硬盘 IDE接口,可以正常运行该软件,并成功拦截模拟硬盘物理序列号,被拦截程序正常。

三、
第三台测试电脑为笔记本电脑,是4年前电脑,联想 单核1.6G 512内存,系统XP sp3,运行正常,被拦截程序运行正常。

四、
第四台测试电脑为DELL笔记本电脑,是6年前买的电脑,单核 1.6G 内存512,目前升级到1G内存,系统XP Sp2, 运行后蓝屏,不能使用。

============================
初步故障分析:
1、曾经怀疑操作系统中动态连接库版本问题,使用OD打开GUI.exe,获取该程序运行需要的所有动态连接库文件,复制到不能运行的计算机上全部在DOS下覆盖,再到XP中运行该程序,蓝屏依旧,根据这个情况,初步怀疑该问题不是出在操作系统版本或是不兼容的动态连接库导致的蓝屏。

2、该程序在直接启动之际,如果软件假物理序列号栏未输入数据的时候,不修改物理内存的地址物理序列号,但是该程序是启动时,未运行,而是卡在哪里,暂停1秒,无任何软件界面出现,然后蓝屏,感觉这个现象,应该不是修改物理内存地址数据的时候发生的蓝屏。
=============================

根据cvcvxk老师的指导:

BSOD是因为取ZwDeviceIoControlFile的SSDT里的id号取的出现问题了~

话说,建议检查操作系统版本号然后硬编码~

==========
如果操作系统版本号中的动态连接库不是问题所在,就查硬件编码。

程序所模拟的硬盘为SATA接口的,我的硬盘序列号为20个字节的编码,其中前11位为空格,后9位为正常英文字母和数字,其他程序正常读取并有限制注册,未出现任何问题。

=========
该问题请各位老师有空一直探讨一下,有空的老师,请测试修改一下1楼的附近中的源程序,然后贴给我,我编译后再多台电脑上测试,希望能在技术上最终获得问题的解决方法。

感觉程序是在读过程中出现的蓝屏,而不是在写内润的过程中出现的。
谢谢各位老师的参与。
2010-11-14 08:26
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
问题已经解决,感谢众多老师的提醒,整个过程也走了一些弯路。
谈一下感受:
1、VC这个开发软件已经过时,以后尽量少用这个软件,微软总是设置很多问题督促你,让你使用新的开发工具,否则就会出现各种问题。(也是营销策略)
2、论坛上很多人总是喜欢奉行“下载拿来主义”,不愿意自己动手解决问题,这就出现了目前这个软件为何容易在XP下死机的问题,而几年来竟然无人可以解决,悲哀啊。
3、该软件仿真性能真是不错,几乎只要仅仅对待硬盘序列号加密的软件已经完全够用了,如果软件再加上BIOS信息和CPU等信息,就需要仿真的更多了。
==========
作为结束帖子,我也不应该调大家的胃口,具体谈谈这个蓝屏的由来吧。
==========
这个程序是HDhook.sys驱动文件造成的蓝屏,为什么呢?有的XP可以用,有的XP不行,现在下个定论吧,所有各版本的XP完全支持!
这个软件的源程序需要DDK驱动函数才能完成编译,而这个程序是论坛老师从2006年修改后的程序,当然那个时候没有XP了,只有Win2000,这个程序编译的时候用的Win2000 DDK库文件,所以在win2000上绝对是100%好用的,但是XP就不好说了,我使用XP的DDK库文件从新编译后,发现不再蓝屏,可以顺利运行,模拟正常!具体怎么做,这个驱动源程序必须使用DDK软件编译,不能使用VC编译,否则是不支持的!因为VC6 是不支持XP DDK的,永远不支持!记住了!因为VC6 比较老,而XP DDK在它之后,所以不支持!
然后再用VC将编译好的sys驱动打包到GUI程序中把。在安装DriverStudio 3.2 的机器上,该程序运行会更稳定。
==========
在我这里运行还有个问题,在我之前运行蓝屏的电脑上运行修改后的程序,蓝屏不出现了,但是运行一次程序退出后,再运行就会出现 打开驱动器错误的英文提示,据我估计,这个就不一定是XP DDK的问题了,而是hdhook.sys源程序的问题了,毕竟这个源程序最初的开发是在win2000上根据2000的DDK库开发的,而目前是硬性使用XP的DDK库,源程序估计需要一些小的改动才能完美适用,具体怎么完善,如果论坛上有老师感兴趣,再交流吧。目前这个小BUG倒是无所谓,毕竟小软件编译后195K,建立快捷方式方到启动项里开机启动一次,就不用管了。模拟的序列号已经都在软件中直接调用了。

至此,该文件做到了完结,搜索论坛的帖子,竟然2006年的帖子中的软件传播的网上到处都是,但是可惜有一半人用不了,蓝屏!,而没有人几年研究一下编译问题和程序的问题。
2010-11-14 14:21
0
雪    币: 8211
活跃值: (2801)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
很多BUG.看似是因为某个原因.

实则未必.

这个代码我不知道从那里流传出来的.

Bug不少.

第一.高地址(0x80XXX以上地址)内存受写保护.而代码内Hdhook.c 135行调用

VOID HookStart( void )
{
    if( !IsHooked ) {
        RealZwDeviceIoControlFile = SYSCALL( ZwDeviceIoControlFile );
        SYSCALL( ZwDeviceIoControlFile ) = (PVOID) HookZwDeviceIoControlFile;
        IsHooked = TRUE;
    }
}
来修改.nt!KeServiceDescriptorTable结构第一个成员数组成员KiServiceTable内元素值的时候.
没有修改内存保护属性.导致了直接写入只读内存的BUG.这一般都会引起系统BugCheck.同样的道理.
VOID HookStop( )
{
    if( IsHooked ) {
        SYSCALL( ZwDeviceIoControlFile ) = (PVOID) RealZwDeviceIoControlFile;
        IsHooked = FALSE;
    }
}
也存在这个问题..
正确的做法是.调用这个函数修改之前.先尝试让目标地址地址可写.修改权限办法有很多.
MDL方式是微软推荐的.
但是偷懒也可以采取修改CR0 P位实现.(也就是你自己找到的那几条所谓指令).
但是我再加一句.现在多核心系统比较多.为了以防万一.中途发生切换.
建议在执行修改CR0之前.要设置当前线程的亲缘性.这样可以更稳定一点.

第二.
代码存在逻辑错误.
源文件Hdhook.c第66行
    rc = RealZwDeviceIoControlFile (
        FileHandle,
        Event,
        ApcRoutine,
        ApcContext,
        IoStatusBlock,
        IoControlCode,
        InputBuffer,
        InputBufferLength,
        OutputBuffer,
        OutputBufferLength
    );
没有对返回值进行任何校验.就开始尝试去修改缓冲区.
比较好一点的做法是.首先判断系统是否处理成功了.
因为系统内核会对参数进行严格审查.例如传递的缓冲区是否有效.大小.等等.
如果系统检查过这个缓冲区确实有效.并且数据写入了.
那么缓冲区一般情况下是没有问题的.我们也可以去写入来完成替换.
不然.如果缓冲区非法.我们很有可能造成访问违规而引起系统BugCheck.

剩下的BUG基本上楼上几位都说了.比如Service ID是否正确.探测缓冲区.加TRY异常捕获等.
2010-11-15 15:18
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
傷遺忘 老师是真正研究透这个程序的老师,其实我也发现这个程序在很多处编写的很多不太合适的地方,导致程序运行中在各种电脑环境中出现未知错误。

目前发现另外一种错误,将该程序设置为启动项,开机自动运行,这个时候程序打开工作,但是关闭电脑时候,由于程序未实现正常退出,而系统强行直接关闭这个程序,而下次机器启动时候,该程序再运行后,显示打开驱动发生错误退出,然后再运行一次,就又可以运行。



从编程逻辑看,该程序一定是再运行时打开模拟,而退出程序的时候关闭模拟,由于直接关闭系统程序未执行退出关闭模拟,所以下次再运行时,等于在标记模拟后再进行了一次模拟,导致程序运行失败。

希望 傷遺忘 能修正一下该程序的VC源码,因为我虽然有汇编的基础,但是对C语言不太懂,没有学过。

另外有好多网友来信,说希望提供编译好的程序,我在这里说暂时先等等。
该程序虽然解决使用Win2000的DDK在XP下运行部稳定的情况,但是程序中有很多地方有待优化调整,否则在一些电脑上上仍然运行出现未知错误的问题。

我们并不是通过优化这个程序去为了解密谁的软件,只是希望通过源程序的优化,让大家学习更多的程序思路,并能修正好其中的错误。

谢谢,希望 傷遺忘 老师能修正一下源程序,谢谢,我可以代为编译,我有驱动编译环境,带有XP DDK。
上传的附件:
2010-11-20 18:52
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
等待各位老师的辛勤指导,希望能修正一下源程序,我可以代为编译。
2010-11-22 08:49
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
22
通常自己写DLL HOOK 硬盘号
2010-11-22 12:28
0
雪    币: 226
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
有了这个工具,如果完善一些,不是更好。
2010-11-22 20:37
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
24
写来出的工具不是万能的,像DUP,自己的东西爱咋样就咋样,
2010-11-23 19:29
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
标记 idididid
2010-11-26 09:29
0
游客
登录 | 注册 方可回帖
返回
//