1
2#------------------------------------------------------------------------------
3# $File: cafebabe,v 1.28 2022/07/01 23:24:47 christos Exp $
4# Cafe Babes unite!
5#
6# Since Java bytecode and Mach-O universal binaries have the same magic number,
7# the test must be performed in the same "magic" sequence to get both right.
8# The long at offset 4 in a Mach-O universal binary tells the number of
9# architectures; the short at offset 4 in a Java bytecode file is the JVM minor
10# version and the short at offset 6 is the JVM major version.  Since there are only
11# only 18 labeled Mach-O architectures at current, and the first released
12# Java class format was version 43.0, we can safely choose any number
13# between 18 and 39 to test the number of architectures against
14# (and use as a hack). Let's not use 18, because the Mach-O people
15# might add another one or two as time goes by...
16#
17### JAVA START ###
18# Reference:        http://en.wikipedia.org/wiki/Java_class_file
19# Update: Joerg Jenderek
200         belong              0xcafebabe
21>4        ubelong             >30                 compiled Java class data,
22!:mime    application/x-java-applet
23#!:mime   application/java-byte-code
24!:ext     class
25>>6       ubeshort  x                 version %d.
26>>4       ubeshort  x         \b%d
27# for debugging purpose version as hexadecimal to compare with Mach-O universal binary
28#>>4      ubelong             x         (%#8.8x)
29# Which is which?
30# https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html
31#>>4      belong              0x002b              (Java 0.?)
32#>>4      belong              0x032d              (Java 1.0)
33#>>4      belong              0x032d              (Java 1.1)
34>>4       belong              0x002e              (Java 1.2)
35>>4       belong              0x002f              (Java 1.3)
36>>4       belong              0x0030              (Java 1.4)
37>>4       belong              0x0031              (Java 1.5)
38>>4       belong              0x0032              (Java 1.6)
39>>4       belong              0x0033              (Java 1.7)
40>>4       belong              0x0034              (Java 1.8)
41>>4       belong              0x0035              (Java SE 9)
42>>4       belong              0x0036              (Java SE 10)
43>>4       belong              0x0037              (Java SE 11)
44>>4       belong              0x0038              (Java SE 12)
45>>4       belong              0x0039              (Java SE 13)
46>>4       belong              0x003A              (Java SE 14)
47>>4       belong              0x003B              (Java SE 15)
48>>4       belong              0x003C              (Java SE 16)
49>>4       belong              0x003D              (Java SE 17)
50>>4       belong              0x003E              (Java SE 18)
51>>4       belong              0x003F              (Java SE 19)
52>>4       belong              0x0040              (Java SE 20)
53# pool count unequal zero
54#>>8      beshort             x                 \b, pool count %#x
55# pool table
56#>>10     ubequad             x                 \b, pool %#16.16llx...
57
580         belong              0xcafed00d          JAR compressed with pack200,
59>5        byte                x                   version %d.
60>4        byte                x                   \b%d
61!:mime    application/x-java-pack200
62
63
640         belong              0xcafed00d          JAR compressed with pack200,
65>5        byte                x                   version %d.
66>4        byte                x                   \b%d
67!:mime    application/x-java-pack200
68
69### JAVA END ###
70### MACH-O START ###
71# URL:              https://en.wikipedia.org/wiki/Mach-O
72
730         name                mach-o              \b [
74# for debugging purpose CPU type as hexadecimal
75#>0       ubequad             x                   CPU=%16.16llx
76# display CPU type as string like: i386 x86_64 ... armv7 armv7k ...
77>0        use                 mach-o-cpu          \b
78# for debugging purpose print offset to 1st mach_header like:
79# 1000h 4000h seldom 2d000h 88000h 5b000h 10e000 h
80#>8       ubelong             x                   at %#x offset
81>(8.L)    indirect  x                   \b:
82>0        belong              x                   \b]
83
84# Reference:        https://opensource.apple.com/source/cctools/cctools-949.0.1/
85#                   include/mach-o/fat.h
86#                   include/mach/machine.h
870         belong              0xcafebabe
88>4        belong              1                   Mach-O universal binary with 1 architecture:
89!:mime application/x-mach-binary
90>>8       use                 mach-o              \b
91# nfat_arch; number of CPU architectures; highest is 18 for CPU_TYPE_POWERPC in 2020
92>4        ubelong             >1
93>>4       ubelong             <20                 Mach-O universal binary with %d architectures:
94!:mime application/x-mach-binary
95>>>8      use                 mach-o              \b
96>>>4      ubelong             >1
97>>>>28    use                 mach-o              \b
98>>>4      ubelong             >2
99>>>>48    use                 mach-o              \b
100>>>4      ubelong             >3
101>>>>68    use                 mach-o              \b
102>>>4      ubelong             >4
103>>>>88    use                 mach-o              \b
104>>>4      ubelong             >5
105>>>>108   use                 mach-o              \b
106
107### MACH-O END ###
108