📄 pcshrink.asm
字号:
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 + -