Modification.Win32.BlueBall.4117 病毒演示

/ns/wz/comp/data/20020813023247.htm

Modification.Win32.BlueBall.4117 病毒演示

Author: whg
Email: whg@whitecell.org
Homepage:http://www.whitecell.org


.586p
.model flat,STDCALL ;汇编框架定义
MyMemFlag EQU 000
VirusSum EQU 2047 ;小球个数
OFF EQU OFFSET
L EQU LARGE

MyMemory struc ;小球的位置数组结构
XXYY dd VirusSum*2 dup(?)
PosXY dd VirusSum*2 dup(?)
MyMemory ends
.data

hDC dd ?
hBrush dd ?
Static dd 1234 ;初始随机数变量
Msg1 db 'Virus Demo---Win32.Cxdz.4117',0
Msg0 db 'Modification.Win32.BlueBall.4117 Virus Demo',0
.code

extrn GlobalAlloc: proc
extrn ExitProcess: proc
extrn MessageBoxA: proc
extrn GetWindowDC: proc
extrn Ellipse: proc
extrn CreateSolidBrush: proc
extrn SelectObject: proc ;要用到的win32 API函数
start:
call MessageBoxA,L 0,OFF Msg0,L OFF Msg1,L 0 ; 提示,开始演示
@@display_msg:
call GlobalAlloc,L MyMemFlag,L size MyMemory;申请一块内存
mov edi,eax
call CreateSolidBrush,L 00800000h;创建一个蓝色的画刷
mov [hBrush],eax
@@Timer_1:
call GetWindowDC,L 0;得到Window DC
mov [hDC],eax
call SelectObject,eax,[hBrush];选入DC
mov ebp,esi
push esi
push edi
lea esi,[edi.XXYY]
lea edi,[edi.PosXY]
mov ecx,VirusSum
@@timer_0:
push ecx
call @@Rnd ;产生随机数
call @@Value ;将随机数转化为小球的运动方向,沿X轴
mov eax,[edi]
mov ebx,[esi]
add eax,ebx
call @@LimitX ;限制小球的运动范围,不能超过屏幕!
mov [edi],eax
add esi,4
add edi,4
call @@Rnd ;产生随机数
call @@Value ;将随机数转化为小球的运动方向,沿Y轴
mov eax,[edi]
mov ebx,[esi]
add eax,ebx
call @@LimitY ;限制小球的运动范围,不能超过屏幕!
mov [edi],eax
add esi,4
add edi,4
mov ebx,[edi-8]
mov edx,[edi-4]
push edx
push ebx
add ebx,10
add edx,10
push edx
push ebx
call Ellipse,[hDC];画出小球
pop ecx
loop @@timer_0 ;继续画,共画2047个
pop edi
pop esi
jmp @@Timer_1 ;继续画,死循环
@@Rnd:
push ebx
push edx
mov eax,[Static];取随机数种子
mov ebx,8191 ;乘以2的12次方-1, 8191是个素数!
;产生随机数的带换公式:
;Rnd(n+1)=(Rnd(n)*A+B) MOD C
;经理论研究认为:
;A,C都应该为素数,那么随机数产生的个数为最大=C,即最为随机!
;这须要我们设置好A,B,C的值
;我们可以认为2的奇次方减一都是素数,例如: 7,21,127,1023....
;所以,我取C=7fffffffh=2**31-1;A=8191=2**13-1
mul ebx
add eax,1023
mov ebx,7fffffffh
xor edx,edx
div ebx
mov [Static],edx ;保存Rnd(n),作为下一次机算用的Rnd(n-1)
mov eax,edx
pop edx
pop ebx
ret
@@Value:
cmp eax,20000000h
ja short @@Value_0
mov dword ptr [esi],1;向正方向移动
ret
@@Value_0:
cmp eax,40000000h
ja short @@Value_1
mov dword ptr [esi],-1;向负方向移动
ret
@@Value_1:
ret ;不改变移动方向
@@LimitX:
cmp eax,800 ;800*600
jG short @@LimitX_0
cmp eax,0
jL short @@LimitX_1
ret
@@LimitX_0:
mov eax,0
mov dword ptr[esi],1;超出屏幕显示区,修改移动方向
ret
@@LimitX_1:
mov eax,800
mov dword ptr[esi],-1;超出屏幕显示区,修改移动方向
ret
@@LimitY:
cmp eax,600;800*600
jG short @@LimitY_0;超出屏幕显示区,修改移动方向
cmp eax,0
jL short @@LimitY_1;超出屏幕显示区,修改移动方向
ret
@@LimitY_0:
mov eax,0
mov dword ptr[esi],1;超出屏幕显示区,修改移动方向
ret
@@LimitY_1:
mov eax,600
mov dword ptr[esi],-1;超出屏幕显示区,修改移动方向
ret
end start