Linux vmi284606.contaboserver.net 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64
Apache/2.4.57 (Ubuntu)
: 167.86.127.34 | : 216.73.217.1
Cant Read [ /etc/named.conf ]
7.2.24-0ubuntu0.18.04.17
root
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
bin /
[ HOME SHELL ]
Name
Size
Permission
Action
X11
[ DIR ]
drwxr-xr-x
7z
39
B
-rwxr-xr-x
7za
40
B
-rwxr-xr-x
7zr
40
B
-rwxr-xr-x
GET
15.84
KB
-rwxr-xr-x
HEAD
15.84
KB
-rwxr-xr-x
POST
15.84
KB
-rwxr-xr-x
[
50.18
KB
-rwxr-xr-x
aa-enabled
22.16
KB
-rwxr-xr-x
aa-exec
22.16
KB
-rwxr-xr-x
ab
58.18
KB
-rwxr-xr-x
acpi_listen
14.27
KB
-rwxr-xr-x
add-apt-repository
7.24
KB
-rwxr-xr-x
addpart
22.08
KB
-rwxr-xr-x
appres
9.99
KB
-rwxr-xr-x
apropos
46.98
KB
-rwxr-xr-x
apt
14.09
KB
-rwxr-xr-x
apt-add-repository
7.24
KB
-rwxr-xr-x
apt-cache
78.16
KB
-rwxr-xr-x
apt-cdrom
22.16
KB
-rwxr-xr-x
apt-config
22.09
KB
-rwxr-xr-x
apt-extracttemplates
22.16
KB
-rwxr-xr-x
apt-ftparchive
234.16
KB
-rwxr-xr-x
apt-get
42.16
KB
-rwxr-xr-x
apt-key
26.75
KB
-rwxr-xr-x
apt-mark
42.16
KB
-rwxr-xr-x
apt-sortpkgs
42.09
KB
-rwxr-xr-x
arch
34.21
KB
-rwxr-xr-x
arj
437.04
KB
-rwxr-xr-x
arj-register
14.87
KB
-rwxr-xr-x
arjdisp
15.05
KB
-rwxr-xr-x
aspell
150.34
KB
-rwxr-xr-x
aspell-import
2
KB
-rwxr-xr-x
autoexpect
7.53
KB
-rwxr-xr-x
autopasswd
378
B
-rwxr-xr-x
awk
122.48
KB
-rwxr-xr-x
b2sum
54.21
KB
-rwxr-xr-x
base32
38.18
KB
-rwxr-xr-x
base64
38.18
KB
-rwxr-xr-x
basename
34.18
KB
-rwxr-xr-x
bashbug
6.95
KB
-rwxr-xr-x
bootctl
34.13
KB
-rwxr-xr-x
broadwayd
114.08
KB
-rwxr-xr-x
bsd-from
9.99
KB
-rwxr-xr-x
bsd-write
13.99
KB
-rwxr-sr-x
busctl
66.09
KB
-rwxr-xr-x
c_rehash
6.65
KB
-rwxr-xr-x
cabextract
26.51
KB
-rwxr-xr-x
cal
28.79
KB
-rwxr-xr-x
calendar
30.48
KB
-rwxr-xr-x
captoinfo
82.11
KB
-rwxr-xr-x
catchsegv
3.25
KB
-rwxr-xr-x
catman
38.46
KB
-rwxr-xr-x
cautious-launcher
853
B
-rwxr-xr-x
certbot
385
B
-rwxr-xr-x
chage
70.13
KB
-rwxr-sr-x
chardet3
389
B
-rwxr-xr-x
chardetect3
389
B
-rwxr-xr-x
chattr
14
KB
-rwxr-xr-x
chcon
62.18
KB
-rwxr-xr-x
check-language-support
2.71
KB
-rwxr-xr-x
checkgid
5.99
KB
-rwxr-xr-x
chfn
74.7
KB
-rwsr-xr-x
chrt
30.08
KB
-rwxr-xr-x
chsh
43.48
KB
-rwsr-xr-x
ckbcomp
146.33
KB
-rwxr-xr-x
cksum
34.18
KB
-rwxr-xr-x
clear
10
KB
-rwxr-xr-x
clear_console
10.07
KB
-rwxr-xr-x
cmp
46.09
KB
-rwxr-xr-x
codepage
13.99
KB
-rwxr-xr-x
col
9.99
KB
-rwxr-xr-x
colcrt
10
KB
-rwxr-xr-x
colrm
9.99
KB
-rwxr-xr-x
column
14.01
KB
-rwxr-xr-x
comm
38.21
KB
-rwxr-xr-x
compose
17.74
KB
-rwxr-xr-x
composer
1.54
KB
-rwxr-xr-x
corelist
12.53
KB
-rwxr-xr-x
cpan
7.96
KB
-rwxr-xr-x
cpan5.26-x86_64-linux-gnu
7.99
KB
-rwxr-xr-x
cpp
1022.94
KB
-rwxr-xr-x
cpp-7
1022.94
KB
-rwxr-xr-x
crontab
38.43
KB
-rwxr-sr-x
cryptdir
1.44
KB
-rwxr-xr-x
csplit
50.21
KB
-rwxr-xr-x
ctstat
22.35
KB
-rwxr-xr-x
curl
218.07
KB
-rwxr-xr-x
cut
42.21
KB
-rwxr-xr-x
dbus-cleanup-sockets
9.98
KB
-rwxr-xr-x
dbus-daemon
231.04
KB
-rwxr-xr-x
dbus-monitor
21.99
KB
-rwxr-xr-x
dbus-run-session
9.98
KB
-rwxr-xr-x
dbus-send
25.98
KB
-rwxr-xr-x
dbus-update-activation-environ...
13.98
KB
-rwxr-xr-x
dbus-uuidgen
9.98
KB
-rwxr-xr-x
deallocvt
10.07
KB
-rwxr-xr-x
deb-systemd-helper
19.67
KB
-rwxr-xr-x
deb-systemd-invoke
4.33
KB
-rwxr-xr-x
debconf
2.79
KB
-rwxr-xr-x
debconf-apt-progress
11.27
KB
-rwxr-xr-x
debconf-communicate
608
B
-rwxr-xr-x
debconf-copydb
1.68
KB
-rwxr-xr-x
debconf-escape
647
B
-rwxr-xr-x
debconf-set-selections
2.87
KB
-rwxr-xr-x
debconf-show
1.78
KB
-rwxr-xr-x
debian-distro-info
18.59
KB
-rwxr-xr-x
decryptdir
1.44
KB
-rwxr-xr-x
delpart
22.08
KB
-rwxr-xr-x
delv
40.86
KB
-rwxr-xr-x
desktop-file-edit
88.03
KB
-rwxr-xr-x
desktop-file-install
88.03
KB
-rwxr-xr-x
desktop-file-validate
76.26
KB
-rwxr-xr-x
dh_bash-completion
2.49
KB
-rwxr-xr-x
dh_perl_openssl
1.36
KB
-rwxr-xr-x
diff
142.34
KB
-rwxr-xr-x
diff3
62.21
KB
-rwxr-xr-x
dig
146.51
KB
-rwxr-xr-x
dircolors
46.19
KB
-rwxr-xr-x
dirmngr
533.55
KB
-rwxr-xr-x
dirmngr-client
106.76
KB
-rwxr-xr-x
dirname
30.18
KB
-rwxr-xr-x
dislocate
7.75
KB
-rwxr-xr-x
distro-info
18.59
KB
-rwxr-xr-x
do-release-upgrade
9.39
KB
-rwxr-xr-x
dpkg
290.5
KB
-rwxr-xr-x
dpkg-deb
150.34
KB
-rwxr-xr-x
dpkg-divert
138.41
KB
-rwxr-xr-x
dpkg-maintscript-helper
18.58
KB
-rwxr-xr-x
dpkg-query
146.4
KB
-rwxr-xr-x
dpkg-split
118.34
KB
-rwxr-xr-x
dpkg-statoverride
70.25
KB
-rwxr-xr-x
dpkg-trigger
66.26
KB
-rwxr-xr-x
du
98.21
KB
-rwxr-xr-x
dumpkeys
166.52
KB
-rwxr-xr-x
edit
17.74
KB
-rwxr-xr-x
editor
240.11
KB
-rwxr-xr-x
editres
68.4
KB
-rwxr-xr-x
eject
30.69
KB
-rwxr-xr-x
enc2xs
41.17
KB
-rwxr-xr-x
encguess
2.99
KB
-rwxr-xr-x
enchant
18.07
KB
-rwxr-xr-x
enchant-lsmod
9.99
KB
-rwxr-xr-x
env
34.18
KB
-rwxr-xr-x
envsubst
34.08
KB
-rwxr-xr-x
eqn
193.19
KB
-rwxr-xr-x
ex
2.55
MB
-rwxr-xr-x
expand
38.21
KB
-rwxr-xr-x
expect
10
KB
-rwxr-xr-x
expect_autoexpect
7.53
KB
-rwxr-xr-x
expect_autopasswd
378
B
-rwxr-xr-x
expect_cryptdir
1.44
KB
-rwxr-xr-x
expect_decryptdir
1.44
KB
-rwxr-xr-x
expect_dislocate
7.75
KB
-rwxr-xr-x
expect_ftp-rfc
686
B
-rwxr-xr-x
expect_kibitz
10.63
KB
-rwxr-xr-x
expect_lpunlock
2.56
KB
-rwxr-xr-x
expect_mkpasswd
5.26
KB
-rwxr-xr-x
expect_multixterm
29.78
KB
-rwxr-xr-x
expect_passmass
4.45
KB
-rwxr-xr-x
expect_rftp
8.68
KB
-rwxr-xr-x
expect_rlogin-cwd
504
B
-rwxr-xr-x
expect_timed-read
306
B
-rwxr-xr-x
expect_timed-run
280
B
-rwxr-xr-x
expect_tknewsbiff
11.12
KB
-rwxr-xr-x
expect_tkpasswd
16.18
KB
-rwxr-xr-x
expect_unbuffer
643
B
-rwxr-xr-x
expect_weather
2.03
KB
-rwxr-xr-x
expect_xkibitz
4.75
KB
-rwxr-xr-x
expect_xpstat
6.45
KB
-rwxr-xr-x
expiry
22.27
KB
-rwxr-sr-x
expr
46.18
KB
-rwxr-xr-x
factor
74.21
KB
-rwxr-xr-x
faillog
18.29
KB
-rwxr-xr-x
fallocate
26.08
KB
-rwxr-xr-x
fc-cache
14.07
KB
-rwxr-xr-x
fc-cat
14.07
KB
-rwxr-xr-x
fc-list
10.07
KB
-rwxr-xr-x
fc-match
10.07
KB
-rwxr-xr-x
fc-pattern
10.07
KB
-rwxr-xr-x
fc-query
10.07
KB
-rwxr-xr-x
fc-scan
10.07
KB
-rwxr-xr-x
fc-validate
10.07
KB
-rwxr-xr-x
fcgistarter
9.99
KB
-rwxr-xr-x
file
22.26
KB
-rwxr-xr-x
file-roller
505.57
KB
-rwxr-xr-x
find
232.5
KB
-rwxr-xr-x
flock
30.16
KB
-rwxr-xr-x
fmt
42.18
KB
-rwxr-xr-x
fold
34.18
KB
-rwxr-xr-x
free
18.08
KB
-rwxr-xr-x
from
9.99
KB
-rwxr-xr-x
ftp
98.7
KB
-rwxr-xr-x
ftp-rfc
686
B
-rwxr-xr-x
funzip
21.99
KB
-rwxr-xr-x
futurize
384
B
-rwxr-xr-x
gdk-pixbuf-thumbnailer
14.08
KB
-rwxr-xr-x
gen-preseed
2.51
KB
-rwxr-xr-x
geqn
193.19
KB
-rwxr-xr-x
getconf
30.13
KB
-rwxr-xr-x
getent
30.49
KB
-rwxr-xr-x
getkeycodes
10.07
KB
-rwxr-xr-x
getopt
14.07
KB
-rwxr-xr-x
gettext
34.08
KB
-rwxr-xr-x
gettext.sh
4.52
KB
-rwxr-xr-x
ginstall-info
43.09
KB
-rwxr-xr-x
git
2.27
MB
-rwxr-xr-x
git-receive-pack
2.27
MB
-rwxr-xr-x
git-shell
1.26
MB
-rwxr-xr-x
git-upload-archive
2.27
MB
-rwxr-xr-x
git-upload-pack
1.27
MB
-rwxr-xr-x
gnome-help
54.07
KB
-rwxr-xr-x
google-drive-ocamlfuse
6.68
MB
-rwxr-xr-x
gpasswd
74.05
KB
-rwsr-xr-x
gpg
997.6
KB
-rwxr-xr-x
gpg-agent
392.7
KB
-rwxr-xr-x
gpg-connect-agent
154.85
KB
-rwxr-xr-x
gpg-wks-server
187.02
KB
-rwxr-xr-x
gpg-zip
3.36
KB
-rwxr-xr-x
gpgconf
166.32
KB
-rwxr-xr-x
gpgparsemail
26.07
KB
-rwxr-xr-x
gpgsm
491.09
KB
-rwxr-xr-x
gpgsplit
78.45
KB
-rwxr-xr-x
gpgv
427.02
KB
-rwxr-xr-x
gpic
204.03
KB
-rwxr-xr-x
groff
105.31
KB
-rwxr-xr-x
grog
2.71
KB
-rwxr-xr-x
grops
165.72
KB
-rwxr-xr-x
grotty
121.34
KB
-rwxr-xr-x
groups
34.18
KB
-rwxr-xr-x
grub-editenv
239.93
KB
-rwxr-xr-x
grub-file
659.79
KB
-rwxr-xr-x
grub-fstest
789.65
KB
-rwxr-xr-x
grub-glue-efi
235.77
KB
-rwxr-xr-x
grub-kbdcomp
1.64
KB
-rwxr-xr-x
grub-menulst2cfg
216.04
KB
-rwxr-xr-x
grub-mkfont
264.34
KB
-rwxr-xr-x
grub-mkimage
328.84
KB
-rwxr-xr-x
grub-mklayout
240.09
KB
-rwxr-xr-x
grub-mknetdir
373.41
KB
-rwxr-xr-x
grub-mkpasswd-pbkdf2
244.12
KB
-rwxr-xr-x
grub-mkrelpath
235.49
KB
-rwxr-xr-x
grub-mkrescue
822.23
KB
-rwxr-xr-x
grub-mkstandalone
449.74
KB
-rwxr-xr-x
grub-mount
608.21
KB
-rwxr-xr-x
grub-ntldr-img
38.16
KB
-rwxr-xr-x
grub-render-label
676.16
KB
-rwxr-xr-x
grub-script-check
259.62
KB
-rwxr-xr-x
grub-syslinux2cfg
624.68
KB
-rwxr-xr-x
gtbl
126.2
KB
-rwxr-xr-x
gtk-builder-tool
26.42
KB
-rwxr-xr-x
gtk-launch
14.15
KB
-rwxr-xr-x
gtk-query-settings
9.99
KB
-rwxr-xr-x
gtk-update-icon-cache
30.47
KB
-rwxr-xr-x
h2ph
28.54
KB
-rwxr-xr-x
h2xs
59.44
KB
-rwxr-xr-x
hd
26.1
KB
-rwxr-xr-x
head
42.21
KB
-rwxr-xr-x
helpztags
2.46
KB
-rwxr-xr-x
hexdump
26.1
KB
-rwxr-xr-x
host
126.66
KB
-rwxr-xr-x
hostid
30.18
KB
-rwxr-xr-x
hostnamectl
18.07
KB
-rwxr-xr-x
htcacheclean
30
KB
-rwxr-xr-x
htdbm
21.99
KB
-rwxr-xr-x
htdigest
13.99
KB
-rwxr-xr-x
htpasswd
17.99
KB
-rwxr-xr-x
hwe-support-status
10.58
KB
-rwxr-xr-x
i386
18.34
KB
-rwxr-xr-x
iconv
62.25
KB
-rwxr-xr-x
id
42.21
KB
-rwxr-xr-x
info
245.72
KB
-rwxr-xr-x
infobrowser
245.72
KB
-rwxr-xr-x
infocmp
58.07
KB
-rwxr-xr-x
infotocap
82.11
KB
-rwxr-xr-x
innochecksum
3.52
MB
-rwxr-xr-x
install
142.25
KB
-rwxr-xr-x
install-info
43.09
KB
-rwxr-xr-x
instmodsh
4.27
KB
-rwxr-xr-x
ionice
26.08
KB
-rwxr-xr-x
ipcmk
26.14
KB
-rwxr-xr-x
ipcrm
26.08
KB
-rwxr-xr-x
ipcs
50.08
KB
-rwxr-xr-x
iptables-xml
92.74
KB
-rwxr-xr-x
ischroot
10.04
KB
-rwxr-xr-x
ispell-wrapper
7.05
KB
-rwxr-xr-x
join
46.21
KB
-rwxr-xr-x
json_pp
3.87
KB
-rwxr-xr-x
jsonlint-php
2.61
KB
-rwxr-xr-x
kbdinfo
14.07
KB
-rwxr-xr-x
kbxutil
158.69
KB
-rwxr-xr-x
kernel-install
4.4
KB
-rwxr-xr-x
kibitz
10.63
KB
-rwxr-xr-x
killall
27.12
KB
-rwxr-xr-x
laptop-detect
3.73
KB
-rwxr-xr-x
last
42.08
KB
-rwxr-xr-x
lastb
42.08
KB
-rwxr-xr-x
lastlog
18.07
KB
-rwxr-xr-x
lcf
7.6
KB
-rwxr-xr-x
ldd
5.29
KB
-rwxr-xr-x
less
166.76
KB
-rwxr-xr-x
lessecho
10.02
KB
-rwxr-xr-x
lessfile
8.36
KB
-rwxr-xr-x
lesskey
19.39
KB
-rwxr-xr-x
lesspipe
8.36
KB
-rwxr-xr-x
letsencrypt
385
B
-rwxr-xr-x
lexgrog
90.57
KB
-rwxr-xr-x
libnetcfg
15.41
KB
-rwxr-xr-x
link
30.18
KB
-rwxr-xr-x
linux-boot-prober
1.54
KB
-rwxr-xr-x
linux-check-removal
3.99
KB
-rwxr-xr-x
linux-update-symlinks
6.17
KB
-rwxr-xr-x
linux-version
2.63
KB
-rwxr-xr-x
linux32
18.34
KB
-rwxr-xr-x
linux64
18.34
KB
-rwxr-xr-x
listres
10.41
KB
-rwxr-xr-x
lnstat
22.35
KB
-rwxr-xr-x
loadkeys
206.57
KB
-rwxr-xr-x
loadunimap
26.13
KB
-rwxr-xr-x
locale
49.41
KB
-rwxr-xr-x
locale-check
10
KB
-rwxr-xr-x
localectl
22.07
KB
-rwxr-xr-x
localedef
330.8
KB
-rwxr-xr-x
locate
42.08
KB
-rwxr-sr-x
logger
46.67
KB
-rwxr-xr-x
logname
30.18
KB
-rwxr-xr-x
logresolve
10
KB
-rwxr-xr-x
look
10.23
KB
-rwxr-xr-x
lorder
2.82
KB
-rwxr-xr-x
lpunlock
2.56
KB
-rwxr-xr-x
lsattr
10
KB
-rwxr-xr-x
lsb_release
3.55
KB
-rwxr-xr-x
lscpu
70.08
KB
-rwxr-xr-x
lshw
682.95
KB
-rwxr-xr-x
lsinitramfs
625
B
-rwxr-xr-x
lsipc
70.08
KB
-rwxr-xr-x
lslocks
34.41
KB
-rwxr-xr-x
lslogins
62.08
KB
-rwxr-xr-x
lsmem
42.08
KB
-rwxr-xr-x
lsns
38.08
KB
-rwxr-xr-x
lsof
159.4
KB
-rwxr-xr-x
lspci
79.67
KB
-rwxr-xr-x
lspgpot
1.06
KB
-rwxr-xr-x
lsusb
114.43
KB
-rwxr-xr-x
ltrace
325.21
KB
-rwxr-xr-x
luit
48.12
KB
-rwxr-xr-x
lwp-download
10.05
KB
-rwxr-xr-x
lwp-dump
2.65
KB
-rwxr-xr-x
lwp-mirror
2.36
KB
-rwxr-xr-x
lwp-request
15.84
KB
-rwxr-xr-x
lzcat
74.36
KB
-rwxr-xr-x
lzcmp
6.48
KB
-rwxr-xr-x
lzdiff
6.48
KB
-rwxr-xr-x
lzegrep
5.76
KB
-rwxr-xr-x
lzfgrep
5.76
KB
-rwxr-xr-x
lzgrep
5.76
KB
-rwxr-xr-x
lzless
1.76
KB
-rwxr-xr-x
lzma
74.36
KB
-rwxr-xr-x
lzmainfo
10.07
KB
-rwxr-xr-x
lzmore
2.11
KB
-rwxr-xr-x
man
104.5
KB
-rwxr-xr-x
mandb
126.72
KB
-rwxr-xr-x
manpath
30.47
KB
-rwxr-xr-x
mapscrn
22.13
KB
-rwxr-xr-x
mawk
122.48
KB
-rwxr-xr-x
mcookie
30.14
KB
-rwxr-xr-x
md5sum
42.21
KB
-rwxr-xr-x
md5sum.textutils
42.21
KB
-rwxr-xr-x
mdig
42.13
KB
-rwxr-xr-x
mesg
10.07
KB
-rwxr-xr-x
migrate-pubring-from-classic-g...
2.14
KB
-rwxr-xr-x
mk_modmap
15.78
KB
-rwxr-xr-x
mkfifo
62.18
KB
-rwxr-xr-x
mlocate
42.08
KB
-rwxr-sr-x
mlock
9.99
KB
-rwxr-sr-x
mpack
26.04
KB
-rwxr-xr-x
mtr
71.94
KB
-rwxr-xr-x
mtr-packet
25.99
KB
-rwxr-xr-x
multixterm
29.78
KB
-rwxr-xr-x
munpack
45.95
KB
-rwxr-xr-x
my_print_defaults
3.45
MB
-rwxr-xr-x
myisam_ftdump
3.75
MB
-rwxr-xr-x
myisamchk
3.85
MB
-rwxr-xr-x
myisamlog
3.73
MB
-rwxr-xr-x
myisampack
3.78
MB
-rwxr-xr-x
mysql
3.81
MB
-rwxr-xr-x
mysql_config_editor
3.46
MB
-rwxr-xr-x
mysql_embedded
21.17
MB
-rwxr-xr-x
mysql_install_db
5.01
MB
-rwxr-xr-x
mysql_plugin
3.45
MB
-rwxr-xr-x
mysql_secure_installation
3.69
MB
-rwxr-xr-x
mysql_ssl_rsa_setup
3.49
MB
-rwxr-xr-x
mysql_tzinfo_to_sql
3.4
MB
-rwxr-xr-x
mysql_upgrade
4.32
MB
-rwxr-xr-x
mysqladmin
3.71
MB
-rwxr-xr-x
mysqlanalyze
3.73
MB
-rwxr-xr-x
mysqlbinlog
3.96
MB
-rwxr-xr-x
mysqlcheck
3.73
MB
-rwxr-xr-x
mysqld_multi
26.3
KB
-rwxr-xr-x
mysqld_safe
27.16
KB
-rwxr-xr-x
mysqldump
3.78
MB
-rwxr-xr-x
mysqldumpslow
7.66
KB
-rwxr-xr-x
mysqlimport
3.7
MB
-rwxr-xr-x
mysqloptimize
3.73
MB
-rwxr-xr-x
mysqlpump
4.17
MB
-rwxr-xr-x
mysqlrepair
3.73
MB
-rwxr-xr-x
mysqlreport
38.1
KB
-rwxr-xr-x
mysqlshow
3.7
MB
-rwxr-xr-x
mysqlslap
3.71
MB
-rwxr-xr-x
namei
26.08
KB
-rwxr-xr-x
nawk
122.48
KB
-rwxr-xr-x
ncal
28.79
KB
-rwxr-xr-x
neqn
908
B
-rwxr-xr-x
netkit-ftp
98.7
KB
-rwxr-xr-x
networkd-dispatcher
19.53
KB
-rwxr-xr-x
newgrp
39.4
KB
-rwsr-xr-x
ngettext
34.08
KB
-rwxr-xr-x
nice
34.18
KB
-rwxr-xr-x
nl
42.27
KB
-rwxr-xr-x
nohup
34.18
KB
-rwxr-xr-x
nproc
34.18
KB
-rwxr-xr-x
nroff
3.25
KB
-rwxr-xr-x
nsenter
30.28
KB
-rwxr-xr-x
nslookup
130.51
KB
-rwxr-xr-x
nstat
26.07
KB
-rwxr-xr-x
nsupdate
66.02
KB
-rwxr-xr-x
ntfsdecrypt
46.12
KB
-rwxr-xr-x
numfmt
62.24
KB
-rwxr-xr-x
od
66.21
KB
-rwxr-xr-x
on_ac_power
2.16
KB
-rwxr-xr-x
openssl
706.98
KB
-rwxr-xr-x
os-prober
4.44
KB
-rwxr-xr-x
p7zip
4.64
KB
-rwxr-xr-x
pager
166.76
KB
-rwxr-xr-x
partx
86.08
KB
-rwxr-xr-x
passmass
4.45
KB
-rwxr-xr-x
passwd
58.24
KB
-rwsr-xr-x
paste
34.21
KB
-rwxr-xr-x
pasteurize
388
B
-rwxr-xr-x
patch
178.37
KB
-rwxr-xr-x
pathchk
34.18
KB
-rwxr-xr-x
pbr
152
B
-rwxr-xr-x
pcimodules
14.13
KB
-rwxr-xr-x
pdb3
59.87
KB
-rwxr-xr-x
pdb3.6
59.87
KB
-rwxr-xr-x
pear
793
B
-rwxr-xr-x
peardev
814
B
-rwxr-xr-x
pecl
727
B
-rwxr-xr-x
peekfd
13.99
KB
-rwxr-xr-x
perl
2
MB
-rwxr-xr-x
perl5.26-x86_64-linux-gnu
9.98
KB
-rwxr-xr-x
perl5.26.1
2
MB
-rwxr-xr-x
perlbug
44.78
KB
-rwxr-xr-x
perldoc
125
B
-rwxr-xr-x
perlivp
10.61
KB
-rwxr-xr-x
perlthanks
44.78
KB
-rwxr-xr-x
perror
3.58
MB
-rwxr-xr-x
pftp
98.7
KB
-rwxr-xr-x
pgrep
26.09
KB
-rwxr-xr-x
phar
14.47
KB
-rwxr-xr-x
phar.phar
14.47
KB
-rwxr-xr-x
phar.phar7.2
14.47
KB
-rwxr-xr-x
phar7.2
14.47
KB
-rwxr-xr-x
php
4.68
MB
-rwxr-xr-x
php7.2
4.68
MB
-rwxr-xr-x
pic
204.03
KB
-rwxr-xr-x
pico
240.11
KB
-rwxr-xr-x
piconv
8.16
KB
-rwxr-xr-x
pinentry
62.49
KB
-rwxr-xr-x
pinentry-curses
62.49
KB
-rwxr-xr-x
pinky
38.21
KB
-rwxr-xr-x
pkaction
13.99
KB
-rwxr-xr-x
pkcheck
18.07
KB
-rwxr-xr-x
pkexec
21.99
KB
-rwsr-xr-x
pkill
26.09
KB
-rwxr-xr-x
pkttyagent
13.99
KB
-rwxr-xr-x
pl2pm
4.43
KB
-rwxr-xr-x
pldd
14.22
KB
-rwxr-xr-x
pmap
30.09
KB
-rwxr-xr-x
pod2html
4.04
KB
-rwxr-xr-x
pod2man
14.73
KB
-rwxr-xr-x
pod2text
10.72
KB
-rwxr-xr-x
pod2usage
3.86
KB
-rwxr-xr-x
podchecker
3.57
KB
-rwxr-xr-x
podselect
2.47
KB
-rwxr-xr-x
pr
70.27
KB
-rwxr-xr-x
precat
5.52
KB
-rwxr-xr-x
preconv
46.2
KB
-rwxr-xr-x
preunzip
5.52
KB
-rwxr-xr-x
prezip
5.52
KB
-rwxr-xr-x
prezip-bin
9.99
KB
-rwxr-xr-x
print
17.74
KB
-rwxr-xr-x
printenv
30.18
KB
-rwxr-xr-x
printerbanner
22
KB
-rwxr-xr-x
printf
50.18
KB
-rwxr-xr-x
prlimit
34.59
KB
-rwxr-xr-x
pro
442
B
-rwxr-xr-x
prove
13.27
KB
-rwxr-xr-x
prtstat
18.07
KB
-rwxr-xr-x
psfaddtable
17.99
KB
-rwxr-xr-x
psfgettable
17.99
KB
-rwxr-xr-x
psfstriptable
17.99
KB
-rwxr-xr-x
psfxtable
17.99
KB
-rwxr-xr-x
pslog
9.99
KB
-rwxr-xr-x
pstree
26.95
KB
-rwxr-xr-x
pstree.x11
26.95
KB
-rwxr-xr-x
ptar
3.47
KB
-rwxr-xr-x
ptardiff
2.57
KB
-rwxr-xr-x
ptargrep
4.29
KB
-rwxr-xr-x
ptx
70.24
KB
-rwxr-xr-x
pwdx
10.07
KB
-rwxr-xr-x
py3clean
7.63
KB
-rwxr-xr-x
py3compile
11.83
KB
-rwxr-xr-x
py3versions
11.44
KB
-rwxr-xr-x
pydoc3
79
B
-rwxr-xr-x
pydoc3.6
79
B
-rwxr-xr-x
pygettext3
21.04
KB
-rwxr-xr-x
pygettext3.6
21.04
KB
-rwxr-xr-x
python3
4.32
MB
-rwxr-xr-x
python3-futurize
384
B
-rwxr-xr-x
python3-pasteurize
388
B
-rwxr-xr-x
python3-pbr
152
B
-rwxr-xr-x
python3.6
4.32
MB
-rwxr-xr-x
python3.6m
4.32
MB
-rwxr-xr-x
python3m
4.32
MB
-rwxr-xr-x
rar
528.8
KB
-rwxr-xr-x
rcp
98.14
KB
-rwxr-xr-x
rdma
26.07
KB
-rwxr-xr-x
realpath
46.21
KB
-rwxr-xr-x
rearj
77.17
KB
-rwxr-xr-x
rename.ul
14.07
KB
-rwxr-xr-x
renice
14.07
KB
-rwxr-xr-x
replace
3.42
MB
-rwxr-xr-x
report-hw
2.05
KB
-rwxr-xr-x
reset
22
KB
-rwxr-xr-x
resizecons
18.13
KB
-rwxr-xr-x
resizepart
38.08
KB
-rwxr-xr-x
resolveip
3.44
MB
-rwxr-xr-x
rev
10.07
KB
-rwxr-xr-x
rgrep
30
B
-rwxr-xr-x
rlogin
710.79
KB
-rwxr-xr-x
rlogin-cwd
504
B
-rwxr-xr-x
rotatelogs
18.07
KB
-rwxr-xr-x
routef
208
B
-rwxr-xr-x
routel
1.62
KB
-rwxr-xr-x
rsh
710.79
KB
-rwxr-xr-x
rsync
496.43
KB
-rwxr-xr-x
rtstat
22.35
KB
-rwxr-xr-x
run-mailcap
17.74
KB
-rwxr-xr-x
run-with-aspell
57
B
-rwxr-xr-x
runcon
34.18
KB
-rwxr-xr-x
rview
2.55
MB
-rwxr-xr-x
rvim
2.55
MB
-rwxr-xr-x
savelog
10.22
KB
-rwxr-xr-x
scp
98.14
KB
-rwxr-xr-x
screendump
9.99
KB
-rwxr-xr-x
script
30.07
KB
-rwxr-xr-x
scriptreplay
26.08
KB
-rwxr-xr-x
sdiff
50.09
KB
-rwxr-xr-x
see
17.74
KB
-rwxr-xr-x
select-default-iwrap
474
B
-rwxr-xr-x
select-editor
2.38
KB
-rwxr-xr-x
sensible-browser
1.18
KB
-rwxr-xr-x
sensible-editor
1.08
KB
-rwxr-xr-x
sensible-pager
433
B
-rwxr-xr-x
seq
46.18
KB
-rwxr-xr-x
setarch
18.34
KB
-rwxr-xr-x
setkeycodes
10.07
KB
-rwxr-xr-x
setleds
14.05
KB
-rwxr-xr-x
setlogcons
10.07
KB
-rwxr-xr-x
setmetamode
10.1
KB
-rwxr-xr-x
setpci
26.08
KB
-rwxr-xr-x
setsid
10.07
KB
-rwxr-xr-x
setterm
42.08
KB
-rwxr-xr-x
sftp
150.35
KB
-rwxr-xr-x
sg
39.4
KB
-rwsr-xr-x
sha1sum
46.21
KB
-rwxr-xr-x
sha224sum
54.21
KB
-rwxr-xr-x
sha256sum
54.21
KB
-rwxr-xr-x
sha384sum
58.21
KB
-rwxr-xr-x
sha512sum
58.21
KB
-rwxr-xr-x
shar
170.03
KB
-rwxr-xr-x
shasum
9.15
KB
-rwxr-xr-x
showconsolefont
18.07
KB
-rwxr-xr-x
showkey
14.07
KB
-rwxr-xr-x
shred
58.21
KB
-rwxr-xr-x
shuf
54.18
KB
-rwxr-xr-x
skill
26.08
KB
-rwxr-xr-x
slabtop
18.08
KB
-rwxr-xr-x
slogin
710.79
KB
-rwxr-xr-x
snice
26.08
KB
-rwxr-xr-x
soelim
30.2
KB
-rwxr-xr-x
sort
110.47
KB
-rwxr-xr-x
splain
18.7
KB
-rwxr-xr-x
split
54.63
KB
-rwxr-xr-x
splitfont
9.99
KB
-rwxr-xr-x
ssh
710.79
KB
-rwxr-xr-x
ssh-add
338.13
KB
-rwxr-xr-x
ssh-agent
354.14
KB
-rwxr-sr-x
ssh-argv0
1.42
KB
-rwxr-xr-x
ssh-copy-id
10.41
KB
-rwxr-xr-x
ssh-import-id
1.73
KB
-rwxr-xr-x
ssh-import-id-gh
782
B
-rwxr-xr-x
ssh-import-id-lp
782
B
-rwxr-xr-x
ssh-keygen
410.16
KB
-rwxr-xr-x
ssh-keyscan
410.16
KB
-rwxr-xr-x
stat
78.21
KB
-rwxr-xr-x
stdbuf
46.18
KB
-rwxr-xr-x
strace
1.31
MB
-rwxr-xr-x
strace-log-merge
2.58
KB
-rwxr-xr-x
sudo
145.59
KB
-rwsr-xr-x
sudoedit
145.59
KB
-rwsr-xr-x
sudoreplay
54.81
KB
-rwxr-xr-x
sum
38.19
KB
-rwxr-xr-x
symcryptrun
110.73
KB
-rwxr-xr-x
systemd-analyze
1.49
MB
-rwxr-xr-x
systemd-cat
10.07
KB
-rwxr-xr-x
systemd-cgls
14.07
KB
-rwxr-xr-x
systemd-cgtop
30.09
KB
-rwxr-xr-x
systemd-delta
22.07
KB
-rwxr-xr-x
systemd-detect-virt
10.06
KB
-rwxr-xr-x
systemd-mount
42.09
KB
-rwxr-xr-x
systemd-path
10.06
KB
-rwxr-xr-x
systemd-resolve
86.07
KB
-rwxr-xr-x
systemd-run
42.07
KB
-rwxr-xr-x
systemd-socket-activate
18.07
KB
-rwxr-xr-x
systemd-stdio-bridge
14.07
KB
-rwxr-xr-x
systemd-umount
42.09
KB
-rwxr-xr-x
tabs
13.99
KB
-rwxr-xr-x
tac
38.18
KB
-rwxr-xr-x
tail
66.24
KB
-rwxr-xr-x
tasksel
18.47
KB
-rwxr-xr-x
taskset
30.08
KB
-rwxr-xr-x
tbl
126.2
KB
-rwxr-xr-x
tclsh8.6
5.99
KB
-rwxr-xr-x
tee
34.21
KB
-rwxr-xr-x
telnet
108.42
KB
-rwxr-xr-x
telnet.netkit
108.42
KB
-rwxr-xr-x
test
46.18
KB
-rwxr-xr-x
tic
82.11
KB
-rwxr-xr-x
time
14.38
KB
-rwxr-xr-x
timed-read
306
B
-rwxr-xr-x
timed-run
280
B
-rwxr-xr-x
timedatectl
22.07
KB
-rwxr-xr-x
timeout
38.63
KB
-rwxr-xr-x
tknewsbiff
11.12
KB
-rwxr-xr-x
tkpasswd
16.18
KB
-rwxr-xr-x
tload
14.09
KB
-rwxr-xr-x
toe
13.99
KB
-rwxr-xr-x
top
105.77
KB
-rwxr-xr-x
touch
86.21
KB
-rwxr-xr-x
tput
18.02
KB
-rwxr-xr-x
tr
46.18
KB
-rwxr-xr-x
tracepath
14.01
KB
-rwxr-xr-x
traceroute6
18.02
KB
-rwsr-xr-x
traceroute6.iputils
18.02
KB
-rwsr-xr-x
troff
719.34
KB
-rwxr-xr-x
truncate
38.18
KB
-rwxr-xr-x
tset
22
KB
-rwxr-xr-x
tsort
34.18
KB
-rwxr-xr-x
tty
30.18
KB
-rwxr-xr-x
tzselect
15.04
KB
-rwxr-xr-x
ua
442
B
-rwxr-xr-x
ubuntu-advantage
442
B
-rwxr-xr-x
ubuntu-distro-info
18.59
KB
-rwxr-xr-x
ubuntu-support-status
7.84
KB
-rwxr-xr-x
ucf
39.73
KB
-rwxr-xr-x
ucfq
18.91
KB
-rwxr-xr-x
ucfr
10.47
KB
-rwxr-xr-x
udisksctl
54.07
KB
-rwxr-xr-x
ul
14.01
KB
-rwxr-xr-x
unace
30.02
KB
-rwxr-xr-x
unattended-upgrade
82.55
KB
-rwxr-xr-x
unattended-upgrades
82.55
KB
-rwxr-xr-x
unbuffer
643
B
-rwxr-xr-x
unexpand
38.21
KB
-rwxr-xr-x
unicode_stop
530
B
-rwxr-xr-x
uniq
42.21
KB
-rwxr-xr-x
unlink
30.18
KB
-rwxr-xr-x
unlzma
74.36
KB
-rwxr-xr-x
unmkinitramfs
2.94
KB
-rwxr-xr-x
unrar
295.09
KB
-rwxr-xr-x
unrar-nonfree
295.09
KB
-rwxr-xr-x
unshar
113.41
KB
-rwxr-xr-x
unshare
18.27
KB
-rwxr-xr-x
unxz
74.36
KB
-rwxr-xr-x
unzip
174.13
KB
-rwxr-xr-x
unzipsfx
78.12
KB
-rwxr-xr-x
update-alternatives
46.01
KB
-rwxr-xr-x
update-desktop-database
22.07
KB
-rwxr-xr-x
update-mime-database
50.19
KB
-rwxr-xr-x
updatedb
46.08
KB
-rwxr-xr-x
updatedb.mlocate
46.08
KB
-rwxr-xr-x
uptime
10.07
KB
-rwxr-xr-x
usb-devices
4.12
KB
-rwxr-xr-x
usbhid-dump
22.08
KB
-rwxr-xr-x
users
34.18
KB
-rwxr-xr-x
utmpdump
22.07
KB
-rwxr-xr-x
uudecode
117
KB
-rwxr-xr-x
uudeview
30.14
KB
-rwxr-xr-x
uuencode
113
KB
-rwxr-xr-x
uuenview
26.02
KB
-rwxr-xr-x
uuidgen
14.07
KB
-rwxr-xr-x
uuidparse
34.08
KB
-rwxr-xr-x
validate-json
6.63
KB
-rwxr-xr-x
vi
2.55
MB
-rwxr-xr-x
view
2.55
MB
-rwxr-xr-x
viewres
26.96
KB
-rwxr-xr-x
vim
2.55
MB
-rwxr-xr-x
vim.basic
2.55
MB
-rwxr-xr-x
vim.tiny
1.06
MB
-rwxr-xr-x
vimdiff
2.55
MB
-rwxr-xr-x
vimtutor
2.05
KB
-rwxr-xr-x
vmstat
34.09
KB
-rwxr-xr-x
volname
9.99
KB
-rwxr-xr-x
w
18.07
KB
-rwxr-xr-x
w.procps
18.07
KB
-rwxr-xr-x
wall
30.08
KB
-rwxr-sr-x
watch
22.41
KB
-rwxr-xr-x
watchgnupg
13.99
KB
-rwxr-xr-x
wc
42.19
KB
-rwxr-xr-x
webmin
14.57
KB
-rwxr-xr-x
wget
487.56
KB
-rwxr-xr-x
whatis
46.98
KB
-rwxr-xr-x
whereis
26.51
KB
-rwxr-xr-x
which
946
B
-rwxr-xr-x
who
50.21
KB
-rwxr-xr-x
whoami
30.18
KB
-rwxr-xr-x
word-list-compress
9.99
KB
-rwxr-xr-x
write
13.99
KB
-rwxr-sr-x
x86_64
18.34
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp
1022.94
KB
-rwxr-xr-x
x86_64-linux-gnu-cpp-7
1022.94
KB
-rwxr-xr-x
xargs
70.21
KB
-rwxr-xr-x
xauth
50.81
KB
-rwxr-xr-x
xdg-user-dir
234
B
-rwxr-xr-x
xdg-user-dirs-update
18.07
KB
-rwxr-xr-x
xdpyinfo
34.76
KB
-rwxr-xr-x
xdriinfo
9.99
KB
-rwxr-xr-x
xev
30.48
KB
-rwxr-xr-x
xfd
35.76
KB
-rwxr-xr-x
xfontsel
43.6
KB
-rwxr-xr-x
xkibitz
4.75
KB
-rwxr-xr-x
xkill
13.99
KB
-rwxr-xr-x
xlsatoms
9.99
KB
-rwxr-xr-x
xlsclients
14
KB
-rwxr-xr-x
xlsfonts
18.09
KB
-rwxr-xr-x
xmessage
22.88
KB
-rwxr-xr-x
xprop
40.29
KB
-rwxr-xr-x
xpstat
6.45
KB
-rwxr-xr-x
xsubpp
5.04
KB
-rwxr-xr-x
xvinfo
13.99
KB
-rwxr-xr-x
xwininfo
46.08
KB
-rwxr-xr-x
xxd
18.12
KB
-rwxr-xr-x
xz
74.36
KB
-rwxr-xr-x
xzcat
74.36
KB
-rwxr-xr-x
xzcmp
6.48
KB
-rwxr-xr-x
xzdiff
6.48
KB
-rwxr-xr-x
xzegrep
5.76
KB
-rwxr-xr-x
xzfgrep
5.76
KB
-rwxr-xr-x
xzgrep
5.76
KB
-rwxr-xr-x
xzless
1.76
KB
-rwxr-xr-x
xzmore
2.11
KB
-rwxr-xr-x
yelp
54.07
KB
-rwxr-xr-x
yes
30.18
KB
-rwxr-xr-x
zdump
18.05
KB
-rwxr-xr-x
zip
211.19
KB
-rwxr-xr-x
zipcloak
91.62
KB
-rwxr-xr-x
zipdetails
47.36
KB
-rwxr-xr-x
zipgrep
2.88
KB
-rwxr-xr-x
zipinfo
174.13
KB
-rwxr-xr-x
zipnote
87.39
KB
-rwxr-xr-x
zipsplit
91.39
KB
-rwxr-xr-x
Delete
Unzip
Zip
${this.title}
Close
Code Editor : zipdetails
#!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; #!/usr/bin/perl # zipdetails # # Display info on the contents of a Zip file # BEGIN { pop @INC if $INC[-1] eq '.' } use strict; use warnings ; use IO::File; use Encode; # Compression types use constant ZIP_CM_STORE => 0 ; use constant ZIP_CM_IMPLODE => 6 ; use constant ZIP_CM_DEFLATE => 8 ; use constant ZIP_CM_BZIP2 => 12 ; use constant ZIP_CM_LZMA => 14 ; use constant ZIP_CM_PPMD => 98 ; # General Purpose Flag use constant ZIP_GP_FLAG_ENCRYPTED_MASK => (1 << 0) ; use constant ZIP_GP_FLAG_STREAMING_MASK => (1 << 3) ; use constant ZIP_GP_FLAG_PATCHED_MASK => (1 << 5) ; use constant ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK => (1 << 6) ; use constant ZIP_GP_FLAG_LZMA_EOS_PRESENT => (1 << 1) ; use constant ZIP_GP_FLAG_LANGUAGE_ENCODING => (1 << 11) ; # Internal File Attributes use constant ZIP_IFA_TEXT_MASK => 1; # Signatures for each of the headers use constant ZIP_LOCAL_HDR_SIG => 0x04034b50; use constant ZIP_DATA_HDR_SIG => 0x08074b50; use constant ZIP_CENTRAL_HDR_SIG => 0x02014b50; use constant ZIP_END_CENTRAL_HDR_SIG => 0x06054b50; use constant ZIP64_END_CENTRAL_REC_HDR_SIG => 0x06064b50; use constant ZIP64_END_CENTRAL_LOC_HDR_SIG => 0x07064b50; use constant ZIP64_ARCHIVE_EXTRA_SIG => 0x08064b50; use constant ZIP64_DIGITAL_SIGNATURE_SIG => 0x05054b50; use constant ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG => 0x08064b50; # Extra sizes use constant ZIP_EXTRA_HEADER_SIZE => 2 ; use constant ZIP_EXTRA_MAX_SIZE => 0xFFFF ; use constant ZIP_EXTRA_SUBFIELD_ID_SIZE => 2 ; use constant ZIP_EXTRA_SUBFIELD_LEN_SIZE => 2 ; use constant ZIP_EXTRA_SUBFIELD_HEADER_SIZE => ZIP_EXTRA_SUBFIELD_ID_SIZE + ZIP_EXTRA_SUBFIELD_LEN_SIZE; use constant ZIP_EXTRA_SUBFIELD_MAX_SIZE => ZIP_EXTRA_MAX_SIZE - ZIP_EXTRA_SUBFIELD_HEADER_SIZE; my %ZIP_CompressionMethods = ( 0 => 'Stored', 1 => 'Shrunk', 2 => 'Reduced compression factor 1', 3 => 'Reduced compression factor 2', 4 => 'Reduced compression factor 3', 5 => 'Reduced compression factor 4', 6 => 'Imploded', 7 => 'Reserved for Tokenizing compression algorithm', 8 => 'Deflated', 9 => 'Enhanced Deflating using Deflate64(tm)', 10 => 'PKWARE Data Compression Library Imploding', 11 => 'Reserved by PKWARE', 12 => 'BZIP2 ', 13 => 'Reserved by PKWARE', 14 => 'LZMA', 15 => 'Reserved by PKWARE', 16 => 'Reserved by PKWARE', 17 => 'Reserved by PKWARE', 18 => 'File is compressed using IBM TERSE (new)', 19 => 'IBM LZ77 z Architecture (PFS)', 96 => 'WinZip JPEG Compression', 97 => 'WavPack compressed data', 98 => 'PPMd version I, Rev 1', 99 => 'AES Encryption', ); my %OS_Lookup = ( 0 => "MS-DOS", 1 => "Amiga", 2 => "OpenVMS", 3 => "Unix", 4 => "VM/CMS", 5 => "Atari ST", 6 => "HPFS (OS/2, NT 3.x)", 7 => "Macintosh", 8 => "Z-System", 9 => "CP/M", 10 => "Windoxs NTFS or TOPS-20", 11 => "MVS or NTFS", 12 => "VSE or SMS/QDOS", 13 => "Acorn RISC OS", 14 => "VFAT", 15 => "alternate MVS", 16 => "BeOS", 17 => "Tandem", 18 => "OS/400", 19 => "OS/X (Darwin)", 30 => "AtheOS/Syllable", ); my %Lookup = ( ZIP_LOCAL_HDR_SIG, \&LocalHeader, ZIP_DATA_HDR_SIG, \&DataHeader, ZIP_CENTRAL_HDR_SIG, \&CentralHeader, ZIP_END_CENTRAL_HDR_SIG, \&EndCentralHeader, ZIP64_END_CENTRAL_REC_HDR_SIG, \&Zip64EndCentralHeader, ZIP64_END_CENTRAL_LOC_HDR_SIG, \&Zip64EndCentralLocator, # TODO - Archive Encryption Headers #ZIP_ARCHIVE_EXTRA_DATA_RECORD_SIG ); my %Extras = ( 0x0001, ['ZIP64', \&decode_Zip64], 0x0007, ['AV Info', undef], 0x0008, ['Extended Language Encoding', undef], 0x0009, ['OS/2 extended attributes', undef], 0x000a, ['NTFS FileTimes', \&decode_NTFS_Filetimes], 0x000c, ['OpenVMS', undef], 0x000d, ['Unix', undef], 0x000e, ['Stream & Fork Descriptors', undef], 0x000f, ['Patch Descriptor', undef], 0x0014, ['PKCS#7 Store for X.509 Certificates', undef], 0x0015, ['X.509 Certificate ID and Signature for individual file', undef], 0x0016, ['X.509 Certificate ID for Central Directory', undef], 0x0017, ['Strong Encryption Header', undef], 0x0018, ['Record Management Controls', undef], 0x0019, ['PKCS#7 Encryption Recipient Certificate List', undef], #The Header ID mappings defined by Info-ZIP and third parties are: 0x0065, ['IBM S/390 attributes - uncompressed', undef], 0x0066, ['IBM S/390 attributes - compressed', undef], 0x07c8, ['Info-ZIP Macintosh (old, J. Lee)', undef], 0x2605, ['ZipIt Macintosh (first version)', undef], 0x2705, ['ZipIt Macintosh v 1.3.5 and newer (w/o full filename)', undef], 0x2805, ['ZipIt Macintosh v 1.3.5 and newer ', undef], 0x334d, ["Info-ZIP Macintosh (new, D. Haase's 'Mac3' field)", undef], 0x4154, ['Tandem NSK', undef], 0x4341, ['Acorn/SparkFS (David Pilling)', undef], 0x4453, ['Windows NT security descriptor', \&decode_NT_security], 0x4690, ['POSZIP 4690', undef], 0x4704, ['VM/CMS', undef], 0x470f, ['MVS', undef], 0x4854, ['Theos, old inofficial port', undef], 0x4b46, ['FWKCS MD5 (see below)', undef], 0x4c41, ['OS/2 access control list (text ACL)', undef], 0x4d49, ['Info-ZIP OpenVMS (obsolete)', undef], 0x4d63, ['Macintosh SmartZIP, by Macro Bambini', undef], 0x4f4c, ['Xceed original location extra field', undef], 0x5356, ['AOS/VS (binary ACL)', undef], 0x5455, ['Extended Timestamp', \&decode_UT], 0x554e, ['Xceed unicode extra field', \&decode_Xceed_unicode], 0x5855, ['Info-ZIP Unix (original; also OS/2, NT, etc.)', \&decode_UX], 0x5a4c, ['ZipArchive Unicode Filename', undef], 0x5a4d, ['ZipArchive Offsets Array', undef], 0x6375, ["Info-ZIP Unicode Comment", \&decode_up ], 0x6542, ['BeOS (BeBox, PowerMac, etc.)', undef], 0x6854, ['Theos', undef], 0x7075, ["Info-ZIP Unicode Path", \&decode_up ], 0x756e, ['ASi Unix', undef], 0x7441, ['AtheOS (AtheOS/Syllable attributes)', undef], 0x7855, ["Unix Extra type 2", \&decode_Ux], 0x7875, ["Unix Extra Type 3", \&decode_ux], 0x9901, ['AES Encryption', \&decode_AES], 0xA220, ["Microsoft Microsoft Open Packaging Growth Hint", undef ], 0xCAFE, ["Java Executable", \&decode_Java_exe], 0xfb4a, ['SMS/QDOS', undef], ); my $VERSION = "1.06" ; my $FH; my $ZIP64 = 0 ; my $NIBBLES = 8; my $LocalHeaderCount = 0; my $CentralHeaderCount = 0; my $START; my $OFFSET = new U64 0; my $TRAILING = 0 ; my $PAYLOADLIMIT = new U64 256; my $ZERO = new U64 0 ; sub prOff { my $offset = shift; my $s = offset($OFFSET); $OFFSET->add($offset); return $s; } sub offset { my $v = shift ; if (ref $v eq 'U64') { my $hi = $v->getHigh(); my $lo = $v->getLow(); if ($hi) { my $hiNib = $NIBBLES - 8 ; sprintf("%0${hiNib}X", $hi) . sprintf("%08X", $lo); } else { sprintf("%0${NIBBLES}X", $lo); } } else { sprintf("%0${NIBBLES}X", $v); } } my ($OFF, $LENGTH, $CONTENT, $TEXT, $VALUE) ; my $FMT1 ; my $FMT2 ; sub setupFormat { my $wantVerbose = shift ; my $nibbles = shift; my $width = '@' . ('>' x ($nibbles -1)); my $space = " " x length($width); my $fmt ; if ($wantVerbose) { $FMT1 = " format STDOUT = $width $width ^<<<<<<<<<<<^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \$OFF, \$LENGTH, \$CONTENT, \$TEXT, \$VALUE $space $space ^<<<<<<<<<<<^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~ \$CONTENT, \$TEXT, \$VALUE . "; $FMT2 = " format STDOUT = $width $width ^<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \$OFF, \$LENGTH, \$CONTENT, \$TEXT, \$VALUE $space $space ^<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~ \$CONTENT, \$TEXT, \$VALUE . " ; } else { $FMT1 = " format STDOUT = $width ^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \$OFF, \$TEXT, \$VALUE $space ^<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~ \$TEXT, \$VALUE . "; $FMT2 = " format STDOUT = $width ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \$OFF, \$TEXT, \$VALUE $space ^<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~ \$TEXT, \$VALUE . " ; } eval "$FMT1"; $| = 1; } sub mySpr { my $format = shift ; return "" if ! defined $format; return $format unless @_ ; return sprintf $format, @_ ; } sub out0 { my $size = shift; my $text = shift; my $format = shift; $OFF = prOff($size); $LENGTH = offset($size) ; $CONTENT = '...'; $TEXT = $text; $VALUE = mySpr $format, @_; write; skip($FH, $size); } sub xDump { my $input = shift; $input =~ tr/\0-\37\177-\377/./; return $input; } sub hexDump { my $input = shift; my $out = unpack('H*', $input) ; $out =~ s#(..)# $1#g ; $out =~ s/^ //; $out = uc $out; return $out; } sub out { my $data = shift; my $text = shift; my $format = shift; my $size = length($data) ; $OFF = prOff($size); $LENGTH = offset($size) ; $CONTENT = hexDump($data); $TEXT = $text; $VALUE = mySpr $format, @_; no warnings; write; } sub out1 { my $text = shift; my $format = shift; $OFF = ''; $LENGTH = '' ; $CONTENT = ''; $TEXT = $text; $VALUE = mySpr $format, @_; write; } sub out2 { my $data = shift ; my $text = shift ; my $format = shift; my $size = length($data) ; $OFF = prOff($size); $LENGTH = offset($size); $CONTENT = hexDump($data); $TEXT = $text; $VALUE = mySpr $format, @_; no warnings; eval "$FMT2"; write ; eval "$FMT1"; } sub Value { my $letter = shift; my @value = @_; if ($letter eq 'C') { return Value_C(@value) } elsif ($letter eq 'v') { return Value_v(@value) } elsif ($letter eq 'V') { return Value_V(@value) } elsif ($letter eq 'VV') { return Value_VV(@value) } } sub outer { my $name = shift ; my $unpack = shift ; my $size = shift ; my $cb1 = shift ; my $cb2 = shift ; myRead(my $buff, $size); my (@value) = unpack $unpack, $buff; my $hex = Value($unpack, @value); if (defined $cb1) { my $v ; if (ref $cb1 eq 'CODE') { $v = $cb1->(@value) ; } else { $v = $cb1 ; } $v = "'" . $v unless $v =~ /^'/; $v .= "'" unless $v =~ /'$/; $hex .= " $v" ; } out $buff, $name, $hex ; $cb2->(@value) if defined $cb2 ; return $value[0]; } sub out_C { my $name = shift ; my $cb1 = shift ; my $cb2 = shift ; outer($name, 'C', 1, $cb1, $cb2); } sub out_v { my $name = shift ; my $cb1 = shift ; my $cb2 = shift ; outer($name, 'v', 2, $cb1, $cb2); } sub out_V { my $name = shift ; my $cb1 = shift ; my $cb2 = shift ; outer($name, 'V', 4, $cb1, $cb2); } sub out_VV { my $name = shift ; my $cb1 = shift ; my $cb2 = shift ; outer($name, 'VV', 8, $cb1, $cb2); } sub outSomeData { my $size = shift; my $message = shift; my $size64 = U64::mkU64($size); if ($size64->gt($ZERO)) { my $size32 = $size64->getLow(); if ($size64->gt($PAYLOADLIMIT) ) { out0 $size32, $message; } else { myRead(my $buffer, $size32 ); out $buffer, $message, xDump $buffer ; } } } sub unpackValue_C { Value_v(unpack "C", $_[0]); } sub Value_C { sprintf "%02X", $_[0]; } sub unpackValue_v { Value_v(unpack "v", $_[0]); } sub Value_v { sprintf "%04X", $_[0]; } sub unpackValue_V { Value_V(unpack "V", $_[0]); } sub Value_V { my $v = defined $_[0] ? $_[0] : 0; sprintf "%08X", $v; } sub unpackValue_VV { my ($lo, $hi) = unpack ("V V", $_[0]); Value_VV($lo, $hi); } sub Value_U64 { my $u64 = shift ; Value_VV($u64->getLow(), $u64->getHigh()); } sub Value_VV { my $lo = defined $_[0] ? $_[0] : 0; my $hi = defined $_[1] ? $_[1] : 0; if ($hi == 0) { sprintf "%016X", $lo; } else { sprintf("%08X", $hi) . sprintf "%08X", $lo; } } sub Value_VV64 { my $buffer = shift; my ($lo, $hi) = unpack ("V V" , $buffer); no warnings 'uninitialized'; return $hi * (0xFFFFFFFF+1) + $lo; } sub read_U64 { my $b ; myRead($b, 8); my ($lo, $hi) = unpack ("V V" , $b); no warnings 'uninitialized'; return ($b, new U64 $hi, $lo); } sub read_VV { my $b ; myRead($b, 8); my ($lo, $hi) = unpack ("V V" , $b); no warnings 'uninitialized'; return ($b, $hi * (0xFFFFFFFF+1) + $lo); } sub read_V { my $b ; myRead($b, 4); return ($b, unpack ("V", $b)); } sub read_v { my $b ; myRead($b, 2); return ($b, unpack "v", $b); } sub read_C { my $b ; myRead($b, 1); return ($b, unpack "C", $b); } my $opt_verbose = 0; while (@ARGV && $ARGV[0] =~ /^-/) { my $opt = shift; if ($opt =~ /^-h/i) { Usage(); exit; } elsif ($opt =~ /^-v/i) { $opt_verbose = 1; } else { Usage(); } } Usage() unless @ARGV == 1; my $filename = shift @ARGV; die "$filename does not exist\n" unless -e $filename ; die "$filename not a standard file\n" unless -f $filename ; $FH = new IO::File "<$filename" or die "Cannot open $filename: $!\n"; my $FILELEN = -s $filename ; $TRAILING = -s $filename ; $NIBBLES = U64::nibbles(-s $filename) ; #$NIBBLES = int ($NIBBLES / 4) + ( ($NIBBLES % 4) ? 1 : 0 ); #$NIBBLES = 4 * $NIBBLES; # Minimum of 4 nibbles $NIBBLES = 4 if $NIBBLES < 4 ; die "$filename too short to be a zip file\n" if $FILELEN < 100 ; setupFormat($opt_verbose, $NIBBLES); if(0) { # Sanity check that this is a Zip file my ($buffer, $signature) = read_V(); warn "$filename doesn't look like a zip file\n" if $signature != ZIP_LOCAL_HDR_SIG ; $FH->seek(0, SEEK_SET) ; } our @CentralDirectory = scanCentralDirectory($FH); die "No Central Directory found\n" if ! @CentralDirectory ; $OFFSET->reset(); $FH->seek(0, SEEK_SET) ; outSomeData($START, "PREFIX DATA") if defined $START && $START > 0 ; while (1) { last if $FH->eof(); if ($FH->tell() >= $TRAILING) { print "\n" ; outSomeData($FILELEN - $TRAILING, "TRAILING DATA"); last; } my ($buffer, $signature) = read_V(); my $handler = $Lookup{$signature}; if (!defined $handler) { my $offset = $FH->tell() - 4; printf "\n\nUnexpecded END at offset %08X, value %s\n", $offset, Value_V($signature); last; } $ZIP64 = 0 if $signature != ZIP_DATA_HDR_SIG ; $handler->($signature, $buffer); } print "Done\n"; exit ; sub compressionMethod { my $id = shift ; Value_v($id) . " '" . ($ZIP_CompressionMethods{$id} || "Unknown Method") . "'" ; } sub LocalHeader { my $signature = shift ; my $data = shift ; print "\n"; ++ $LocalHeaderCount; out $data, "LOCAL HEADER #" . sprintf("%X", $LocalHeaderCount) , Value_V($signature); my $buffer; my ($loc, $CDcompressedLength) = @{ shift @CentralDirectory }; # TODO - add test to check that the loc from central header matches out_C "Extract Zip Spec", \&decodeZipVer; out_C "Extract OS", \&decodeOS; my ($bgp, $gpFlag) = read_v(); my ($bcm, $compressedMethod) = read_v(); out $bgp, "General Purpose Flag", Value_v($gpFlag) ; GeneralPurposeBits($compressedMethod, $gpFlag); out $bcm, "Compression Method", compressionMethod($compressedMethod) ; out_V "Last Mod Time", sub { scalar getTime(_dosToUnixTime($_[0])) }; my $crc = out_V "CRC"; my $compressedLength = out_V "Compressed Length"; my $uncompressedLength = out_V "Uncompressed Length"; my $filenameLength = out_v "Filename Length"; my $extraLength = out_v "Extra Length"; my $filename ; myRead($filename, $filenameLength); out $filename, "Filename", "'". $filename . "'"; my $cl64 = new U64 $compressedLength ; my %ExtraContext = (); if ($extraLength) { my @z64 = ($uncompressedLength, $compressedLength, 1, 1); $ExtraContext{Zip64} = \@z64 ; $ExtraContext{InCentralDir} = 0; walkExtra($extraLength, \%ExtraContext); } my $size = 0; $size = printAes(\%ExtraContext) if $compressedMethod == 99 ; $size += printLzmaProperties() if $compressedMethod == ZIP_CM_LZMA ; $CDcompressedLength->subtract($size) if $size ; if ($CDcompressedLength->getHigh() || $CDcompressedLength->getLow()) { outSomeData($CDcompressedLength, "PAYLOAD") ; } if ($compressedMethod == 99) { my $auth ; myRead($auth, 10); out $auth, "AES Auth", hexDump($auth); } } sub CentralHeader { my $signature = shift ; my $data = shift ; ++ $CentralHeaderCount; print "\n"; out $data, "CENTRAL HEADER #" . sprintf("%X", $CentralHeaderCount) . "", Value_V($signature); my $buffer; out_C "Created Zip Spec", \&decodeZipVer; out_C "Created OS", \&decodeOS; out_C "Extract Zip Spec", \&decodeZipVer; out_C "Extract OS", \&decodeOS; my ($bgp, $gpFlag) = read_v(); my ($bcm, $compressedMethod) = read_v(); out $bgp, "General Purpose Flag", Value_v($gpFlag) ; GeneralPurposeBits($compressedMethod, $gpFlag); out $bcm, "Compression Method", compressionMethod($compressedMethod) ; out_V "Last Mod Time", sub { scalar getTime(_dosToUnixTime($_[0])) }; my $crc = out_V "CRC"; my $compressedLength = out_V "Compressed Length"; my $uncompressedLength = out_V "Uncompressed Length"; my $filenameLength = out_v "Filename Length"; my $extraLength = out_v "Extra Length"; my $comment_length = out_v "Comment Length"; my $disk_start = out_v "Disk Start"; my $int_file_attrib = out_v "Int File Attributes"; out1 "[Bit 0]", $int_file_attrib & 1 ? "1 Text Data" : "0 'Binary Data'"; my $ext_file_attrib = out_V "Ext File Attributes"; out1 "[Bit 0]", "Read-Only" if $ext_file_attrib & 0x01 ; out1 "[Bit 1]", "Hidden" if $ext_file_attrib & 0x02 ; out1 "[Bit 2]", "System" if $ext_file_attrib & 0x04 ; out1 "[Bit 3]", "Label" if $ext_file_attrib & 0x08 ; out1 "[Bit 4]", "Directory" if $ext_file_attrib & 0x10 ; out1 "[Bit 5]", "Archive" if $ext_file_attrib & 0x20 ; my $lcl_hdr_offset = out_V "Local Header Offset"; my $filename ; myRead($filename, $filenameLength); out $filename, "Filename", "'". $filename . "'"; my %ExtraContext = (); if ($extraLength) { my @z64 = ($uncompressedLength, $compressedLength, $lcl_hdr_offset, $disk_start); $ExtraContext{Zip64} = \@z64 ; $ExtraContext{InCentralDir} = 1; walkExtra($extraLength, \%ExtraContext); } if ($comment_length) { my $comment ; myRead($comment, $comment_length); out $comment, "Comment", "'". $comment . "'"; } } sub decodeZipVer { my $ver = shift ; my $sHi = int($ver /10) ; my $sLo = $ver % 10 ; #out1 "Zip Spec", "$sHi.$sLo"; "$sHi.$sLo"; } sub decodeOS { my $ver = shift ; $OS_Lookup{$ver} || "Unknown" ; } sub Zip64EndCentralHeader { my $signature = shift ; my $data = shift ; print "\n"; out $data, "ZIP64 END CENTRAL DIR RECORD", Value_V($signature); my $buff; myRead($buff, 8); out $buff, "Size of record", unpackValue_VV($buff); my $size = Value_VV64($buff); out_C "Created Zip Spec", \&decodeZipVer; out_C "Created OS", \&decodeOS; out_C "Extract Zip Spec", \&decodeZipVer; out_C "Extract OS", \&decodeOS; out_V "Number of this disk"; out_V "Central Dir Disk no"; out_VV "Entries in this disk"; out_VV "Total Entries"; out_VV "Size of Central Dir"; out_VV "Offset to Central dir"; # TODO - die "Unsupported Size ($size) in Zip64EndCentralHeader\n" if $size != 44; } sub Zip64EndCentralLocator { my $signature = shift ; my $data = shift ; print "\n"; out $data, "ZIP64 END CENTRAL DIR LOCATOR", Value_V($signature); out_V "Central Dir Disk no"; out_VV "Offset to Central dir"; out_V "Total no of Disks"; } sub EndCentralHeader { my $signature = shift ; my $data = shift ; print "\n"; out $data, "END CENTRAL HEADER", Value_V($signature); out_v "Number of this disk"; out_v "Central Dir Disk no"; out_v "Entries in this disk"; out_v "Total Entries"; out_V "Size of Central Dir"; out_V "Offset to Central Dir"; my $comment_length = out_v "Comment Length"; if ($comment_length) { my $comment ; myRead($comment, $comment_length); out $comment, "Comment", "'$comment'"; } } sub DataHeader { my $signature = shift ; my $data = shift ; print "\n"; out $data, "STREAMING DATA HEADER", Value_V($signature); out_V "CRC"; if ($ZIP64) { out_VV "Compressed Length" ; out_VV "Uncompressed Length" ; } else { out_V "Compressed Length" ; out_V "Uncompressed Length" ; } } sub GeneralPurposeBits { my $method = shift; my $gp = shift; out1 "[Bit 0]", "1 'Encryption'" if $gp & ZIP_GP_FLAG_ENCRYPTED_MASK; my %lookup = ( 0 => "Normal Compression", 1 => "Maximum Compression", 2 => "Fast Compression", 3 => "Super Fast Compression"); if ($method == ZIP_CM_DEFLATE) { my $mid = $gp & 0x03; out1 "[Bits 1-2]", "$mid '$lookup{$mid}'"; } if ($method == ZIP_CM_LZMA) { if ($gp & ZIP_GP_FLAG_LZMA_EOS_PRESENT) { out1 "[Bit 1]", "1 'LZMA EOS Marker Present'" ; } else { out1 "[Bit 1]", "0 'LZMA EOS Marker Not Present'" ; } } if ($method == ZIP_CM_IMPLODE) # Imploding { out1 "[Bit 1]", ($gp & 1 ? "1 '8k" : "0 '4k") . " Sliding Dictionary'" ; out1 "[Bit 2]", ($gp & 2 ? "1 '3" : "0 '2" ) . " Shannon-Fano Trees'" ; } out1 "[Bit 3]", "1 'Streamed'" if $gp & ZIP_GP_FLAG_STREAMING_MASK; out1 "[Bit 4]", "1 'Enhanced Deflating'" if $gp & 1 << 4; out1 "[Bit 5]", "1 'Compressed Patched'" if $gp & 1 << 5 ; out1 "[Bit 6]", "1 'Strong Encryption'" if $gp & ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK; out1 "[Bit 11]", "1 'Language Encoding'" if $gp & ZIP_GP_FLAG_LANGUAGE_ENCODING; out1 "[Bit 12]", "1 'Pkware Enhanced Compression'" if $gp & 1 <<12 ; out1 "[Bit 13]", "1 'Encrypted Central Dir'" if $gp & 1 <<13 ; return (); } sub skip { my $fh = $_[0] ; my $size = $_[1]; use Fcntl qw(SEEK_CUR); if (ref $size eq 'U64') { seek($fh, $size->get64bit(), SEEK_CUR); } else { seek($fh, $size, SEEK_CUR); } } sub myRead { my $got = \$_[0] ; my $size = $_[1]; my $wantSize = $size; $$got = ''; if ($size == 0) { return ; } if ($size > 0) { my $buff ; my $status = $FH->read($buff, $size); return $status if $status < 0; $$got .= $buff ; } my $len = length $$got; die "Truncated file (got $len, wanted $wantSize): $!\n" if length $$got != $wantSize; } sub walkExtra { my $XLEN = shift; my $context = shift; my $buff ; my $offset = 0 ; my $id; my $subLen; my $payload ; my $count = 0 ; if ($XLEN < ZIP_EXTRA_SUBFIELD_ID_SIZE + ZIP_EXTRA_SUBFIELD_LEN_SIZE) { # Android zipalign is prime candidate for this non-standard extra field. myRead($payload, $XLEN); my $data = hexDump($payload); out $payload, "Malformed Extra Data", $data; return undef; } while ($offset < $XLEN) { ++ $count; return undef if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE > $XLEN ; myRead($id, ZIP_EXTRA_SUBFIELD_ID_SIZE); $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE; my $lookID = unpack "v", $id ; my ($who, $decoder) = @{ defined $Extras{$lookID} ? $Extras{$lookID} : ['', undef] }; #my ($who, $decoder) = @{ $Extras{unpack "v", $id} || ['', undef] }; $who = "$id: $who" if $id =~ /\w\w/ ; $who = "'$who'"; out $id, "Extra ID #" . Value_v($count), unpackValue_v($id) . " $who" ; myRead($buff, ZIP_EXTRA_SUBFIELD_LEN_SIZE); $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE; $subLen = unpack("v", $buff); out2 $buff, "Length", Value_v($subLen) ; return undef if $offset + $subLen > $XLEN ; if (! defined $decoder) { myRead($payload, $subLen); my $data = hexDump($payload); out2 $payload, "Extra Payload", $data; } else { $decoder->($subLen, $context) ; } $offset += $subLen ; } return undef ; } sub full32 { return $_[0] == 0xFFFFFFFF ; } sub decode_Zip64 { my $len = shift; my $context = shift; my $z64Data = $context->{Zip64}; $ZIP64 = 1; if (full32 $z64Data->[0] ) { out_VV " Uncompressed Size"; } if (full32 $z64Data->[1] ) { out_VV " Compressed Size"; } if (full32 $z64Data->[2] ) { out_VV " Offset to Central Dir"; } if ($z64Data->[3] == 0xFFFF ) { out_V " Disk Number"; } } sub Ntfs2Unix { my $v = shift; my $u64 = shift; # NTFS offset is 19DB1DED53E8000 my $hex = Value_U64($u64) ; my $NTFS_OFFSET = new U64 0x19DB1DE, 0xD53E8000 ; $u64->subtract($NTFS_OFFSET); my $elapse = $u64->get64bit(); my $ns = ($elapse % 10000000) * 100; $elapse = int ($elapse/10000000); return "$hex '" . localtime($elapse) . " " . sprintf("%0dns'", $ns); } sub decode_NTFS_Filetimes { my $len = shift; my $context = shift; out_V " Reserved"; out_v " Tag1"; out_v " Size1" ; my ($m, $s1) = read_U64; out $m, " Mtime", Ntfs2Unix($m, $s1); my ($c, $s2) = read_U64; out $c, " Ctime", Ntfs2Unix($m, $s2); my ($a, $s3) = read_U64; out $m, " Atime", Ntfs2Unix($m, $s3); } sub getTime { my $time = shift ; return "'" . localtime($time) . "'" ; } sub decode_UT { my $len = shift; my $context = shift; my ($data, $flags) = read_C(); my $f = Value_C $flags; $f .= " mod" if $flags & 1; $f .= " access" if $flags & 2; $f .= " change" if $flags & 4; out $data, " Flags", "'$f'"; -- $len; if ($flags & 1) { my ($data, $time) = read_V(); out2 $data, "Mod Time", Value_V($time) . " " . getTime($time) ; $len -= 4 ; } if ($flags & 2 && $len > 0 ) { my ($data, $time) = read_V(); out2 $data, "Access Time", Value_V($time) . " " . getTime($time) ; $len -= 4 ; } if ($flags & 4 && $len > 0) { my ($data, $time) = read_V(); out2 $data, "Change Time", Value_V($time) . " " . getTime($time) ; } } sub decode_AES { my $len = shift; my $context = shift; return if $len == 0 ; my %lookup = ( 1 => "AE-1", 2 => "AE-2"); out_v " Vendor Version", sub { $lookup{$_[0]} || "Unknown" } ; my $id ; myRead($id, 2); out $id, " Vendor ID", unpackValue_v($id) . " '$id'"; my %strengths = (1 => "128-bit encryption key", 2 => "192-bit encryption key", 3 => "256-bit encryption key", ); my $strength = out_C " Encryption Strength", sub {$strengths{$_[0]} || "Unknown" } ; my ($bmethod, $method) = read_v(); out $bmethod, " Compression Method", compressionMethod($method) ; $context->{AesStrength} = $strength ; } sub decode_UX { my $len = shift; my $context = shift; my $inCentralHdr = $context->{InCentralDir} ; return if $len == 0 ; my ($data, $time) = read_V(); out2 $data, "Access Time", Value_V($time) . " " . getTime($time) ; ($data, $time) = read_V(); out2 $data, "Mod Time", Value_V($time) . " " . getTime($time) ; if (! $inCentralHdr ) { out_v " UID" ; out_v " GID"; } } sub decode_Ux { my $len = shift; my $context = shift; return if $len == 0 ; out_v " UID" ; out_v " GID"; } sub decodeLitteEndian { my $value = shift ; if (length $value == 4) { return Value_V unpack ("V", $value) } else { # TODO - fix this die "unsupported\n"; } my $got = 0 ; my $shift = 0; #hexDump #reverse #my @a =unpack "C*", $value; #@a = reverse @a; #hexDump(@a); for (reverse unpack "C*", $value) { $got = ($got << 8) + $_ ; } return $got ; } sub decode_ux { my $len = shift; my $context = shift; return if $len == 0 ; out_C " Version" ; my $uidSize = out_C " UID Size"; myRead(my $data, $uidSize); out2 $data, "UID", decodeLitteEndian($data); my $gidSize = out_C " GID Size"; myRead($data, $gidSize); out2 $data, "GID", decodeLitteEndian($data); } sub decode_Java_exe { my $len = shift; my $context = shift; } sub decode_up { my $len = shift; my $context = shift; out_C " Version"; out_V " NameCRC32"; myRead(my $data, $len - 5); out $data, " UnicodeName", $data; } sub decode_Xceed_unicode { my $len = shift; my $context = shift; my $data ; # guess the fields used for this one myRead($data, 4); out $data, " ID", $data; out_v " Length"; out_v " Null"; myRead($data, $len - 8); out $data, " UTF16LE Name", decode("UTF16LE", $data); } sub decode_NT_security { my $len = shift; my $context = shift; my $inCentralHdr = $context->{InCentralDir} ; out_V " Uncompressed Size" ; if (! $inCentralHdr) { out_C " Version" ; out_v " Type"; out_V " NameCRC32" ; my $plen = $len - 4 - 1 - 2 - 4; myRead(my $payload, $plen); out $plen, " Extra Payload", hexDump($payload); } } sub printAes { my $context = shift ; my %saltSize = ( 1 => 8, 2 => 12, 3 => 16, ); myRead(my $salt, $saltSize{$context->{AesStrength} }); out $salt, "AES Salt", hexDump($salt); myRead(my $pwv, 2); out $pwv, "AES Pwd Ver", hexDump($pwv); return $saltSize{$context->{AesStrength}} + 2 + 10; } sub printLzmaProperties { my $len = 0; my $b1; my $b2; my $buffer; myRead($b1, 2); my ($verHi, $verLow) = unpack ("CC", $b1); out $b1, "LZMA Version", sprintf("%02X%02X", $verHi, $verLow) . " '$verHi.$verLow'"; my $LzmaPropertiesSize = out_v "LZMA Properties Size"; $len += 4; my $LzmaInfo = out_C "LZMA Info", sub { $_[0] == 93 ? "(Default)" : ""}; my $PosStateBits = 0; my $LiteralPosStateBits = 0; my $LiteralContextBits = 0; $PosStateBits = int($LzmaInfo / (9 * 5)); $LzmaInfo -= $PosStateBits * 9 * 5; $LiteralPosStateBits = int($LzmaInfo / 9); $LiteralContextBits = $LzmaInfo - $LiteralPosStateBits * 9; out1 " PosStateBits", $PosStateBits; out1 " LiteralPosStateBits", $LiteralPosStateBits; out1 " LiteralContextBits", $LiteralContextBits; out_V "LZMA Dictionary Size"; # TODO - assumption that this is 5 $len += $LzmaPropertiesSize; skip($FH, $LzmaPropertiesSize - 5) if $LzmaPropertiesSize != 5 ; return $len; } sub scanCentralDirectory { my $fh = shift; my $here = $fh->tell(); # Use cases # 1 32-bit CD # 2 64-bit CD my @CD = (); my $offset = findCentralDirectoryOffset($fh); return () if ! defined $offset; $fh->seek($offset, SEEK_SET) ; # Now walk the Central Directory Records my $buffer ; while ($fh->read($buffer, 46) == 46 && unpack("V", $buffer) == ZIP_CENTRAL_HDR_SIG) { my $compressedLength = unpack("V", substr($buffer, 20, 4)); my $uncompressedLength = unpack("V", substr($buffer, 24, 4)); my $filename_length = unpack("v", substr($buffer, 28, 2)); my $extra_length = unpack("v", substr($buffer, 30, 2)); my $comment_length = unpack("v", substr($buffer, 32, 2)); my $locHeaderOffset = unpack("V", substr($buffer, 42, 4)); $START = $locHeaderOffset if ! defined $START; skip($fh, $filename_length ) ; my $v64 = new U64 $compressedLength ; my $loc64 = new U64 $locHeaderOffset ; my $got = [$loc64, $v64] ; if (full32 $compressedLength || full32 $locHeaderOffset) { $fh->read($buffer, $extra_length) ; # TODO - fix this die "xxx $offset $comment_length $filename_length $extra_length" . length($buffer) if length($buffer) != $extra_length; $got = get64Extra($buffer, full32($uncompressedLength), $v64, $loc64); # If not Zip64 extra field, assume size is 0xFFFFFFFF #$v64 = $got if defined $got; } else { skip($fh, $extra_length) ; } skip($fh, $comment_length ) ; push @CD, $got ; } $fh->seek($here, SEEK_SET) ; @CD = sort { $a->[0]->cmp($b->[0]) } @CD ; return @CD; } sub get64Extra { my $buffer = shift; my $is_uncomp = shift ; my $comp = shift ; my $loc = shift ; my $extra = findID(0x0001, $buffer); if ( defined $extra) { my $offset = 0; $offset += 8 if $is_uncomp; if ($comp->max32()) { $comp = U64::newUnpack_V64(substr($extra, $offset)) ; $offset += 8; } if ($loc->max32()) { $loc = U64::newUnpack_V64(substr($extra, $offset)) ; } } return [$loc, $comp] ; } sub offsetFromZip64 { my $fh = shift ; my $here = shift; $fh->seek($here - 20, SEEK_SET) # TODO - fix this or die "xx $!" ; my $buffer; my $got = 0; ($got = $fh->read($buffer, 20)) == 20 # TODO - fix this or die "xxx $here $got $!" ; if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_LOC_HDR_SIG ) { my $cd64 = Value_VV64 substr($buffer, 8, 8); $fh->seek($cd64, SEEK_SET) ; $fh->read($buffer, 4) == 4 # TODO - fix this or die "xxx" ; if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_REC_HDR_SIG ) { $fh->read($buffer, 8) == 8 # TODO - fix this or die "xxx" ; my $size = Value_VV64($buffer); $fh->read($buffer, $size) == $size # TODO - fix this or die "xxx" ; my $cd64 = Value_VV64 substr($buffer, 36, 8); return $cd64 ; } # TODO - fix this die "zzz"; } # TODO - fix this die "zzz"; } use constant Pack_ZIP_END_CENTRAL_HDR_SIG => pack("V", ZIP_END_CENTRAL_HDR_SIG); sub findCentralDirectoryOffset { my $fh = shift ; # Most common use-case is where there is no comment, so # know exactly where the end of central directory record # should be. $fh->seek(-22, SEEK_END) ; my $here = $fh->tell(); my $buffer; $fh->read($buffer, 22) == 22 # TODO - fix this or die "xxx" ; my $zip64 = 0; my $centralDirOffset ; if ( unpack("V", $buffer) == ZIP_END_CENTRAL_HDR_SIG ) { $centralDirOffset = unpack("V", substr($buffer, 16, 4)); } else { $fh->seek(0, SEEK_END) ; my $fileLen = $fh->tell(); my $want = 0 ; while(1) { $want += 1024 * 32; my $seekTo = $fileLen - $want; if ($seekTo < 0 ) { $seekTo = 0; $want = $fileLen ; } $fh->seek( $seekTo, SEEK_SET) # TODO - fix this or die "xxx $!" ; my $got; ($got = $fh->read($buffer, $want)) == $want # TODO - fix this or die "xxx $got $!" ; my $pos = rindex( $buffer, Pack_ZIP_END_CENTRAL_HDR_SIG); if ($pos >= 0 && $want - $pos > 22) { $here = $seekTo + $pos ; $centralDirOffset = unpack("V", substr($buffer, $pos + 16, 4)); my $commentLength = unpack("V", substr($buffer, $pos + 20, 2)); $commentLength = 0 if ! defined $commentLength ; my $expectedEof = $fileLen - $want + $pos + 22 + $commentLength ; # check for trailing data after end of zip if ($expectedEof < $fileLen ) { $TRAILING = $expectedEof ; } last ; } return undef if $want == $fileLen; } } $centralDirOffset = offsetFromZip64($fh, $here) if full32 $centralDirOffset ; return $centralDirOffset ; } sub findID { my $id_want = shift ; my $data = shift; my $XLEN = length $data ; my $offset = 0 ; while ($offset < $XLEN) { return undef if $offset + ZIP_EXTRA_SUBFIELD_HEADER_SIZE > $XLEN ; my $id = substr($data, $offset, ZIP_EXTRA_SUBFIELD_ID_SIZE); $id = unpack("v", $id); $offset += ZIP_EXTRA_SUBFIELD_ID_SIZE; my $subLen = unpack("v", substr($data, $offset, ZIP_EXTRA_SUBFIELD_LEN_SIZE)); $offset += ZIP_EXTRA_SUBFIELD_LEN_SIZE ; return undef if $offset + $subLen > $XLEN ; return substr($data, $offset, $subLen) if $id eq $id_want ; $offset += $subLen ; } return undef ; } sub _dosToUnixTime { my $dt = shift; my $year = ( ( $dt >> 25 ) & 0x7f ) + 80; my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1; my $mday = ( ( $dt >> 16 ) & 0x1f ); my $hour = ( ( $dt >> 11 ) & 0x1f ); my $min = ( ( $dt >> 5 ) & 0x3f ); my $sec = ( ( $dt << 1 ) & 0x3e ); use POSIX 'mktime'; my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 ); return 0 if ! defined $time_t; return $time_t; } { package U64; use constant MAX32 => 0xFFFFFFFF ; use constant HI_1 => MAX32 + 1 ; use constant LOW => 0 ; use constant HIGH => 1; sub new { my $class = shift ; my $high = 0 ; my $low = 0 ; if (@_ == 2) { $high = shift ; $low = shift ; } elsif (@_ == 1) { $low = shift ; } bless [$low, $high], $class; } sub newUnpack_V64 { my $string = shift; my ($low, $hi) = unpack "V V", $string ; bless [ $low, $hi ], "U64"; } sub newUnpack_V32 { my $string = shift; my $low = unpack "V", $string ; bless [ $low, 0 ], "U64"; } sub reset { my $self = shift; $self->[HIGH] = $self->[LOW] = 0; } sub clone { my $self = shift; bless [ @$self ], ref $self ; } sub mkU64 { my $value = shift; return $value if ref $value eq 'U64'; bless [ $value, 0 ], "U64" ; } sub getHigh { my $self = shift; return $self->[HIGH]; } sub getLow { my $self = shift; return $self->[LOW]; } sub get32bit { my $self = shift; return $self->[LOW]; } sub get64bit { my $self = shift; # Not using << here because the result will still be # a 32-bit value on systems where int size is 32-bits return $self->[HIGH] * HI_1 + $self->[LOW]; } sub add { my $self = shift; my $value = shift; if (ref $value eq 'U64') { $self->[HIGH] += $value->[HIGH] ; $value = $value->[LOW]; } my $available = MAX32 - $self->[LOW] ; if ($value > $available) { ++ $self->[HIGH] ; $self->[LOW] = $value - $available - 1; } else { $self->[LOW] += $value ; } } sub subtract { my $self = shift; my $value = shift; if (ref $value eq 'U64') { if ($value->[HIGH]) { die "unsupport subtract option" if $self->[HIGH] == 0 || $value->[HIGH] > $self->[HIGH] ; $self->[HIGH] -= $value->[HIGH] ; } $value = $value->[LOW] ; } if ($value > $self->[LOW]) { -- $self->[HIGH] ; $self->[LOW] = MAX32 - $value + $self->[LOW] + 1; } else { $self->[LOW] -= $value; } } sub rshift { my $self = shift; my $count = shift; for (1 .. $count) { $self->[LOW] >>= 1; $self->[LOW] |= 0x80000000 if $self->[HIGH] & 1 ; $self->[HIGH] >>= 1; } } sub is64bit { my $self = shift; return $self->[HIGH] > 0 ; } sub getPacked_V64 { my $self = shift; return pack "V V", @$self ; } sub getPacked_V32 { my $self = shift; return pack "V", $self->[LOW] ; } sub pack_V64 { my $low = shift; return pack "V V", $low, 0; } sub max32 { my $self = shift; return $self->[HIGH] == 0 && $self->[LOW] == MAX32; } sub stringify { my $self = shift; return "High [$self->[HIGH]], Low [$self->[LOW]]"; } sub equal { my $self = shift; my $other = shift; return $self->[LOW] == $other->[LOW] && $self->[HIGH] == $other->[HIGH] ; } sub gt { my $self = shift; my $other = shift; return $self->cmp($other) > 0 ; } sub cmp { my $self = shift; my $other = shift ; if ($self->[LOW] == $other->[LOW]) { return $self->[HIGH] - $other->[HIGH] ; } else { return $self->[LOW] - $other->[LOW] ; } } sub nibbles { my @nibbles = ( [ 16 => HI_1 * 0x10000000 ], [ 15 => HI_1 * 0x1000000 ], [ 14 => HI_1 * 0x100000 ], [ 13 => HI_1 * 0x10000 ], [ 12 => HI_1 * 0x1000 ], [ 11 => HI_1 * 0x100 ], [ 10 => HI_1 * 0x10 ], [ 9 => HI_1 * 0x1 ], [ 8 => 0x10000000 ], [ 7 => 0x1000000 ], [ 6 => 0x100000 ], [ 5 => 0x10000 ], [ 4 => 0x1000 ], [ 3 => 0x100 ], [ 2 => 0x10 ], [ 1 => 0x1 ], ); my $value = shift ; for my $pair (@nibbles) { my ($count, $limit) = @{ $pair }; return $count if $value >= $limit ; } } } sub Usage { die <<EOM; zipdetails [OPTIONS] file Display details about the internal structure of a Zip file. This is zipdetails version $VERSION OPTIONS -h display help -v Verbose - output more stuff Copyright (c) 2011 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. EOM } __END__ =head1 NAME zipdetails - display the internal structure of zip files =head1 SYNOPSIS zipdetaile [-v] zipfile.zip zipdetails -h =head1 DESCRIPTION Zipdetails displays information about the internal record structure of the zip file. It is not concerned with displaying any details of the compressed data stored in the zip file. The program assumes prior understanding of the internal structure of a Zip file. You should have a copy of the Zip APPNOTE file at hand to help understand the output from this program (L<SEE ALSO> for details). =head2 OPTIONS =over 5 =item -v Enable Verbose mode =item -h Display help =back By default zipdetails will output the details of the zip file in three columns. =over 5 =item Column 1 This contains the offset from the start of the file in hex. =item Column 2 This contains a textual description of the field. =item Column 3 If the field contains a numeric value it will be displayed in hex. Zip stored most numbers in little-endian format - the value displayed will have the little-endian encoding removed. Next, is an optional description of what the value means. =back If the C<-v> option is present, column 1 is expanded to include =over 5 =item * The offset from the start of the file in hex. =item * The length of the filed in hex. =item * A hex dump of the bytes in field in the order they are stored in the zip file. =back =head1 TODO Error handling is still a work in progress. If the program encounters a problem reading a zip file it is likely to terminate with an unhelpful error message. =head1 SEE ALSO The primary reference for Zip files is the "appnote" document available at L<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>. An alternative reference is the Info-Zip appnote. This is available from L<ftp://ftp.info-zip.org/pub/infozip/doc/> The C<zipinfo> program that comes with the info-zip distribution (L<http://www.info-zip.org/>) can also display details of the structure of a zip file. See also L<Archive::Zip::SimpleZip>, L<IO::Compress::Zip>, L<IO::Uncompress::Unzip>. =head1 AUTHOR Paul Marquess F<pmqs@cpan.org>. =head1 COPYRIGHT Copyright (c) 2011-2013 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Close