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

📄 pcshrink.asm

📁 WIN95/98 PE压缩软件源程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
sl:
        cmp     byte ptr [esi],0                ; if first byte is NULL then something way wrong
        jz      no_cmd_line
        shl     eax,8                           ; rotate 1 byte in eax, for loop.. eax running load
        lodsb                       		    ; get next byte in al
        ;cmp	eax,'RINK'
        ;jz	is_eoc
        cmp     eax,'rink'                      ; end of our proggie name?
        jnz     not_eoc
is_eoc:        
        cmp     byte ptr [esi],'.'
        jnz     esl
not_eoc:    
        cmp     eax,'.exe'                      ; .exe end of our proggie name?
        jz      esl
        cmp     eax,'.EXE'                      ; .EXE end of our proggie name?
        jnz     sl
esl:
        lodsb
        cmp     al,' '
        jz      esl             
        cmp     al,'"'
        jz      esl
        dec     esi
esl2:    
        ;cmp     byte ptr [esi],0                ; if first char in parameter 1 is NULL then we fuq
        ;jz      _exit_bad_cmd_line    
        call	lstrcpy,offset cmdline_file,esi
        
no_cmd_line:        
	call 	GetModuleHandleA,0
	mov	hInst,eax
  	 	 	 	
 	call	DialogBoxParamA, eax, IDD_DIALOG1, 0, offset WndProc, 0	
        call	ExitProcess,eax
        

MainCompressFile proc
        mov	fnameptr,offset cmdline_file
        call    lstrcat,offset success_txt,fnameptr               ; append filename to success message
        call    CompressFile                     ; go encrypt                
        cmp     error,-4
        jz      _exit        
        cmp     error,-1                        ; error?
        jz      _exit_error                     ; if so go display error message
                        
        call    lstrcat,offset success_txt,offset obj_txt 
        call    lstrcat,offset success_txt,offset eobj_txt 
        call    lstrcat,offset success_txt,offset size_txt

        call    MessageBoxA,0,offset success_txt,offset caption,0
        xor     eax,eax           
        jmp     _exit             

_exit_error:
        call    lstrcat,offset error_txt,fnameptr
        call    MessageBoxA,0,offset error_txt,offset caption,MB_ICONEXCLAMATION
        mov     eax,2              
;        jmp     _exit              
 
;_exit_bad_cmd_line: 
;        call    MessageBoxA,0,offset badcmd_txt,offset caption,MB_ICONEXCLAMATION
;        xor     eax,eax           
;        inc     eax               
_exit:    
        call	PostQuitMessage,0
        ret        
MainCompressFile endp

WndProc PROC   hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
	USES ebx, edi, esi							
	
	mov	eax,hwnd
	mov	hMain,eax
	cmp	wmsg,WM_COMMAND
	jz	IsCommand	
	cmp	wmsg,WM_CLOSE
	jz	Quit
	cmp	wmsg,WM_INITDIALOG
	jz	Init
WndProcEnd:		
	xor	eax,eax
	ret	
	IsCommand:
	cmp	wparam,IDOK
	jnz	NextWp0	
		call	GetDlgItemTextA, hMain, IDC_EDIT1, offset cmdline_file,255
		call	IsDlgButtonChecked, hMain, IDC_RESTRUCTURE
		mov	RestructureResources,eax
		call	IsDlgButtonChecked, hMain, IDC_MERGE
		mov	SectionMerging,eax
		call	MainCompressFile
		jmp	WndProcEndProcessed
NextWp0:	
	cmp	wparam,IDC_BROWSE
	jz	getfile
	cmp	wparam,IDCANCEL
	jz	Quit	
	jmp	WndProcEnd
WndProcEndProcessed:
	mov	eax,1
	ret
Quit:
	call	PostQuitMessage,0
	ret	
Init:	
        call    LoadIconA,hInst,IDI_ICON1                                                 
        push	eax
        call    SendMessageA,hMain,WM_SETICON,ICON_SMALL,eax      
        pop 	eax
        call    SendMessageA,hMain,WM_SETICON,ICON_BIG,eax       		
	call	SetDlgItemTextA, hMain, IDC_EDIT1, offset cmdline_file
	call	CheckDlgButton, hMain, IDC_RESTRUCTURE, RestructureResources
	call	CheckDlgButton, hMain, IDC_MERGE, SectionMerging
	jmp	WndProcEnd
getfile:
	mov	eax,hMain
	mov	ofn.hWndOwner,eax			
	mov	ofn.lpstrFilter,offset filter	
	mov	ofn.lpstrFile,offset cmdline_file
	mov	ofn.lStructSize,size ofn
	mov	ofn.nMaxFile,255
	mov	ofn.ofn_Flags,OFN_HIDEREADONLY	
	call	GetOpenFileNameA, offset ofn
	or	eax,eax
	jz	no_file
	call	SetDlgItemTextA, hMain, IDC_EDIT1, offset cmdline_file
