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