发信人: sle()
整理人: sle(2000-02-29 18:07:11), 站内信件
|
在分析加密软件和病毒时,我们经常只有一种办法,就是逐条指令跟踪分析 ,最常用的分析工具就是DEBUG了,DEBUG利用单步执行中断INT1和断点中断INT3 进行跟踪。加密软件或病毒对付DEBUG的方法之一就是频繁修改这两个中断,并把 该向量地址人作为数据区或堆栈区,使得分析者经常要改回这两个中断地址即0: 4H-0:8H和0:0CH-0:0FH处内容,并搬动数据或堆栈,这非常麻烦。其实在286以上 的机器中,只需用一个小小的程序,就可以使得INT1和INT3的向量地址,不依赖 于地址0:4H-0:8H和0:0CH-0:0FH处内容。
据INTEL资料介绍,286以上处理器可以利用LIDT指令把中断向量区搬到任何地址 ,此指令在实模式下亦有效。下面的程序就是利用该指令把中断向量表搬到STAR T开始的1024字节处,其中断程序处理部分是根据中断向量号,在原向量0:0-0 :400H处找到向量地址,然后转到该地址执行。若要使用DEBUG的INT1和INT3不依 赖0:4H-0:8H和0:0C-0:0FH处的内容,只需要在DEBUG下把这两处的内容填 到由START开始的新向量区相应的地址即可(注意,要获得加载了DEBUG后后该地 址的真实内容,需要在DEBUG下再运行DEBUG才能看到。)
此程序用到了386指令,应编译成COM文件,在386以上机器上运行。
Descriptor STRUC
Limit_low dw 0
Base_low dw 0
Base_hi_byte_low db 0
Attribute db 0
Limit_hi_byte db 0
Base_hi_byte db 0
Base_hi_byte_hi db 0
Descriptor ENDS
.386p
code segment use16
assume cs:code,ds:code
org 100h
cur1=$
start:jmp begin
db 1024-($-Curl) dup(0)
IDTR Descriptor<400H,0,0,92H,0,0>
IDT0:
X=0
REPT 256
DB 68H;这两行相当于PUSH X,用这种方法保证生成三字节
DW X;代码,便于以后处理
CALL COMMAN
X=X+1
ENDM
TempPtr DW 0
DW 0
TempBX DW 0
TempES DW 0
COMMAN PROC
MOV CS:TempBX,BX
MOV CS:TempES,ES
XOR BX,BX
MOV ES,BX
POP BX
POP BX
SHL BX,2
PUSH DWORD PTR ES:[BX]
POP DWORD PTR CS:TempPtr
MOV ES,CS:TempPtr
MOV BX,CS:TempPtr
JMP DWORD PTR CS:TempPtr
COMMAN ENDP
Cur2=$
Begin:push cs
Pop es
Mov ax,es
Shl eax 16
Mov ax,offset IDT0
Mov cx,256
Mov di,offset start
Cld
Again:stosd
Add ax,6
Loop again
Mov ax,cs
Movzx eax,ax
Shl eax,4
Add eax,100h
Mov IDTR.base_low,ax
Shr eax,16
Mov IDTR.base_hi_byte_low,al
Lidt fword ptr IDTR
Mov dx,cur2-cur1+100h
Int 27h
Code ends
End start
-- sigh,,曾经有一盆清蒸的甲鱼摆在我的面前,可是我却没有珍惜,
等到它被人瓜分的时候才追悔莫及,人世间最痛苦的事莫过于此。
如果上天能够给我一个再来一次的机会,我会对它说:“我吃你”
如果要给这份遗憾加上一个期限,我愿是---一分钟。
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 210.72.235.145]
|
|