no_file:	
	jmp	WndProcEndProcessed	
WndProc	 endp
; --- ScanResourceDir(DWORD *rsrcdir)
;
ScanResourceDir proc
	pop	eax
	pop	esi	
	push	eax
	
	or	esi,esi
	jz	nothing_in_dir		
	movzx	ecx,word ptr [esi+NumberOfNamedEntries]
	add	cx,word ptr [esi+NumberOfIdEntries]
	add	esi,size ResourceDir
	or	ecx,ecx
	jz	nothing_in_dir	
dir_entry_loop:	
	mov	ebx,[esi+OffsetToData]
	test	ebx,80000000h
	jz	isData			
	cmp	TreeLevel,0
	jnz	doscan_dir
	cmp	[esi+Name],RT_ICON
	jz	uncompressable
	cmp	[esi+Name],RT_GROUPICON
	jz	uncompressable
	cmp	[esi+Name],RT_VERSIONINFO
	jnz	compressable
uncompressable:	
	mov	CompressableRsrc,0
	jmp	doscan_dir
compressable:
	mov	CompressableRsrc,1
doscan_dir:	
	and	ebx,7fffffffh
	add	ebx,RsrcStartRva		
	pushad
	inc	TreeLevel
	call	ScanResourceDir,ebx;,[esi+Name]
	dec	TreeLevel
	popad
go_dir_loop:	
	add	esi,size ResourceDirEntry
	loop	dir_entry_loop
	jmp	nothing_in_dir
isData:
	pushad
	call	GetRsrcRva
	popad
	jmp	go_dir_loop
nothing_in_dir:
	mov	eax,RsrcDisplacement
	ret	
ScanResourceDir endp

; ebx->OffsetToData
GetRsrcRva proc	
	and	ebx,7fffffffh
	add	ebx,RsrcStartRva
	mov	esi,ebx
	cmp	CompressableRsrc,1
	jz	is_compressable_data
	mov	edx,curUncompressableRsrcTable
	add	curUncompressableRsrcTable,size VgRsrcTable
	jmp	setup_rsrc_table
is_compressable_data:
	mov	edx,curCompressableRsrcTable
	add	curCompressableRsrcTable,size VgRsrcTable
setup_rsrc_table:	
	mov	[edx+VgRsrcTableEntryAddress],esi			
	mov	ecx,[esi+Size]
	push	ebx ecx edx esi edi ebp
	call	HeapAlloc,HeapHandle,HEAP_ZERO_MEMORY,ecx
	pop	ebp edi esi edx ecx ebx
	mov	[edx+VgRsrcTableDataHandle],eax
	push	eax
	mov	ebx,dword ptr [esi+DataRVA]
	call	CalcPhysicalAddress	
	add	ebx,map_ptr	
		
	; save the resource data in allocated mem
	pop	edi
	mov	ecx,[esi+Size]
	mov	esi,ebx	
	rep	movsb	
	
	sub	ebx,RsrcStartRva
	
GetRsrcRva_e:	
	ret
GetRsrcRva endp

; --- InitRsrcTables
; Initialize the compressable and uncompressable resource tables
InitRsrcTables proc	
	call	HeapAlloc,HeapHandle,HEAP_ZERO_MEMORY,size VgRsrcTable*1000	
	mov	pCompressableRsrcTable,eax
	mov	curCompressableRsrcTable,eax
	call	HeapAlloc,HeapHandle,HEAP_ZERO_MEMORY,size VgRsrcTable*1000		
	mov	pUncompressableRsrcTable,eax
	mov	curUncompressableRsrcTable,eax
	ret
InitRsrcTables endp
; -- UninitRsrcTables 
;
UninitRsrcTables proc
	call	HeapFree,HeapHandle,0,pUncompressableRsrcTable
	call	HeapFree,HeapHandle,0,pUncompressableRsrcTable
	;todo-traverse tables and perform deallocations (who cares<g>)
	ret
UninitRsrcTables endp

;
; --- DWORD FindResourceDataStart()
;
FindResourceDataStart proc        
        push	ebx ecx edx esi edi                
        call 	FindLowestRVAInTable,pCompressableRsrcTable
        push	eax
        call	FindLowestRVAInTable,pUncompressableRsrcTable     
        pop	ebx        
        cmp	ebx,eax
        ja	eax_low
        xchg	ebx,eax
eax_low:        
	pop	edi esi edx ecx ebx
	ret
FindResourceDataStart endp

; --- DWORD FindLowestRVAInTable(DWORD *VgRsrcTable)
;
FindLowestRVAInTable proc
	pop	eax
	pop	esi
	push	eax
	mov	edx,-1
start_loop:	
	mov	eax,[esi+VgRsrcTableEntryAddress]
	or	eax,eax
	jz	start_loop_done
	mov	ebx,[eax+DataRVA]	
	or	ebx,ebx
	jz	not_new_start1
	cmp	ebx,edx
	jae	not_new_start1
	mov	edx,ebx
