首页
社区
课程
招聘
讲个关于《反逆向工程揭密》的技术问题
发表于: 2005-7-8 20:57 6611

讲个关于《反逆向工程揭密》的技术问题

2005-7-8 20:57
6611

看过NBW翻译的《反逆向工程揭密》的人可能注意到,里面提到了一个反Softice的技巧。

这个bug会引起蓝屏的原因是什么呢?我只不过访问了0地址,Windows怎么就气蓝了脸ni?

我对这个很感兴趣,于是研究了一下。

首先,当然是问Nicolas。他只是告诉我,叫我写个驱动。当然我一开始没有写。前一段时间正好有空,学了学KMDKit的教程。偶然心动,于是做了个实验。

首先,根据KK教程的描述,如果驱动程序的IRQL>=DISPATCH_LEVEL。那么,当寻址分页内存时,系统会崩掉。于是很自然(象大自然一样自然)地猜想,SICE提升了自己的IRQL。于是我在SICE里找KeGetCurrentIrql的Import,很不幸,找不到。

于是我用那个Beep的代码做了实验。把相关代码替换为

xor eax,eax
mov eax,[eax]

系统崩了。不过很意外的,错误信息是“未处理的异常”而不是“IRQL Less or equal”。这虽然否定了我的猜测,但起码可以说明IRQL是Passive级别的。

那么问题在哪里呢?

NULL指针!

编过程序(不包括C#这样连指针都没有的垃圾)的人肯定都知道空指针会引发异常。实际上,问题就在这里。

在Windows2000的进程线性地址空间里,最低端的64K是禁止访问的。这是为了简单地检测空指针。想想看,只要设好内存属性,一访问内存,马上引发异常。于是你就知道肯定有空指针在什么地方。是吧?

那么我们的SICE呢?也是的。这个Bug迫使它使用了一个空指针,于是异常马上发生。而它没有写相应的错误检测或者SEH处理程序(实际上,我不知道SEH能不能处理Acess Violation!所以这里有点信口开河了),结果就是系统崩掉。

当然,我一开始没有这么想。只是看了Windows内核编程才突然想到。

要更加严格地证明,应该写个程序,访问地址$FFFF。但是我懒得去做了。如果你愿意做,而且得到了蓝屏,请告诉我。我会很高兴的。因为这就证明了问题的原因确实是NULL指针。

如果你早就知道这个,请不要笑话我。

谢谢观赏。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
看懂了你所要说明的技术问题,但跟不上你的思路
继续学习
2005-7-8 21:50
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
不懂驱动,不过我想这个跟驱动关系不大。之所以读0异常是因为SICE在R0级,除非他自己,否则没人接管他的异常。我记得那篇文章里面说,想想运行在R0的程序出现这种情况。。。。,也相当于告诉我们这个道理。

照这种想法,我们平时读0也是应该蓝屏的,不过操作系统给接管了而已。个人看法,不知道对错。

SICE提升一些属性我想未必用api,不过分析SICE的结构值得研究,曾经见过国外一牛人分析出来SICE的断点结构,不知道如何下手。
2005-7-8 22:34
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
SICE 4.31断点的结构

作者:Kayaker  

SICE 4.31断点的结构,由于这个结构有“TDJF”串作为标记,所以姑且叫做TDJF:

0000 BREAKPOINT_INFO struc ; (sizeof=0x178)
     0000 ascii_TDJF_1    db 4 dup(?)  ; "TDJF"
     0004 Breakpoint_Type db ?         ; BPINT = 01h
     0004                              ; BPM/BPIO = 03h
     0004                              ; BPX = 05h
     0004                              ; BMSG = 06h            
     0004
     0005 Enabled_Flag    db ?         ; toggled with BE, BD
     0006 DRx_Register    db ?         ; DR3=83h, DR2=82h, DR1=81h, DR0=80h
     0006                              ; used with BPM/BPIO breakpoints
     0006                                    
     0007 Address_1       dd ?         ; Breakpoint address or BPIO port number
     000B Address_2       dd ?         ; unknown usage
     000F Breakpoint_Mode db ?         ; execute = 0
     000F                              ; write = 1
     000F                              ; read = 2
     000F                              ; read/write = 3
     000F                                          
     0010 unknown_dword_1 dd ?
     0014 CodeSegment_CS  dw ?         ; 0008, 001B, etc.
     0016 unknown_03h     db ?         ; seems to be 3 for all BP types
     0017 Address_1_repeat dd ?        ; Duplicate BP address
     001B unknown_word_1  dw ?
     001D unknown_byte_1  db ?
     001E unknown_dword_2 dd ?
     0022 unknown_dword_3 dd ?
     0026 unknown_dword_4 dd ?
     002A unknown_byte_2  db ?
     002B BMSG_hWnd       dd ?         ; Class handle for BMSG breakpoints
     002F unknown_word_2  dw ?
     0031 unknown_byte_3  db ?
     0032 unknown_byte_4  db ?                     
     0032                               ;
     0033 unknown_dword_5 dd ?
     0037 unknown_dword_6 dd ?
     003B unknown_dword_7 dd ?                     
     003B                               ;
     003F unknown_byte_5  db ?
     0040 unknown_byte_6  db ?
     0041 unknown_byte_7  db ?
     0042 unknown_byte_8  db ?                     
     0042                               ;
     0043 unknown_dword_8 dd ?
     0047 unknown_dword_9 dd ?
     004B unknown_dword_10 dd ?
     004F unknown_dword_11 dd ?
     0053 unknown_dword_12 dd ?
     0057 unknown_dword_13 dd ?
     005B unknown_dword_14 dd ?
     005F unknown_dword_15 dd ?
     0063 unused_dword_1  dd ?
     0067 unused_dword_2  dd ?
     006B Length_Module_Name db ?      ; byte length of string that follows
     006C Module_Name_String db 264 dup(?)   ; Name of process (breakpoint context)
     0174 ascii_Tdjf_2    db 4 dup(?)  ; "TDJF"
0178 BREAKPOINT_INFO ends
2005-7-8 22:38
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
5
最初由 nbw 发布
不懂驱动,不过我想这个跟驱动关系不大。之所以读0异常是因为SICE在R0级,除非他自己,否则没人接管他的异常。我记得那篇文章里面说,想想运行在R0的程序出现这种情况。。。。,也相当于告诉我们这个道理。

照这种想法,我们平时读0也是应该蓝屏的,不过操作系统给接管了而已。个人看法,不知道对错。

SICE提升一些属性我想未必用api,不过分析SICE的结构值得研究,曾经见过国外一牛人分析出来SICE的断点结构,不知道如何下手。


是被os接管了的。不过sice没有写错误处理,结果就没有人处理了。

不过玩r0最简单的就是drv了嘛
2005-7-9 11:40
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
6

事实求真..
2005-7-11 18:05
0
游客
登录 | 注册 方可回帖
返回
//