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

📄 unpacker.asm

📁 一个用汇编写的基于BCE32的压缩和解压引擎
💻 ASM
字号:
.586
.model flat, stdcall
option casemap :none   ; case sensitive
include c:\hd\hd.h
include c:\hd\mac.h
;~~~~~~~~~~~~~~~~~~~protos
;~~~~~~~~~~~~~~~~~~~~~~~~~
SEH_    = 0
DECOMPRESS=1
COMPRESS=0
;;--------------
;##########################################################################
	CurDate		TEXTEQU		<">, @Date, <">
	CurTime		TEXTEQU		<">, @Time, <">
	CurFileName	TEXTEQU		<">, @FileCur, <">
;##########################################################################

	.DATA
szAbout         db 13,10,"Hume's huffman basis unpacker Version 1.0...."
                db 13,10,"Built on ",CurDate,"  ",CurTime
                db 13,10,"web   - humeasm.yeah.net"
                db 13,10,"Email - humewen@21cn.com",13,10,0
another         db "Another "
usage           db "Usage : unpack in.* out.* ",13,10,0
                
	.DATA?
hInstance	dd ?
rb      buf,256
rb      cInputname,64
rb      cOutputname,64
rd      src_hfile
rd      src_hfmap
rd      src_pview
rd      src_size

rd      dst_hfile
rd      dst_size
;;-----------------------------------------
	.CODE
        include ..\common\cmd.inc
__Start:
      IF      SEH_
        push    offset EXC_XIT
        push    fs:[0]
        mov     fs:[0],esp   
      ENDIF

	call    process_cmd

        lea     esi,szAbout
        call    write_con_string
        
        mov     ecx,argc
        dec     ecx
        jecxz   wait_for_input
        .if     (ecx==1) || (ecx>2)
                mov     esi,CTEXT(13,10,"Syntax error",13,10)
                call    write_con_string
                lea     esi,usage 
                call    write_con_string
        .endif
        
         INVOKE	lstrcpy,addr cInputname,dword ptr [argv+4]
         INVOKE	lstrcpy,addr cOutputname,dword ptr [argv+8]
         jmp    passed_cmd_line

      wait_for_input:
        lea     esi,another
        call    write_con_string
        mov     esi,CTEXT(13,10,"Please INPUT the packed file:",13,10)
        call    write_con_string
        lea     edi,buf
        mov     ecx,256
        call    read_con_string

        dec     $zreg(ecx)
        mov     al,0dh
        lea     edi,buf
        repnz   scasb
        jnz     err_no_input_names
        neg     ecx
        dec     ecx
        dec     ecx
        je      err_no_input_names
        mov     byte  ptr [edi-1],0
        INVOKE	lstrcpy,addr cInputname,addr buf
        INVOKE	lstrcpy,addr cOutputname,addr buf
        INVOKE	wsprintf,addr cOutputname,CTEXT("%s%s"),addr cOutputname,CTEXT(".upd")
        ;INVOKE	MessageBox,0,addr cOutputname,0,0
;--------------[file for output and input ]---------------------------
     passed_cmd_line:
        INVOKE	CreateFile,addr cInputname,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE,eax,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,$zreg()
        JEAXS   error_openfile_fail
        mov     src_hfile,eax

        INVOKE	GetFileSize,src_hfile,0
        JEAXZ   error_zero_file
        mov     src_size,eax
        
        INVOKE	CreateFileMapping,src_hfile,EAX,PAGE_READWRITE,EAX,EAX,$zreg()
        JEAXZ   error_map_fail
        mov     src_hfmap,eax    
        
        INVOKE	MapViewOfFile,src_hfmap,FILE_MAP_ALL_ACCESS,EAX,EAX,$zreg()
        JEAXZ   error_view_fail
        mov     src_pview,eax

        ;------------ [create output files] ---------------------
        
        INVOKE	CreateFile,addr cOutputname,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_READ+FILE_SHARE_WRITE,eax,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,$zreg()
        JEAXS   error_out_openfile_fail
        mov     dst_hfile,eax

                ; *begin decompress data
                ; *
                ; *using hc32_decompress routine
                ; *__________________________________________
        
        
        mov     esi,src_pview
        lodsd
        add     eax,9
        cmp     eax,src_size
        jne     err_not_packed
        lodsd                   ;the workmem least size


        add     eax,1000h       ;+4096 bytes
        mov     GDD(src_work_s1),eax
        INVOKE	VirtualAlloc,0,eax,MEM_COMMIT,PAGE_EXECUTE_READWRITE
        JEAXZ   error_alloc_fail
        mov     GDD(src_mem),eax

        mov     esi,src_pview
        mov     edi,src_mem
        call    hC32_decompress
        mov     dst_size,edx

        inc     GDD(n_passes)
        
        mov     esi,src_mem
        lodsd
        add     eax,9
        cmp     eax,dst_size
        jne     dcompr_once_ok


     lop_decompr_:
        lodsd
        add     eax,1000h
        mov     GDD(dst_work_s2),eax
        INVOKE	VirtualAlloc,0,eax,MEM_COMMIT,PAGE_EXECUTE_READWRITE
        JEAXZ   error_alloc_fail
        mov     GDD(dst_mem),eax

        mov     esi,src_mem
        mov     edi,dst_mem
        call    hC32_decompress
        mov     dst_size,edx

        inc     n_passes
        
        mov     eax,dst_mem
        xchg    eax,src_mem
        xchg    eax,dst_mem

        mov     eax,dst_work_s2
        xchg    eax,src_work_s1
        xchg    eax,dst_work_s2

        pushad
        INVOKE	VirtualFree,dst_mem,dst_work_s2,MEM_RELEASE
        popad

        mov     esi,src_mem
        lodsd
        add     eax,9
        cmp     eax,dst_size
        jne     dcompr_ok

        
        jmp     lop_decompr_


dcompr_once_ok:
dcompr_ok:
        INVOKE	WriteFile,dst_hfile,src_mem,dst_size,$GDD(cb_Fw),0
        INVOKE	VirtualFree,src_mem,src_work_s1,MEM_RELEASE

        mov     eax,dst_size
        sub     eax,src_size
        INVOKE	wsprintf,addr buf,CTEXT(13,10,"origin %d, new %d, %d Increased,%d passes...."),src_size,dst_size,eax,n_passes
        lea     esi,buf
        call    write_con_string

        ;------[ uninstall seh frame ]-------
        IF      SEH_
        pop     fs:[0]
        pop     eax
        ENDIF
;-----------------------------------------

        
      err_xit:  
        call    Clear_handles
        INVOKE	Sleep,8000
	invoke ExitProcess,0
;-----------------------------------------        
include ..\common\console.inc  
include ..\common\hc32.inc
include err.inc
;-----------------------------------------
;----------[Close all handles while Exit ]-------------------                                
      Clear_handles:   

        .IF     src_hfile
                INVOKE	UnmapViewOfFile,src_pview
                INVOKE	CloseHandle,src_hfmap
                INVOKE	CloseHandle,src_hfile
        .ENDIF

        .IF     dst_hfile 
                INVOKE	CloseHandle,dst_hfile
        .ENDIF

        .IF     (error_mode==1) || (!dst_size)
                INVOKE	DeleteFile,addr cOutputname
        .ENDIF
        ret
END	__Start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -