返回
前端
分类

pe文件学习笔记1-----为PE文件添加节,添加目标文件

日期: 2020-03-31 02:08 浏览次数 : 127

;接上篇

[分享]pe文件学习笔记1-----为PE文件添加节

 

;######################################################

此程序借鉴不少高手程序   所以称不上原创   但也经过我重新写过和加了注释  
实现功能将pe文件添加一个自己的节,将程序入口地址更改为自己节  自己节中程序执行完成后跳回原程序
此程序在插入代码中没做任何操作就直接返回原程序了  另外还有其他方式可插入自己代码 我并未添加

;**************************************************
;ReadMBROnDiskNT.asm
;功能:Windows NT、2K、XP中读MBR
;      
;**************************************************
.386p
.model flat, stdcall      ;平坦内存模式
option casemap :none   ; 大小写敏感
;***************************************************
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
include masm32includeadvapi32.inc
      
includelib masm32libuser32.lib
includelib 必赢备用网址 ,masm32libkernel32.lib
includelib masm32libadvapi32.lib

filename    db    "f:/a.exe" ;添加目标文件
write        db    0

.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib

ShowError proto :DWORD
ShowBuffer proto 

;################添加节的操作过程###########################
InfectFile    proc    _filename:dword
        local hFile
        local hMapping    
        local pMapping    
        local @dwAddCodeFile
        local @dwAddCodeBase
        local @dwEntry
;#######################打开文件##########################################################
        invoke    CreateFile,_filename,
        GENERIC_READ+GENERIC_WRITE,
        FILE_SHARE_READ+FILE_SHARE_WRITE,
        NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
        .if eax == INVALID_HANDLE_VALUE
            jmp    exit2
        .endif
        mov    hFile,eax
        invoke    CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,0,0
        mov    hMapping,eax
        invoke    MapViewOfFile,hMapping,FILE_MAP_READ+FILE_MAP_WRITE,0,0,0
        mov    pMapping,eax        
;########################找到pe头#########################################################
        mov    esi,eax
        assume    esi:ptr    IMAGE_DOS_HEADER
        cmp    word ptr [esi],IMAGE_DOS_SIGNATURE
        jnz    Exit
        add    esi,[esi].e_lfanew
        assume esi:ptr IMAGE_NT_HEADERS
        cmp    dword ptr [esi],IMAGE_NT_SIGNATURE
        jnz    Exit
;#######################添加新节##########################################################
        mov  eax,[esi].OptionalHeader.AddressOfEntryPoint
        add  eax,[esi].OptionalHeader.ImageBase
        mov  HostEntry,eax ;保存原程序入口地址
        ;判断是否能够有空间插入新节
        movzx  eax,[esi].FileHeader.NumberOfSections        
        mov    ecx,sizeof IMAGE_SECTION_HEADER
        mul    ecx
        add    eax,sizeof IMAGE_NT_HEADERS                
   

;##########
InfectFile    proto    :dword
;#########
.code

.data                            ;数据段
    FileName db '\.PHYSICALDRIVE0',0  ;打开第一个物理硬盘
    align 4                ;双字对齐
    readed    dd  0          ;实际读出的字节数
    Buffer    db  512 dup (0)  ;存放读出的数据的缓冲区
    hFile         dd  0          ;句柄存放处
    
    Caption        db 'NT中读写物理磁盘',0      ;Caption的字符串
    ErrCreate    db   '建文件错,该程序不能在Win9X下执行!',0   ;出错信息
    ErrRead        db '读盘错误!',0                           ;出错信息
    
    ShowText    db   4096*3 dup (0)               ;转换后用于显示的字符串
    Number    db '0123456789ABCDEF'           ;16进制数转换为ACSII码要用到的数据

;###############插入代码############################
VStart:
        call    abc
abc:        pop    ebp
        sub    ebp,offset abc
        xor    eax,eax
        add    eax,[ebp+HostEntry]
        jmp    eax
HostEntry    dd    ?
VEnd:
;######################################################

.code                                                ;代码段
main:
    ;建立文件
    invoke CreateFile,offset FileName,
GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,NULL,NULL
    mov  [hFile],eax
    cmp  eax,INVALID_HANDLE_VALUE
    jnz  read
    invoke ShowError,offset ErrCreate            ;显示错误信息
read:                                               ;读数据
    invoke ReadFile,eax,offset Buffer,512,offset readed,NULL
    cmp  eax,0
    jnz  show
    invoke ShowError,offset ErrRead            ;显示错误信息
show:                                               
    invoke ShowBuffer                           ;显示读出的内容
    invoke CloseHandle ,[hFile]                    ;关闭文件句柄
    invoke ExitProcess,0                            ;退出
ShowError  proc ,MESSAGE:DWORD                       ;显示出错信息并退出
    invoke MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
    cmp  [hFile],0
    jz   ShowErrorEnd
    invoke CloseHandle ,[hFile]    ;关闭句柄
ShowErrorEnd:
    invoke ExitProcess,0        ;退出
ShowError  endp

filename    db    "f:/a.exe" ;添加目标文件
write        db    0

ShowBuffer  proc                            ;显示所读出的信息
                                            ;把16进制数据转换成ASCII码的形式
    mov  esi,offset Buffer        ;数据
    mov  edi,offset ShowText     ;转换后的数据
    mov  ebx,offset Number
    mov  ecx,0
    xor  eax,eax
Again:
    cmp  [readed],0
    jz   ConversionEnd
    dec  [readed]
    mov  al,[esi]
    push eax
             shr  eax,4                     ;高4位
    mov  al,[ebx+eax]
    mov  byte ptr[edi],al
             inc  edi
    pop  eax
    and  eax,0FH                ;低4位
             mov  al,[ebx+eax]
    mov  byte ptr[edi],al
inc  edi
             mov  byte ptr[edi],' '        ;空格
    inc  edi
             inc  esi
             inc  ecx
    cmp  ecx,16
    jnz  Again
    xor  ecx,ecx
    mov  byte ptr[edi-1],13        ;是回车
    jmp  Again
ConversionEnd:
;显示转换后的字符串
    invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
    ret
ShowBuffer  endp
    end main

;################添加节的操作过程###########################
InfectFile    proc    _filename:dword
        local hFile
        local hMapping    
        local pMapping    
        local @dwAddCodeFile
        local @dwAddCodeBase
        local @dwEntry
;#######################打开文件##########################################################
        invoke    CreateFile,_filename,
        GENERIC_READ+GENERIC_WRITE,
        FILE_SHARE_READ+FILE_SHARE_WRITE,
        NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
        .if eax == INVALID_HANDLE_VALUE
            jmp    exit2
        .endif
pe文件学习笔记1-----为PE文件添加节,添加目标文件。        mov    hFile,eax
        invoke    CreateFileMapping,hFile,NULL,PAGE_READWRITE,0,0,0
        mov    hMapping,eax
        invoke    MapViewOfFile,hMapping,FILE_MAP_READ+FILE_MAP_WRITE,0,0,0
        mov    pMapping,eax        
;########################找到pe头#########################################################
        mov    esi,eax
        assume    esi:ptr    IMAGE_DOS_HEADER