📄 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 + -