1f72f8299SJan Lentfer 2327e51cbSPeter Avalos#------------------------------------------------------------------------------ 3*3b9cdfa3SAntonio Huete Jimenez# $File: cafebabe,v 1.28 2022/07/01 23:24:47 christos Exp $ 4327e51cbSPeter Avalos# Cafe Babes unite! 5327e51cbSPeter Avalos# 6e8af9738SPeter Avalos# Since Java bytecode and Mach-O universal binaries have the same magic number, 7e8af9738SPeter Avalos# the test must be performed in the same "magic" sequence to get both right. 8e8af9738SPeter Avalos# The long at offset 4 in a Mach-O universal binary tells the number of 9e8af9738SPeter Avalos# architectures; the short at offset 4 in a Java bytecode file is the JVM minor 10e8af9738SPeter Avalos# version and the short at offset 6 is the JVM major version. Since there are only 11327e51cbSPeter Avalos# only 18 labeled Mach-O architectures at current, and the first released 12327e51cbSPeter Avalos# Java class format was version 43.0, we can safely choose any number 13327e51cbSPeter Avalos# between 18 and 39 to test the number of architectures against 14327e51cbSPeter Avalos# (and use as a hack). Let's not use 18, because the Mach-O people 15327e51cbSPeter Avalos# might add another one or two as time goes by... 16327e51cbSPeter Avalos# 17e8af9738SPeter Avalos### JAVA START ### 18970935fdSSascha Wildner# Reference: http://en.wikipedia.org/wiki/Java_class_file 19970935fdSSascha Wildner# Update: Joerg Jenderek 20327e51cbSPeter Avalos0 belong 0xcafebabe 21970935fdSSascha Wildner>4 ubelong >30 compiled Java class data, 22e8af9738SPeter Avalos!:mime application/x-java-applet 23970935fdSSascha Wildner#!:mime application/java-byte-code 24970935fdSSascha Wildner!:ext class 25970935fdSSascha Wildner>>6 ubeshort x version %d. 26970935fdSSascha Wildner>>4 ubeshort x \b%d 27970935fdSSascha Wildner# for debugging purpose version as hexadecimal to compare with Mach-O universal binary 28614728caSSascha Wildner#>>4 ubelong x (%#8.8x) 2979343712SPeter Avalos# Which is which? 30970935fdSSascha Wildner# https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html 31970935fdSSascha Wildner#>>4 belong 0x002b (Java 0.?) 3279343712SPeter Avalos#>>4 belong 0x032d (Java 1.0) 3379343712SPeter Avalos#>>4 belong 0x032d (Java 1.1) 3479343712SPeter Avalos>>4 belong 0x002e (Java 1.2) 3579343712SPeter Avalos>>4 belong 0x002f (Java 1.3) 3679343712SPeter Avalos>>4 belong 0x0030 (Java 1.4) 3779343712SPeter Avalos>>4 belong 0x0031 (Java 1.5) 3879343712SPeter Avalos>>4 belong 0x0032 (Java 1.6) 39c30bd091SSascha Wildner>>4 belong 0x0033 (Java 1.7) 40c30bd091SSascha Wildner>>4 belong 0x0034 (Java 1.8) 41970935fdSSascha Wildner>>4 belong 0x0035 (Java SE 9) 42970935fdSSascha Wildner>>4 belong 0x0036 (Java SE 10) 43970935fdSSascha Wildner>>4 belong 0x0037 (Java SE 11) 44970935fdSSascha Wildner>>4 belong 0x0038 (Java SE 12) 45970935fdSSascha Wildner>>4 belong 0x0039 (Java SE 13) 46970935fdSSascha Wildner>>4 belong 0x003A (Java SE 14) 47*3b9cdfa3SAntonio Huete Jimenez>>4 belong 0x003B (Java SE 15) 48*3b9cdfa3SAntonio Huete Jimenez>>4 belong 0x003C (Java SE 16) 49*3b9cdfa3SAntonio Huete Jimenez>>4 belong 0x003D (Java SE 17) 50*3b9cdfa3SAntonio Huete Jimenez>>4 belong 0x003E (Java SE 18) 51*3b9cdfa3SAntonio Huete Jimenez>>4 belong 0x003F (Java SE 19) 52*3b9cdfa3SAntonio Huete Jimenez>>4 belong 0x0040 (Java SE 20) 53970935fdSSascha Wildner# pool count unequal zero 54614728caSSascha Wildner#>>8 beshort x \b, pool count %#x 55970935fdSSascha Wildner# pool table 56614728caSSascha Wildner#>>10 ubequad x \b, pool %#16.16llx... 5779343712SPeter Avalos 58e8af9738SPeter Avalos0 belong 0xcafed00d JAR compressed with pack200, 59e8af9738SPeter Avalos>5 byte x version %d. 60e8af9738SPeter Avalos>4 byte x \b%d 61e8af9738SPeter Avalos!:mime application/x-java-pack200 6279343712SPeter Avalos 6379343712SPeter Avalos 6479343712SPeter Avalos0 belong 0xcafed00d JAR compressed with pack200, 65e8af9738SPeter Avalos>5 byte x version %d. 66e8af9738SPeter Avalos>4 byte x \b%d 6779343712SPeter Avalos!:mime application/x-java-pack200 68e8af9738SPeter Avalos 69e8af9738SPeter Avalos### JAVA END ### 70e8af9738SPeter Avalos### MACH-O START ### 71970935fdSSascha Wildner# URL: https://en.wikipedia.org/wiki/Mach-O 72e8af9738SPeter Avalos 73e8af9738SPeter Avalos0 name mach-o \b [ 74970935fdSSascha Wildner# for debugging purpose CPU type as hexadecimal 75970935fdSSascha Wildner#>0 ubequad x CPU=%16.16llx 76970935fdSSascha Wildner# display CPU type as string like: i386 x86_64 ... armv7 armv7k ... 77e8af9738SPeter Avalos>0 use mach-o-cpu \b 78970935fdSSascha Wildner# for debugging purpose print offset to 1st mach_header like: 79970935fdSSascha Wildner# 1000h 4000h seldom 2d000h 88000h 5b000h 10e000 h 80614728caSSascha Wildner#>8 ubelong x at %#x offset 81c30bd091SSascha Wildner>(8.L) indirect x \b: 82e8af9738SPeter Avalos>0 belong x \b] 83e8af9738SPeter Avalos 84970935fdSSascha Wildner# Reference: https://opensource.apple.com/source/cctools/cctools-949.0.1/ 85970935fdSSascha Wildner# include/mach-o/fat.h 86970935fdSSascha Wildner# include/mach/machine.h 87e8af9738SPeter Avalos0 belong 0xcafebabe 88e8af9738SPeter Avalos>4 belong 1 Mach-O universal binary with 1 architecture: 89c30bd091SSascha Wildner!:mime application/x-mach-binary 90e8af9738SPeter Avalos>>8 use mach-o \b 91970935fdSSascha Wildner# nfat_arch; number of CPU architectures; highest is 18 for CPU_TYPE_POWERPC in 2020 92970935fdSSascha Wildner>4 ubelong >1 93970935fdSSascha Wildner>>4 ubelong <20 Mach-O universal binary with %d architectures: 94c30bd091SSascha Wildner!:mime application/x-mach-binary 95e8af9738SPeter Avalos>>>8 use mach-o \b 96970935fdSSascha Wildner>>>4 ubelong >1 97970935fdSSascha Wildner>>>>28 use mach-o \b 98970935fdSSascha Wildner>>>4 ubelong >2 99970935fdSSascha Wildner>>>>48 use mach-o \b 100970935fdSSascha Wildner>>>4 ubelong >3 101970935fdSSascha Wildner>>>>68 use mach-o \b 102970935fdSSascha Wildner>>>4 ubelong >4 103970935fdSSascha Wildner>>>>88 use mach-o \b 104970935fdSSascha Wildner>>>4 ubelong >5 105970935fdSSascha Wildner>>>>108 use mach-o \b 106e8af9738SPeter Avalos 107e8af9738SPeter Avalos### MACH-O END ### 108