⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ee.asm

📁 EXE二合一源代码!不用多说了!用tasm编译!
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;=========================================< 彬 >==
;名  称:二合一
;用  途:将两个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 + -