发信人: 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]
  | 
 
 
 |