?? ee.asm
字號:
;=========================================< 彬 >==
;名 稱:二合一
;用 途:將兩個PE文件合成一個PE文件執行
;語 言:TASM32
;日 期:2001年
;備 注:
;=================================================
;作 者:彬 (vBin)
;出 處:Http://www.vbin.org
;用 處:學習使用
;-------------------------------------------------
;---------------------------------------------
VZL_MAIN = 1001 ;主對話框
VZL_SRCTA = 2001 ;第一個文件文本框
VZL_SRCTB = 2002 ;第二個文件文本框
VZL_CSRCA = 2003 ;第一個文件按鈕
VZL_CSRCB = 2004 ;第二個文件按鈕
VZL_MAKE = 2005 ;合并文件按鈕
VZL_ABOUTUS = 2006 ;關于按鈕
VZL_HIGHRUN = 2007 ;隱藏執行
;詳情見EE.rc資源文件
;------------------------------------(上面的)--
.386p
.model flat,stdcall
include win32.inc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn GetModuleHandleA:proc
extrn DialogBoxParamA:proc
extrn EndDialog:proc
extrn SetDlgItemTextA:proc
extrn CreateFileA:proc
extrn SetFilePointer:proc
extrn ReadFile:proc
extrn RtlZeroMemory:proc
extrn WriteFile:proc
extrn CloseHandle:proc
extrn lstrcmp:proc
extrn lstrcat:proc
extrn lstrcpy:proc
extrn CreateFileMappingA:proc
extrn MapViewOfFile:proc
extrn UnmapViewOfFile:proc
extrn GetFileSize:proc
extrn GetOpenFileNameA:proc
extrn CopyFileA:proc
extrn _wsprintfA:proc
;----------------------------------------------------------------------
;----------------------------------------------------------------------
GENERIC_READ equ 80000000h
GENERIC_WRITE equ 40000000h
FILE_SHARE_READ equ 1h
FILE_SHARE_WRITE equ 2h
OPEN_EXISTING equ 3
FILE_ATTRIBUTE_NORMAL equ 80h
INVALID_HANDLE_VALUE equ -1
FILE_BEGIN equ 0
FILE_CURRENT equ 1
FILE_END equ 2
FILE_ATTRIBUTE_ARCHIVE equ 20h
PAGE_READWRITE equ 4
FILE_MAP_WRITE equ SECTION_MAP_WRITE
SECTION_MAP_WRITE equ 0002h
OFN_FILEMUSTEXIST equ 00001000h
OFN_HIDEREADONLY equ 00000004h
OFN_PATHMUSTEXIST equ 00000800h
OFN_EXPLORER equ 00080000h
OFN_LONGNAMES equ 00200000h
;------------------------------------------------------PE文件結構-------
IMAGE_NUMBEROF_DIRECTORY_ENTRIES equ 16
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress DWORD ?
isize DWORD ?
IMAGE_DATA_DIRECTORY ENDS
IMAGE_OPTIONAL_HEADER32 STRUCT
Magic WORD ?
MajorLinkerVersion BYTE ?
MinorLinkerVersion BYTE ?
SizeOfCode DWORD ?
SizeOfInitializedData DWORD ?
SizeOfUninitializedData DWORD ?
AddressOfEntryPoint DWORD ?
BaseOfCode DWORD ?
BaseOfData DWORD ?
ImageBase DWORD ?
SectionAlignment DWORD ?
FileAlignment DWORD ?
MajorOperatingSystemVersion WORD ?
MinorOperatingSystemVersion WORD ?
MajorImageVersion WORD ?
MinorImageVersion WORD ?
MajorSubsystemVersion WORD ?
MinorSubsystemVersion WORD ?
Win32VersionValue DWORD ?
SizeOfImage DWORD ?
SizeOfHeaders DWORD ?
CheckSum DWORD ?
Subsystem WORD ?
DllCharacteristics WORD ?
SizeOfStackReserve DWORD ?
SizeOfStackCommit DWORD ?
SizeOfHeapReserve DWORD ?
SizeOfHeapCommit DWORD ?
LoaderFlags DWORD ?
NumberOfRvaAndSizes DWORD ?
DataDirectory IMAGE_DATA_DIRECTORY IMAGE_NUMBEROF_DIRECTORY_ENTRIES dup(<>)
IMAGE_OPTIONAL_HEADER32 ENDS
IMAGE_FILE_HEADER STRUCT
Machine WORD ?
NumberOfSections WORD ?
TimeDateStamp DWORD ?
PointerToSymbolTable DWORD ?
NumberOfSymbols DWORD ?
SizeOfOptionalHeader WORD ?
Characteristics WORD ?
IMAGE_FILE_HEADER ENDS
IMAGE_NT_HEADERS STRUCT
Signature DWORD ?
FileHeader IMAGE_FILE_HEADER <>
OptionalHeader IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS ENDS
;---------------------------------------------------------------------
my_section struc
obj_name db '.data',0,0,0 ; 塊名
virt_size dd 0 ; 塊長
virt_addr dd 0 ; 該塊RVA地址
raw_size dd 0 ; 該塊物理長度
raw_offset dd 0 ; 該塊物理偏移
unused dd 0,0,0 ; 未用
obj_flags dd 0E0000020h ; 屬性 (r/w/c/x)
my_section ends
;---------------------------------------------------------------------
OPENFILENAMEA STRUCT
lStructSize DWORD ?
hwndOwner DWORD ?
hInstance DWORD ?
lpstrFilter DWORD ?
lpstrCustomFilter DWORD ?
nMaxCustFilter DWORD ?
nFilterIndex DWORD ?
lpstrFile DWORD ?
nMaxFile DWORD ?
lpstrFileTitle DWORD ?
nMaxFileTitle DWORD ?
lpstrInitialDir DWORD ?
lpstrTitle DWORD ?
vFlags DWORD ?
nFileOffset WORD ?
nFileExtension WORD ?
lpstrDefExt DWORD ?
lCustData DWORD ?
lpfnHook DWORD ?
lpTemplateName DWORD ?
OPENFILENAMEA ENDS
OPENFILENAME equ <OPENFILENAMEA>
;-----------------------------------------------------------------------
.data
AppName db "Blend 2001",0
templ db "值是:%lx",0
;===============================================================
FileFilter db "可執行文件",0,"*.exe",0,0
OpenFileTitle db "請選 A 文件",0
OpenFileTitleB db "請選 B 文件",0
BakFilter db ".bak",0
;=============================================< PE部份專用 >=====
PE_head_addr dd 0
checker_len dd 0
PE_head IMAGE_NT_HEADERS <0> ; PE文件頭的結構
Section_table db 280h dup (0)
Head_len equ size PE_head+size Section_table ; PE文件頭和塊表的長度
Import_len equ vImport_End-v_ImportA
new_section my_section <>
secbuffer db 512 dup (0)
tempbuffer db 128 dup (0)
hFile dd 0
now_in dd 0
now_base dd 0
now_basein dd 0
byte_read dd 0
Section_addr dd 0
temp_virt_addr dd 0
temp_raw_size dd 0
hFile_st dd 0
hFile_s dd 0
hFMap_s dd 0
hFile_d dd 0
hMemory dd 0
ReadBye dd 0
;=============================================================
Err_Title db "非法操作",0
Suc_Title db "建立成功 -- 報告",0
Err_str db "由于未知原因,建立失敗!",0
ErrA_str db "A 號文件正在使用中或不存在!本程序無法對他進行操作!",0
ErrB_str db "B 號文件正在使用中或不存在!本程序無法對他進行操作!",0
ErrC_str db "A 號文件無足夠空間存放 B 號文件!",0
ErrD_str db "A 文件與 B 文件不準是同一個文件!",0
ErrE_str db "測試版每次只能操作一次!",0
FileReport db "-- 生成文件 --",0dh,0ah
db " 文件名: %s",0dh,0ah
db " 尺 寸: %lu K",0dh,0ah,0dh,0ah
db "-- B 號文件 --",0dh,0ah
db " 文件名: %s",0dh,0ah
db " 尺 寸: %lu K",0dh,0ah,0dh,0ah
db "-- 原 A 文件 --",0dh,0ah
db " 文件名: %s",0dh,0ah
db " 尺 寸: %lu K",0dh,0ah,0dh,0ah
db 0
About_Me db "軟件名: 二合一 (Blend 2001)",0dh,0ah
db "版本號: 1.0 Beta",0dh,0ah
db "設 計: 彬 (vBin)",0dh,0ah
db "E-mail: vBin@163.net",0dh,0ah
db "網 站: Http://vbin.51.net",0dh,0ah
db "CopyRight (C) 2001 vBin All Rights Reserved",0dh,0ah,0dh,0ah
db " ~~ AngelSoft WorkGroup ~~ ",0
;===============================================================
RunFirst dd 0
.data?
MainhWnd dd ?
vhInstance dd ?
vsize dd ?
buffer db 250 dup (?) ;FILE A的文件路徑
buffert db 250 dup (?) ;FILE B的文件路徑
bakfile db 250 dup (?)
ShowInfoText db 500 dup (?)
VFile OPENFILENAME <?> ;對話框結構
VFileB OPENFILENAME <?> ;對話框結構
tempfileh dd ? ;臨時文件句柄
CreateOK dd ? ;是否成功
FileASize dd ?
FileBSize dd ?
FileCSize dd ?
.code
start:
call GetModuleHandleA,0
mov [vhInstance],eax
call DialogBoxParamA,eax,VZL_MAIN,NULL,offset MainProc,NULL
call ExitProcess,0
MainProc proc uses edx edi esi,hWnd:dword,wMsg:dword,wParam:dword,lParam:dword
.if wMsg==WM_CLOSE
call EndDialog,hWnd,NULL
.elseif wMsg==WM_COMMAND
.if lParam!=0
mov eax,wParam
mov edx,eax
shr edx,16
.if dx==BN_CLICKED
.if ax==VZL_MAKE
;------------------------------------------\/-
.if [RunFirst]==1
call MessageBoxA,[MainhWnd],offset ErrE_str,offset Err_Title,64
jmp exit_VZL_MAKE
.endif
; 通過RunFirst檢測程序是否第一次運行
; 注:本程序只能運行一次,為什么這樣請看見面。
;------------------------------------(上面的)--
mov [CreateOK],0
; 初始化 CreateOK
;------------------------------------(上面的)--
call initfile
; 對所選擇的兩個EXE文件進行檢測、記錄其大小
; 等信息,必且備份源文件
;------------------------------------(上面的)--
.if eax==1
call MakePe
mov eax,[CreateOK]
.if eax==0
call MessageBoxA,[MainhWnd],offset Err_str,offset Err_Title,64
.else
mov [RunFirst],1
call ShowFileInfo
.endif
.endif
; 記錄文件大小等操作成功后
; 調用 makepe 生成合并后的EXE文件
; CreateOK為返回值 0=失敗 否則 成功
;------------------------------------(上面的)--
exit_VZL_MAKE:
.elseif ax==VZL_CSRCA
call SelectAFile
; 選擇 A 文件
;------------------------------------(上面的)--
.elseif ax==VZL_CSRCB
call SelectBFile
; 選擇 B 文件
;------------------------------------(上面的)--
.elseif ax==VZL_ABOUTUS
call MessageBoxA,[MainhWnd],offset About_Me,offset AppName,0
.else
.endif
.endif
.endif
.elseif wMsg==WM_INITDIALOG
push [hWnd]
pop [MainhWnd]
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
MainProc endp
ShowFileInfo proc ; 顯示生成后的文件大小比對信息
call CreateFileA,offset buffer,GENERIC_READ or GENERIC_WRITE, \
FILE_SHARE_READ or FILE_SHARE_WRITE, \
NULL,OPEN_EXISTING, \
FILE_ATTRIBUTE_NORMAL,NULL
mov [tempfileh],eax
.if eax==INVALID_HANDLE_VALUE
call MessageBoxA,[MainhWnd],offset ErrB_str,offset Err_Title,64
mov eax,0
jmp exit_initfile
.else
call GetFileSize,[tempfileh],NULL
mov ecx,1024
cdq
div ecx
mov [FileASize],eax
.endif
; 計算新生成的文件的大小 單位(K)
;------------------------------------(上面的)--
call CloseHandle,[tempfileh]
call RtlZeroMemory,offset ShowInfoText,size ShowInfoText
call _wsprintfA,offset ShowInfoText,offset FileReport,offset buffer,[FileASize],offset buffert,[FileBSize],offset bakfile,[FileCSize]
add esp,4*8
call MessageBoxA,[MainhWnd],offset ShowInfoText,offset Suc_Title,0
; 給予顯示
;------------------------------------(上面的)--
ret
ShowFileInfo endp
initfile proc
call lstrcmp,offset buffer,offset buffert
.if eax==0
call MessageBoxA,[MainhWnd],offset ErrD_str,offset Err_Title,64
mov eax,0
jmp exit_initfile
.endif
; 檢查一下兩個文件是否是同一文件
;------------------------------------(上面的)--
call CreateFileA,offset buffer,GENERIC_READ or GENERIC_WRITE, \
FILE_SHARE_READ or FILE_SHARE_WRITE, \
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -