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