not_new_start1:	
	add	esi,size VgRsrcTable
	jmp	start_loop	
start_loop_done:	
	xchg	edx,eax
	ret	
FindLowestRVAInTable endp
;
; --- DWORD FindResourceDataEnd()
;
FindUncompressableDataEnd proc        
        push	ebx ecx edx esi edi
        call 	FindHighestRVAInTable,pUncompressableRsrcTable
	pop	edi esi edx ecx ebx
	ret
FindUncompressableDataEnd endp

; --- DWORD FindHighestRVAInTable(DWORD *VgRsrcTable)
;
FindHighestRVAInTable proc
	pop	eax
	pop	esi
	push	eax
	xor	edx,edx
end_loop:
	mov	eax,[esi+VgRsrcTableEntryAddress]
	or	eax,eax
	jz	end_loop_done
	mov	ebx,[eax+DataRVA]
	add	ebx,[eax+Size]
	cmp	ebx,edx
	jbe	not_new_end1
	mov	edx,ebx
not_new_end1:	
	add	esi,size VgRsrcTable
	jmp	end_loop	
end_loop_done:	
	xchg	edx,eax
	ret	
FindHighestRVAInTable endp

;
;
; --- DWORD RestructureResourceSection(DWORD *DataStart)
;
RestructureResourceSection proc
	pop	eax
	pop	edi
	push	eax		
	call	PlaceResourceTable,edi,pUncompressableRsrcTable	
	push	eax	
	call	PlaceResourceTable,eax,pCompressableRsrcTable		
	;call	PlaceResourceTable,eax,offset HighestRsrc
	pop	eax
	ret
RestructureResourceSection endp

; --- DWORD *End PlaceResourceTable(DWORD *dest, DWORD *VgRsrcTable)
;
PlaceResourceTable proc
	pop	eax
	pop	edi
	pop	edx
	push	eax
place_rsrc_loop:
	mov	eax,[edx+VgRsrcTableEntryAddress]
	or	eax,eax
	jz	place_loop_done	
	mov	ebx,[eax+DataRVA]
	mov	ebx,edi
	sub	ebx,map_ptr
	push	eax edx		
	call	CalcVirtualAddress				
	pop	edx eax		
	mov	dword ptr [eax+DataRVA],ebx	
	mov	esi,[edx+VgRsrcTableDataHandle]
	mov	ecx,[eax+Size]	
	rep	movsb
next_vgrsrc:	
	add	edx,size VgRsrcTable
	jmp	place_rsrc_loop
place_loop_done:	
	mov	eax,edi
	ret
PlaceResourceTable endp
;
; --- RemoveReloc(DWORD *pehdr, DWORD *objtable)
; Remove or zero the .reloc section.
; (realignment will take care of adjusting objects upwards)
; 
RemoveReloc proc		
	pop	eax
	pop	esi
	pop	edi	
	push	eax
			
	movzx	ecx,word ptr [esi+numObj]
scan_objs:	
	cmp	dword ptr [edi],'ler.'
	jz	found_reloc
	add	edi,40
	loop	scan_objs
	jmp	no_reloc
found_reloc:		
	cmp	ecx,1
	jnz	reloc_not_last
	dec	word ptr [esi+numObj]
	pushad
	xor	eax,eax
	mov	ecx,40
	rep	stosb
	popad
reloc_not_last:			
	mov	dword ptr [edi+objpsize],0	
        mov	dword ptr [esi+160],0
        mov	dword ptr [esi+164],0			
        mov	ax,[esi+Flags]
        or	ax,1			; set "relocations stripped"
      	mov	[esi+Flags],ax

no_reloc:	
	ret
RemoveReloc endp

PutSectionTableEntry proc
	push 	ebx
	mov	ebx,curSectionTableDisplacement
	mov	[ebx+MergeTable],1
	mov	[ebx+CompressedSizeTable],eax
	pop	ebx
	ret
PutSectionTableEntry endp
;-----------------------------------------------
; Compress file - call with fnameptr set
;
CompressFile proc

        call    GetFileAttributesA,fnameptr        
        mov     oldattrib,eax                                                      
                                                                                   
        cmp     eax,-1                             
        jnz     not_shared                                                         
        ret                                        

not_shared:
        call    SetFileAttributesA,fnameptr,20h    
        
        mov     esi,fnameptr
        call    OpenFile        
        call    test_error
        jnc     open_ok
        ret         
open_ok:        		
        mov     handle,eax                                                                                                                                                      
       	;mov	eax,handle
       	;push	eax
	;call	AlignFile        
	;pop	eax                   	                                                                                 
        call    GetFileTime,eax,offset lastwrite,offset lastaccess,offset creation   
                                                                                   
        xor     ecx,ecx                                ; only map size of file      

⌨️ 快捷键说明

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