• 标 题:由一只病毒说开去(下)! (5千字)
  • 作 者:kobe
  • 时 间:2001-10-1 23:21:49
  • 链 接:http://bbs.pediy.com

由一只病毒说开去(下)!
                    by kobe
  这次下集隔了好久才跟大家见面,因为学校机房不允许调试程序,故上次我说要手工
杀毒的话不能兑现了,不过那个所谓的“乾坤大挪移”,还是很简单的,前几年看台湾
的文章,这招经常出现,无论TPVO的杂志还是软蛀的文章都提到过的,其实实现起来很
简单了,也就是反反跟踪了(千万别以为我是结巴,就是反--反跟踪)。
大家知道VIRUS的作者和一些对软件加密意识较强的程序员会改写一些特定的中断向量
,因为一些调试软件如DEBUG等在单步执行时会调用INT 1H和INT 3H。反跟踪的一般做法
是随便用一个地址代替向量地址!这样当单步发生时用的是那个胡乱指定的地址,天知道指到哪去!!当然你在反反跟踪时也可准备一份你机子上的中断大集合(抄到纸上, 有一定可行性)最好是在内存中有一个副本不更好么?

下面给出源码,注意转载不的更改程序信息!
该程序关键在于GDT(全局描述表)的结构,和高位内存之间COPY的方法!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;move.asm;;;;;;;;;;;;;;;;;;;;;;;;;;
;The programme is written by kobe(jim zhu)
;;;;;;;;;;;(c)COPYRIGHT
;http://kobesworld.yeah.net
;email:warmwaters@21cn.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;cut here;;;;;;;;;;;;;;;;;;;;;;;
showtime SEGMENT
        ASSUME cs:showtime,ds:showtime
        ORG 100H
start:  jmp movit          ;典型COM执行档的开头
des_table label WORD  ;全局描述表(GDT)之定义!下面我会给出
            ;GDT的格式,这可是很有意思的
            ;别的书上绝对没有! 
first16b  dw 8 dup(0)
     
source    dw 0ffffh
s_3byte  dw 0000h
          db 00h;把0:0处的向量表移到8000:0000处
          db 93h
          dw 0000h
target    dw 0ffffh
t_3byte  dw 0000h
          db 08h;移到8000:0000处!!(最大只能到8000:0000了)
          db 93h
          dw 0000h
last16b  dw 8 dup(0)

movit:
;ASSUME cs:showtime,ds:showtime
        mov ax,cs
        mov es,ax
        mov si,offset des_table;ES:SI=须建的GDT地址,全局                ;描述符表布局起点               
    mov cx,200h;CX=拷贝的字数(最大8000H)
        mov ah,87h;AH=87H,INT 15H,BIOS调用!
        int 15h;该调用用于保护方式传递数据(1MB以上的拷贝)
        ;AH=0成功,自己可用DEBUG调试验证之!           
        mov ah,4ch
        int 21h;结束
showtime ends
        end start;程序结束
