返回
前端
分类

pe文件学习笔记3

日期: 2020-03-31 02:09 浏览次数 : 74

.386
必赢备用网址 ,.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib

在kernel中搜索api地址

 

;##########
InfectFile    proto    :dword
GetApiA         proto    :DWORD,:DWORD
;#########
.code

.386
.model flat,stdcall
option casemap:none
include windows.inc
GetApiA         proto    :DWORD,:DWORD
;;--------------

;**************************************************
;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

;###############插入代码############################
VStart:
appBase         dd ?
k32Base         dd ?
HostEntry    dd    ?
;#############################################
sGetModuleHandle       db "GetModuleHandleA",0
sGetProcAddress        db "GetProcAddress",0
sExitProcess           db "ExitProcess",0
sLoadLibrary           db "LoadLibraryA",0
sMessageBoxA           db "MessageBoxA",0

 

ShowError proto :DWORD
ShowBuffer proto 

aGetModuleHandle                dd 0
aGetProcAddress                 dd 0
aExitProcess                    dd 0
aLoadLibrary                    dd 0
aMessageBoxA                    dd 0

.code
k32Base         dd ?
;#############################################
sGetModuleHandle       db "GetModuleHandleA",0
sGetProcAddress        db "GetProcAddress",0
sExitProcess           db "ExitProcess",0
sLoadLibrary           db "LoadLibraryA",0
sMessageBoxA           db "MessageBoxA",0

.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码要用到的数据

u32                     db "User32.dll",0
k32                     db "Kernel32.dll",0

aGetModuleHandle                dd 0
aGetProcAddress                 dd 0
aExitProcess                    dd 0
aLoadLibrary                    dd 0
aMessageBoxA                    dd 0

.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

sztit                   db "by 无理取闹",0
szMsg                 db "我进来了,呵呵!",0
szBuffer    db    256 dup    (?)

 

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

lpApiAddrs      label   near
              dd      offset sGetModuleHandle
              dd      offset sGetProcAddress
              dd      offset sExitProcess
              dd      offset sLoadLibrary
              dd      0
;################获取api#########################################################
GetApiA         proc    Base:DWORD,sApi:DWORD
    local    @dwStringLength
    local    @return
    pushad
    ;#############计算api的长度#########################
    mov    edi,sApi
    mov    ecx,-1
    xor    al,al
    cld
    repnz    scasb
    mov    ecx,edi
    sub  

u32                     db "User32.dll",0
k32                     db "Kernel32.dll",0

 

sztit                   db "by 无理取闹",0
szMsg                 db "没有导入表哦!",0

 

lpApiAddrs      label   near
              dd      offset sGetModuleHandle
              dd      offset sGetProcAddress
              dd      offset sExitProcess
              dd      offset sLoadLibrary
       dd      offset sMessageBoxA
              dd      0
;#############################################
start:
 call    @F
@@: 
 pop     ebp                            
 sub     ebp,offset @B                ;重定位
 mov ecx,[esp]
 xor edx,edx
 and ecx,0FFFF0000h
getK32:      ;动态获取kernel.dll的地址
 sub ecx,010000h
 cmp word ptr [ecx],IMAGE_DOS_SIGNATURE
 jnz getK32
 mov esi,ecx
 add esi,[esi+3ch]
 cmp dword ptr [esi],IMAGE_NT_SIGNATURE
 jnz getK32
 mov k32Base,ecx
 ;#######################################
 lea     edi,[ebp+offset aGetModuleHandle]
 lea     esi,[ebp+offset lpApiAddrs]
loop_get:
 lodsd
 cmp     eax,0
 jz      End_Get