Skip to content

Commit 6c72d06

Browse files
radaretrufae
authored andcommitted
Ignore fatmacho magics in the java bin plugin ##bin
1 parent 44339d6 commit 6c72d06

1 file changed

Lines changed: 27 additions & 10 deletions

File tree

libr/bin/p/bin_java.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,35 @@ static RBinInfo *info(RBinFile *bf) {
8989
}
9090

9191
static bool check(RBinFile *bf, RBuffer *b) {
92-
if (r_buf_size (b) > 32) {
93-
ut8 buf[4];
94-
r_buf_read_at (b, 0, buf, sizeof (buf));
95-
if (!memcmp (buf, "\xca\xfe\xba\xbe", 4)) {
96-
int off = r_buf_read_be32_at (b, 4 * sizeof (int));
97-
int version = r_buf_read_be16_at (b, 6);
98-
if (off > 0 && version < 1024) {
99-
return true;
100-
}
92+
if (r_buf_size (b) <= 32) {
93+
return false;
94+
}
95+
ut8 buf[4];
96+
r_buf_read_at (b, 0, buf, sizeof (buf));
97+
if (memcmp (buf, "\xca\xfe\xba\xbe", 4)) {
98+
return false;
99+
}
100+
// Disambiguate from fat Mach-O (same magic): reject when the bytes at
101+
// offset 16 look like a mach-o header (fat_arch[0].offset points there).
102+
ut8 m[4];
103+
ut32 off0 = r_buf_read_be32_at (b, 8);
104+
if (off0 > 0 && off0 + 4 <= r_buf_size (b) && r_buf_read_at (b, off0, m, 4) == 4) {
105+
if (!memcmp (m, "\xce\xfa\xed\xfe", 4)
106+
|| !memcmp (m, "\xfe\xed\xfa\xce", 4)
107+
|| !memcmp (m, "\xfe\xed\xfa\xcf", 4)
108+
|| !memcmp (m, "\xcf\xfa\xed\xfe", 4)) {
109+
return false;
101110
}
102111
}
103-
return false;
112+
// Java class: minor_version (4-5), major_version (6-7). major>=45 since
113+
// Java 1.1; <1024 keeps the old sanity bound.
114+
ut16 major = r_buf_read_be16_at (b, 6);
115+
if (major < 45 || major >= 1024) {
116+
return false;
117+
}
118+
// constant_pool_count at offset 8; must be > 0 per JVM spec.
119+
ut16 cp_count = r_buf_read_be16_at (b, 8);
120+
return cp_count > 0;
104121
}
105122

106123
static int retdemangle(const char *str) {

0 commit comments

Comments
 (0)