;;;;;;;;;;;;;cut here;;;;;;;;;;;;;;;;;;;;;;;;;;;
===================================================================
GDT之格式!
偏移            长度            说明
00H            16byte             零
10H            1word            源段字节长(2*CX-1或更大)
12H            3byte            24位线性源地址,低字节在前
15H             1byte            源段访问权(93H)
16H                1word            零
18H             1word            目的字节长(2*CX-1或更大)
1AH            3byte            24位线性目的地址,低字节在前
1DH            1byte            目的段访问权(93H)
1EH            1word+16byte        零
======================================================================
以上程序有TASM和TLINK编译,连接!读者可在执行该程序后用DEBUG
看看0:0的内容和8000:0000的是不是一样!!!!!
我把我列写的结果给大家看看(用DOS管道操作符>>来得到结果!
DEBUG >>1.TXT):
1。执行MOVE.EXE前:
-d 0:0
0000:0000  9E 0F C9 00 65 04 70 00-16 00 C8 07 65 04 70 00  ....e.p.....e.p.
0000:0010  65 04 70 00 54 FF 00 F0-5F 9B 00 F0 53 11 00 F0  e.p.T..._...S...
0000:0020  00 00 00 C8 28 00 C8 07-3A 00 C8 07 52 00 C8 07  ....(...:...R...
0000:0030  6A 00 C8 07 82 00 C8 07-9A 00 C8 07 65 04 70 00  j...........e.p.
0000:0040  07 00 70 C8 4D F8 00 F0-41 F8 00 F0 17 25 60 FD  ..p.M...A....%`.
0000:0050  39 E7 00 F0 40 02 17 02-2D 04 70 00 28 0A 1A 03  9...@...-.p.(...
0000:0060  59 FF 00 F0 2F 00 89 08-6E FE 00 F0 04 06 1A 03  Y.../...n.......
0000:0070  1D 00 00 C8 A4 F0 00 F0-22 05 00 00 E0 66 00 C0  ........"....f..
-d 8000:0000
8000:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8000:0010  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8000:0020  28 01 00 00 02 00 00 00-17 3C F9 FF 63 22 D6 7E  (........<..c".~
8000:0030  63 22 97 7E 01 00 00 00-17 A2 FE FF 08 00 00 00  c".~............
8000:0040  00 00 00 00 43 3A 5C 57-49 4E 44 4F 57 53 5C 53  ....C:\WINDOWS\S
8000:0050  59 53 54 45 4D 5C 57 49-4E 4F 41 33 38 36 2E 4D  YSTEM\WINOA386.M
8000:0060  4F 44 00 00 00 00 00 00-00 00 00 00 00 00 00 00  OD..............
8000:0070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
-q

2。执行MOVE.EXE后:
-d 0:0
0000:0000  9E 0F C9 00 65 04 70 00-16 00 C8 07 65 04 70 00  ....e.p.....e.p.
0000:0010  65 04 70 00 54 FF 00 F0-5F 9B 00 F0 53 11 00 F0  e.p.T..._...S...
0000:0020  00 00 00 C8 28 00 C8 07-3A 00 C8 07 52 00 C8 07  ....(...:...R...
0000:0030  6A 00 C8 07 82 00 C8 07-9A 00 C8 07 65 04 70 00  j...........e.p.
0000:0040  07 00 70 C8 4D F8 00 F0-41 F8 00 F0 17 25 60 FD  ..p.M...A....%`.
0000:0050  39 E7 00 F0 40 02 17 02-2D 04 70 00 28 0A 1A 03  9...@...-.p.(...
0000:0060  59 FF 00 F0 2F 00 89 08-6E FE 00 F0 04 06 1A 03  Y.../...n.......
0000:0070  1D 00 00 C8 A4 F0 00 F0-22 05 00 00 E0 66 00 C0  ........"....f..
-d 8000:0000
8000:0000  9E 0F C9 00 65 04 70 00-16 00 C8 07 65 04 70 00  ....e.p.....e.p.
8000:0010  65 04 70 00 54 FF 00 F0-5F 9B 00 F0 53 11 00 F0  e.p.T..._...S...
8000:0020  00 00 00 C8 28 00 C8 07-3A 00 C8 07 52 00 C8 07  ....(...:...R...
8000:0030  6A 00 C8 07 82 00 C8 07-9A 00 C8 07 65 04 70 00  j...........e.p.
8000:0040  07 00 70 C8 4D F8 00 F0-41 F8 00 F0 17 25 60 FD  ..p.M...A....%`.
8000:0050  39 E7 00 F0 40 02 17 02-2D 04 70 00 28 0A 1A 03  9...@...-.p.(...
8000:0060  59 FF 00 F0 2F 00 89 08-6E FE 00 F0 04 06 1A 03  Y.../...n.......
8000:0070  1D 00 00 C8 A4 F0 00 F0-22 05 00 00 E0 66 00 C0  ........"....f..
-q

本文到次就告一个段落了!请大家务必手头有DOS/BIOS调用参考手册!!
要不我就等于白费口舌了!!!!