Split bin field from class fields and fix demangling on java (#3479)

* Split Bin Field from Class fields.
* Fix tests and plugins
This commit is contained in:
Giovanni 2023-04-26 15:25:42 +08:00 committed by GitHub
parent ca547fc6fb
commit 59080758fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 1271 additions and 1179 deletions

View file

@ -511,15 +511,16 @@ RZ_IPI RzBinClass *rz_bin_class_new(const char *name, const char *super, int vie
return c;
}
RZ_IPI void rz_bin_class_free(RzBinClass *k) {
if (k && k->name) {
free(k->name);
free(k->super);
rz_list_free(k->methods);
rz_list_free(k->fields);
free(k->visibility_str);
free(k);
RZ_API void rz_bin_class_free(RzBinClass *k) {
if (!k) {
return;
}
free(k->name);
free(k->super);
rz_list_free(k->methods);
rz_list_free(k->fields);
free(k->visibility_str);
free(k);
}
RZ_API RzBinClass *rz_bin_file_add_class(RzBinFile *bf, const char *name, const char *super, int view) {

View file

@ -949,28 +949,57 @@ RZ_API void rz_bin_load_filter(RzBin *bin, ut64 rules) {
/* RzBinField */
RZ_API RzBinField *rz_bin_field_new(ut64 paddr, ut64 vaddr, int size, const char *name, const char *comment, const char *format, bool format_named) {
RzBinField *ptr = RZ_NEW0(RzBinField);
if (ptr) {
ptr->name = strdup(name);
ptr->comment = (comment && *comment) ? strdup(comment) : NULL;
ptr->format = (format && *format) ? strdup(format) : NULL;
ptr->format_named = format_named;
ptr->paddr = paddr;
ptr->size = size;
// ptr->visibility = any default visibility?
ptr->vaddr = vaddr;
if (!ptr) {
return NULL;
}
ptr->name = rz_str_new(name);
ptr->comment = rz_str_new(comment);
ptr->format = rz_str_new(format);
ptr->format_named = format_named;
ptr->paddr = paddr;
ptr->size = size;
ptr->vaddr = vaddr;
return ptr;
}
RZ_API void rz_bin_field_free(RzBinField *field) {
if (field) {
free(field->name);
free(field->visibility_str);
free(field->type);
free(field->comment);
free(field->format);
free(field);
if (!field) {
return;
}
free(field->name);
free(field->type);
free(field->comment);
free(field->format);
free(field);
}
/* RzBinClassField */
RZ_API RzBinClassField *rz_bin_class_field_new(ut64 vaddr, ut64 paddr, const char *name, const char *classname, const char *libname, const char *type) {
RzBinClassField *ptr = RZ_NEW0(RzBinClassField);
if (!ptr) {
return NULL;
}
ptr->vaddr = vaddr ? vaddr : UT64_MAX;
ptr->paddr = paddr;
ptr->name = rz_str_new(name);
ptr->classname = rz_str_new(classname);
ptr->libname = rz_str_new(libname);
ptr->type = rz_str_new(type);
return ptr;
}
RZ_API void rz_bin_class_field_free(RzBinClassField *field) {
if (!field) {
return;
}
free(field->name);
free(field->classname);
free(field->libname);
free(field->type);
free(field->visibility_str);
free(field);
}
RZ_API const char *rz_bin_get_meth_flag_string(ut64 flag, bool compact) {

View file

@ -257,7 +257,7 @@ static RzList /*<RzBinClass *>*/ *classes_from_symbols(RzBinFile *bf) {
char *dn = sym->dname;
char *fn = swiftField(dn, cn);
if (fn) {
RzBinField *f = rz_bin_field_new(sym->paddr, sym->vaddr, sym->size, fn, NULL, NULL, false);
RzBinClassField *f = rz_bin_class_field_new(sym->vaddr, sym->paddr, fn, sym->classname, NULL, NULL);
rz_list_append(c->fields, f);
free(fn);
} else {

View file

@ -1,5 +1,5 @@
// SPDX-FileCopyrightText: 2021 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-FileCopyrightText: 2021-2023 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021-2023 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#include "dex.h"
@ -8,6 +8,8 @@
#define DEX_INVALID_CLASS "Lunknown_class;"
#define DEX_INVALID_METHOD "unknown_method"
#define startswith(a, b) (!strncmp(a, b, strlen(b)))
typedef struct dex_access_flags_readable_t {
ut32 flag;
const char *readable;
@ -903,18 +905,34 @@ static ut64 dex_access_flags_to_bin_flags(ut64 access_flags) {
return flags;
}
static char *dex_resolve_library(const char *library) {
if (!library || library[0] != 'L') {
static char *demangle_java_and_free(char *mangled) {
if (!mangled) {
return NULL;
}
char *demangled = strdup(library + 1);
rz_str_replace_ch(demangled, '/', '.', 1);
if (RZ_STR_ISNOTEMPTY(demangled)) {
demangled[strlen(demangled) - 1] = 0;
}
char *demangled = rz_demangler_java(mangled);
free(mangled);
return demangled;
}
static void set_lib_and_class_name(char *mangled, char **out_class, char **out_lib) {
if (!mangled) {
return;
}
bool is_java_lang = startswith(mangled, "Ljava/lang");
char *object = demangle_java_and_free(mangled);
if (!object) {
return;
}
*out_class = object;
if (!is_java_lang || startswith(object, "java.lang")) {
*out_lib = strdup(object);
} else {
*out_lib = rz_str_newf("java.lang.%s", object);
}
}
static RzBinSymbol *dex_method_to_symbol(RzBinDex *dex, DexEncodedMethod *encoded_method, DexMethodId *method_id, bool is_imported) {
RzBinSymbol *symbol = RZ_NEW0(RzBinSymbol);
if (!symbol) {
@ -923,9 +941,9 @@ static RzBinSymbol *dex_method_to_symbol(RzBinDex *dex, DexEncodedMethod *encode
bool varargs = dex_is_varargs(encoded_method->access_flags);
symbol->name = dex_resolve_string_id(dex, method_id->name_idx);
symbol->classname = dex_resolve_type_id(dex, method_id->class_idx);
symbol->libname = dex_resolve_library(symbol->classname);
symbol->dname = dex_resolve_proto_id(dex, symbol->name, method_id->proto_idx, varargs);
char *mangled = dex_resolve_type_id(dex, method_id->class_idx);
set_lib_and_class_name(mangled, &symbol->classname, &symbol->libname);
symbol->dname = demangle_java_and_free(dex_resolve_proto_id(dex, symbol->name, method_id->proto_idx, varargs));
symbol->bind = dex_is_static(encoded_method->access_flags) ? RZ_BIN_BIND_GLOBAL_STR : RZ_BIN_BIND_LOCAL_STR;
symbol->is_imported = is_imported;
symbol->visibility = encoded_method->access_flags & UT32_MAX;
@ -992,8 +1010,8 @@ static RzList /*<RzBinSymbol *>*/ *dex_resolve_methods_in_class(RzBinDex *dex, D
return methods;
}
static RzBinField *dex_field_to_bin_field(RzBinDex *dex, DexEncodedField *encoded_field, DexFieldId *field_id, bool is_static) {
RzBinField *field = RZ_NEW0(RzBinField);
static RzBinClassField *dex_field_to_bin_field(RzBinDex *dex, DexEncodedField *encoded_field, DexFieldId *field_id, bool is_static) {
RzBinClassField *field = RZ_NEW0(RzBinClassField);
if (!field) {
return NULL;
}
@ -1007,15 +1025,17 @@ static RzBinField *dex_field_to_bin_field(RzBinDex *dex, DexEncodedField *encode
field->paddr = encoded_field->offset;
field->visibility = encoded_field->access_flags & UT32_MAX;
field->visibility_str = rz_bin_dex_access_flags_readable(access_flags);
char *mangled = dex_resolve_type_id(dex, field_id->class_idx);
set_lib_and_class_name(mangled, &field->classname, &field->libname);
field->name = dex_resolve_string_id(dex, field_id->name_idx);
field->type = dex_resolve_type_id(dex, field_id->type_idx);
field->type = demangle_java_and_free(dex_resolve_type_id(dex, field_id->type_idx));
field->flags = dex_access_flags_to_bin_flags(access_flags);
return field;
}
static RzList /*<RzBinField *>*/ *dex_resolve_fields_in_class(RzBinDex *dex, DexClassDef *class_def, ut8 *inserted) {
RzList *fields = rz_list_newf((RzListFree)rz_bin_field_free);
static RzList /*<RzBinClassField *>*/ *dex_resolve_fields_in_class(RzBinDex *dex, DexClassDef *class_def, ut8 *inserted) {
RzList *fields = rz_list_newf((RzListFree)rz_bin_class_field_free);
if (!fields) {
return NULL;
}
@ -1033,9 +1053,9 @@ static RzList /*<RzBinField *>*/ *dex_resolve_fields_in_class(RzBinDex *dex, Dex
inserted[encoded_field->field_idx] = true;
field_id = (DexFieldId *)rz_pvector_at(dex->field_ids, encoded_field->field_idx);
RzBinField *field = dex_field_to_bin_field(dex, encoded_field, field_id, true);
RzBinClassField *field = dex_field_to_bin_field(dex, encoded_field, field_id, true);
if (!field || !rz_list_append(fields, field)) {
rz_bin_field_free(field);
rz_bin_class_field_free(field);
break;
}
}
@ -1050,9 +1070,9 @@ static RzList /*<RzBinField *>*/ *dex_resolve_fields_in_class(RzBinDex *dex, Dex
inserted[encoded_field->field_idx] = true;
field_id = (DexFieldId *)rz_pvector_at(dex->field_ids, encoded_field->field_idx);
RzBinField *field = dex_field_to_bin_field(dex, encoded_field, field_id, false);
RzBinClassField *field = dex_field_to_bin_field(dex, encoded_field, field_id, false);
if (!field || !rz_list_append(fields, field)) {
rz_bin_field_free(field);
rz_bin_class_field_free(field);
break;
}
}
@ -1066,8 +1086,8 @@ static RzBinSymbol *dex_field_to_symbol(RzBinDex *dex, DexEncodedField *encoded_
}
field->name = dex_resolve_string_id(dex, field_id->name_idx);
field->classname = dex_resolve_type_id(dex, field_id->class_idx);
field->libname = dex_resolve_library(field->classname);
char *mangled = dex_resolve_type_id(dex, field_id->class_idx);
set_lib_and_class_name(mangled, &field->classname, &field->libname);
field->bind = dex_is_static(encoded_field->access_flags) ? RZ_BIN_BIND_GLOBAL_STR : RZ_BIN_BIND_LOCAL_STR;
field->is_imported = false;
field->visibility = encoded_field->access_flags & UT32_MAX;
@ -1122,18 +1142,6 @@ static RzList /*<RzBinSymbol *>*/ *dex_resolve_fields_in_class_as_symbols(RzBinD
return fields;
}
static void free_rz_bin_class(RzBinClass *bclass) {
if (!bclass) {
return;
}
rz_list_free(bclass->methods);
rz_list_free(bclass->fields);
free(bclass->name);
free(bclass->super);
free(bclass->visibility_str);
free(bclass);
}
/**
* \brief Returns a RzList<RzBinClass*> containing the dex classes
*/
@ -1156,7 +1164,7 @@ RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_dex_classes(RZ_NONNULL RzBinDex
return NULL;
}
classes = rz_list_newf((RzListFree)free_rz_bin_class);
classes = rz_list_newf((RzListFree)rz_bin_class_free);
if (!classes) {
free(inserted_fields);
free(inserted_methods);
@ -1170,17 +1178,16 @@ RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_dex_classes(RZ_NONNULL RzBinDex
break;
}
bclass->name = dex_resolve_type_id(dex, class_def->class_idx);
bclass->super = dex_resolve_type_id(dex, class_def->superclass_idx);
bclass->name = demangle_java_and_free(dex_resolve_type_id(dex, class_def->class_idx));
bclass->super = demangle_java_and_free(dex_resolve_type_id(dex, class_def->superclass_idx));
bclass->visibility = class_def->access_flags;
bclass->visibility_str = rz_bin_dex_access_flags_readable(class_def->access_flags);
bclass->index = class_def->class_idx;
bclass->addr = class_def->offset;
bclass->methods = dex_resolve_methods_in_class(dex, class_def, inserted_methods);
bclass->fields = dex_resolve_fields_in_class(dex, class_def, inserted_fields);
if (!rz_list_append(classes, bclass)) {
free_rz_bin_class(bclass);
rz_bin_class_free(bclass);
break;
}
}
@ -1236,9 +1243,9 @@ RZ_API RZ_OWN RzList /*<RzBinSection *>*/ *rz_bin_dex_sections(RZ_NONNULL RzBinD
}
/**
* \brief Returns a RzList<RzBinField*> containing the dex fields
* \brief Returns a RzList<RzBinClassField*> containing the dex fields
*/
RZ_API RZ_OWN RzList /*<RzBinField *>*/ *rz_bin_dex_fields(RZ_NONNULL RzBinDex *dex) {
RZ_API RZ_OWN RzList /*<RzBinClassField *>*/ *rz_bin_dex_fields(RZ_NONNULL RzBinDex *dex) {
rz_return_val_if_fail(dex, NULL);
DexClassDef *class_def;
@ -1251,7 +1258,7 @@ RZ_API RZ_OWN RzList /*<RzBinField *>*/ *rz_bin_dex_fields(RZ_NONNULL RzBinDex *
return NULL;
}
fields = rz_list_newf((RzListFree)rz_bin_field_free);
fields = rz_list_newf((RzListFree)rz_bin_class_field_free);
if (!fields) {
free(inserted);
return NULL;
@ -1331,8 +1338,8 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_dex_symbols(RZ_NONNULL RzBinDex
}
field->name = dex_resolve_string_id(dex, field_id->name_idx);
field->classname = dex_resolve_type_id(dex, field_id->class_idx);
field->libname = dex_resolve_library(field->classname);
char *mangled = dex_resolve_type_id(dex, field_id->class_idx);
set_lib_and_class_name(mangled, &field->classname, &field->libname);
field->bind = RZ_BIN_BIND_WEAK_STR;
field->type = RZ_BIN_TYPE_FIELD_STR;
field->is_imported = true;
@ -1356,9 +1363,9 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_dex_symbols(RZ_NONNULL RzBinDex
}
method->name = dex_resolve_string_id(dex, method_id->name_idx);
method->classname = dex_resolve_type_id(dex, method_id->class_idx);
method->libname = dex_resolve_library(method->classname);
method->dname = dex_resolve_proto_id(dex, method->name, method_id->proto_idx, false);
char *mangled = dex_resolve_type_id(dex, method_id->class_idx);
set_lib_and_class_name(mangled, &method->classname, &method->libname);
method->dname = demangle_java_and_free(dex_resolve_proto_id(dex, method->name, method_id->proto_idx, false));
method->bind = RZ_BIN_BIND_WEAK_STR;
method->is_imported = true;
method->type = RZ_BIN_TYPE_METH_STR;
@ -1437,28 +1444,12 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex
break;
}
char *object = dex_resolve_type_id(dex, field_id->class_idx);
if (RZ_STR_ISEMPTY(object)) {
free(object);
free(import);
break;
}
rz_str_replace_char(object, ';', 0);
char *class_name = (char *)rz_str_rchr(object, NULL, '/');
if (class_name) {
class_name[0] = 0;
class_name++;
}
rz_str_replace_ch(object, '/', '.', 1);
import->name = dex_resolve_string_id(dex, field_id->name_idx);
import->libname = class_name ? strdup(object + 1) : NULL;
import->classname = strdup(class_name ? class_name : object + 1);
char *mangled = dex_resolve_type_id(dex, field_id->class_idx);
set_lib_and_class_name(mangled, &import->classname, &import->libname);
import->bind = RZ_BIN_BIND_WEAK_STR;
import->type = RZ_BIN_TYPE_FIELD_STR;
import->ordinal = ordinal;
free(object);
if (!rz_list_append(imports, import)) {
rz_bin_import_free(import);
@ -1485,30 +1476,14 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex
break;
}
char *object = dex_resolve_type_id(dex, method_id->class_idx);
if (RZ_STR_ISEMPTY(object)) {
free(object);
rz_bin_import_free(import);
break;
}
rz_str_replace_char(object, ';', 0);
char *class_name = (char *)rz_str_rchr(object, NULL, '/');
if (class_name) {
class_name[0] = 0;
class_name++;
}
rz_str_replace_ch(object, '/', '.', 1);
char *name = dex_resolve_string_id(dex, method_id->name_idx);
import->name = dex_resolve_proto_id(dex, name, method_id->proto_idx, false);
import->libname = class_name ? strdup(object + 1) : NULL;
import->classname = strdup(class_name ? class_name : object + 1);
char *mangled = dex_resolve_type_id(dex, method_id->class_idx);
set_lib_and_class_name(mangled, &import->classname, &import->libname);
import->bind = RZ_BIN_BIND_WEAK_STR;
import->type = RZ_BIN_TYPE_FUNC_STR;
import->ordinal = ordinal;
free(name);
free(object);
if (!rz_list_append(imports, import)) {
rz_bin_import_free(import);
@ -1574,7 +1549,7 @@ RZ_API RZ_OWN RzList /*<char *>*/ *rz_bin_dex_libraries(RZ_NONNULL RzBinDex *dex
}
char *object = dex_resolve_type_id(dex, method_id->class_idx);
if (RZ_STR_ISEMPTY(object) || *object != 'L' || !strncmp(object, "Ljava/", strlen("Ljava/"))) {
if (RZ_STR_ISEMPTY(object) || *object != 'L' || startswith(object, "Ljava/")) {
free(object);
continue;
}
@ -2028,19 +2003,19 @@ RZ_API RZ_OWN char *rz_bin_dex_version(RZ_NONNULL RzBinDex *dex) {
rz_return_val_if_fail(dex, NULL);
// https://cs.android.com/android/platform/superproject/+/master:dalvik/dx/src/com/android/dex/DexFormat.java;l=55;bpv=1;bpt=0
// https://developer.android.com/studio/releases/platforms
if (!strncmp((char *)dex->version, "009", 3)) {
if (startswith((char *)dex->version, "009")) {
return strdup("Android M3 release (Nov-Dec 2007)");
} else if (!strncmp((char *)dex->version, "013", 3)) {
} else if (startswith((char *)dex->version, "013")) {
return strdup("Android M5 release (Feb-Mar 2008)");
} else if (!strncmp((char *)dex->version, "035", 3)) {
} else if (startswith((char *)dex->version, "035")) {
return strdup("Android 3.2 (API level 13 and earlier)");
} else if (!strncmp((char *)dex->version, "037", 3)) {
} else if (startswith((char *)dex->version, "037")) {
return strdup("Android 7 (API level 24 and earlier)");
} else if (!strncmp((char *)dex->version, "038", 3)) {
} else if (startswith((char *)dex->version, "038")) {
return strdup("Android 8 (API level 26 and earlier)");
} else if (!strncmp((char *)dex->version, "039", 3)) {
} else if (startswith((char *)dex->version, "039")) {
return strdup("Android 9 (API level 28 and earlier)");
} else if (!strncmp((char *)dex->version, "040", 3)) {
} else if (startswith((char *)dex->version, "040")) {
return strdup("Android 10+ (Aug 2019)");
}
return NULL;

View file

@ -1,5 +1,5 @@
// SPDX-FileCopyrightText: 2021 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-FileCopyrightText: 2021-2023 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021-2023 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_DEX_H
@ -209,7 +209,7 @@ RZ_API ut64 rz_bin_dex_debug_info(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinString *>*/ *rz_bin_dex_strings(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_dex_classes(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinField *>*/ *rz_bin_dex_fields(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinClassField *>*/ *rz_bin_dex_fields(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinSection *>*/ *rz_bin_dex_sections(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_dex_symbols(RZ_NONNULL RzBinDex *dex);
RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_dex_imports(RZ_NONNULL RzBinDex *dex);

View file

@ -1,9 +1,12 @@
// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-FileCopyrightText: 2021-2023 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021-2023 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#include "class_bin.h"
#include "class_private.h"
#define startswith(a, b) (!strncmp(a, b, strlen(b)))
#define ACCESS_FLAG_MASK_SRC (ACCESS_FLAG_PUBLIC | ACCESS_FLAG_PRIVATE | ACCESS_FLAG_PROTECTED | ACCESS_FLAG_STATIC | ACCESS_FLAG_FINAL)
#define CLASS_ACCESS_FLAGS_SIZE 16
@ -386,10 +389,10 @@ RZ_API RZ_BORROW const char *rz_bin_java_class_language(RZ_NONNULL RzBinJavaClas
continue;
}
string = java_constant_pool_stringify(cpool);
if (string && !strncmp(string, "kotlin/jvm", 10)) {
if (string && startswith(string, "kotlin/jvm")) {
language = "kotlin";
break;
} else if (string && !strncmp(string, "org/codehaus/groovy/runtime", 27)) {
} else if (string && startswith(string, "org/codehaus/groovy/runtime")) {
language = "groovy";
break;
}
@ -471,7 +474,13 @@ RZ_API RZ_OWN char *rz_bin_java_class_super(RZ_NONNULL RzBinJavaClass *bin) {
RZ_LOG_ERROR("java bin: unknown super name at constant pool index %u\n", bin->this_class);
return strdup("unknown_super");
}
return java_class_constant_pool_stringify_at(bin, index);
char *tmp = java_class_constant_pool_stringify_at(bin, index);
if (!tmp) {
return NULL;
}
char *class_name = rz_str_newf("L%s;", tmp);
free(tmp);
return class_name;
}
RZ_API ut32 rz_bin_java_class_access_flags(RZ_NONNULL RzBinJavaClass *bin) {
@ -744,7 +753,7 @@ RZ_API void rz_bin_java_class_as_source_code(RZ_NONNULL RzBinJavaClass *bin, RZ_
if (bin->access_flags & ACCESS_FLAG_SUPER) {
tmp = rz_bin_java_class_super(bin);
if (strcmp(tmp, "java/lang/Object") != 0) {
if (strcmp(tmp, "Ljava/lang/Object;") != 0) {
rz_str_replace_char(tmp, '/', '.');
rz_strbuf_appendf(sb, " extends %s", tmp);
}
@ -1046,6 +1055,37 @@ static char *add_class_name_to_name(char *name, char *classname) {
return strdup(name);
}
static char *demangle_java_and_free(char *mangled) {
if (!mangled) {
return NULL;
}
if (startswith(mangled, "unknown_")) {
return mangled;
}
char *demangled = rz_demangler_java(mangled);
free(mangled);
return demangled;
}
static void set_lib_and_class_name(char *mangled, char **out_class, char **out_lib) {
if (!mangled) {
return;
}
bool is_java_lang = startswith(mangled, "Ljava/lang");
char *object = demangle_java_and_free(mangled);
if (!object) {
return;
}
*out_class = object;
if (is_java_lang && !startswith(object, "java.lang")) {
*out_lib = rz_str_newf("java.lang.%s", object);
} else {
*out_lib = strdup(object);
}
}
/**
* \brief Returns a RzList<RzBinSymbol*> containing the class methods
*/
@ -1096,8 +1136,8 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_methods_as_symbols(R
desc = strdup("(?)V");
}
symbol->classname = rz_bin_java_class_name(bin);
symbol->dname = rz_str_newf("%s%s", method_name, desc);
set_lib_and_class_name(rz_bin_java_class_name(bin), &symbol->classname, &symbol->libname);
symbol->dname = demangle_java_and_free(rz_str_newf("%s%s", method_name, desc));
symbol->name = add_class_name_to_name(method_name, symbol->classname);
symbol->size = size;
symbol->bind = java_method_is_global(method) ? RZ_BIN_BIND_GLOBAL_STR : RZ_BIN_BIND_LOCAL_STR;
@ -1105,7 +1145,6 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_methods_as_symbols(R
symbol->ordinal = rz_list_length(list);
symbol->visibility = method->access_flags;
symbol->visibility_str = java_method_access_flags_readable(method);
symbol->libname = rz_demangler_java(symbol->classname);
symbol->method_flags = java_access_flags_to_bin_flags(method->access_flags);
free(desc);
free(method_name);
@ -1255,8 +1294,10 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_fields_as_symbols(RZ
free(field_name);
continue;
}
symbol->classname = rz_bin_java_class_name(bin);
set_lib_and_class_name(rz_bin_java_class_name(bin), &symbol->classname, &symbol->libname);
symbol->name = add_class_name_to_name(field_name, symbol->classname);
symbol->dname = rz_demangler_java(symbol->name);
symbol->size = 0;
symbol->bind = java_field_is_global(field) ? RZ_BIN_BIND_GLOBAL_STR : RZ_BIN_BIND_LOCAL_STR;
symbol->type = RZ_BIN_TYPE_OBJECT_STR;
@ -1272,12 +1313,12 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_fields_as_symbols(RZ
}
/**
* \brief Returns a RzList<RzBinField*> containing the class fields
* \brief Returns a RzList<RzBinClassField*> containing the class fields
*/
RZ_API RZ_OWN RzList /*<RzBinField *>*/ *rz_bin_java_class_fields_as_binfields(RZ_NONNULL RzBinJavaClass *bin) {
RZ_API RZ_OWN RzList /*<RzBinClassField *>*/ *rz_bin_java_class_fields_as_binfields(RZ_NONNULL RzBinJavaClass *bin) {
rz_return_val_if_fail(bin, NULL);
RzList *list = rz_list_newf((RzListFree)rz_bin_field_free);
RzList *list = rz_list_newf((RzListFree)rz_bin_class_field_free);
if (!list) {
return NULL;
}
@ -1299,11 +1340,14 @@ RZ_API RZ_OWN RzList /*<RzBinField *>*/ *rz_bin_java_class_fields_as_binfields(R
if (!name) {
continue;
}
RzBinField *bf = rz_bin_field_new(field->offset, field->offset, 0, name, NULL, NULL, false);
char *ftype = demangle_java_and_free(java_class_constant_pool_stringify_at(bin, field->descriptor_index));
RzBinClassField *bf = rz_bin_class_field_new(field->offset, field->offset, name, NULL, NULL, ftype);
free(ftype);
if (bf) {
set_lib_and_class_name(rz_bin_java_class_name(bin), &bf->classname, &bf->libname);
bf->visibility = field->access_flags;
bf->flags = java_access_flags_to_bin_flags(field->access_flags);
bf->type = java_class_constant_pool_stringify_at(bin, field->descriptor_index);
rz_list_append(list, bf);
}
free(name);
@ -1440,7 +1484,6 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_const_pool_as_symbol
return NULL;
}
char *method_name, *classname;
bool is_main;
ut16 class_index, name_and_type_index, name_index, descriptor_index, class_name_index;
if (bin->constant_pool) {
for (ut32 i = 0; i < bin->constant_pool_count; ++i) {
@ -1479,22 +1522,26 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_const_pool_as_symbol
if (!method_name) {
method_name = strdup("unknown_method");
}
is_main = !strcmp(method_name, "main");
classname = java_class_constant_pool_stringify_at(bin, class_name_index);
if (!classname) {
classname = strdup("unknown_class");
}
set_lib_and_class_name(rz_str_newf("L%s;", classname), &symbol->classname, &symbol->libname);
symbol->name = add_class_name_to_name(method_name, symbol->classname);
if (desc[0] == '(') {
symbol->dname = rz_str_newf("%s%s", method_name, desc);
} else {
symbol->dname = strdup(method_name);
}
symbol->classname = rz_str_newf("L%s;", classname);
symbol->libname = classname;
rz_str_replace_ch(symbol->libname, '/', '.', 1);
symbol->dname = demangle_java_and_free(symbol->dname);
symbol->bind = RZ_BIN_BIND_IMPORT_STR;
symbol->type = is_main ? RZ_BIN_TYPE_FUNC_STR : import_type(cpool);
symbol->type = !strcmp(method_name, "main") ? RZ_BIN_TYPE_FUNC_STR : import_type(cpool);
symbol->ordinal = i;
symbol->is_imported = true;
free(desc);
free(classname);
free(method_name);
rz_list_append(list, symbol);
}
@ -1546,26 +1593,19 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_import
RzBinImport *import = RZ_NEW0(RzBinImport);
if (!import) {
rz_warn_if_reached();
free(object);
continue;
}
char *class_name = (char *)rz_str_rchr(object, NULL, '/');
if (class_name) {
class_name[0] = 0;
class_name++;
}
rz_str_replace_ch(object, '/', '.', 1);
import->classname = strdup(class_name ? class_name : object);
import->libname = class_name ? strdup(object) : NULL;
set_lib_and_class_name(rz_str_newf("L%s;", object), &import->classname, &import->libname);
import->name = java_class_constant_pool_stringify_at(bin, name_index);
is_main = import->name && !strcmp(import->name, "main");
import->bind = is_main ? RZ_BIN_BIND_GLOBAL_STR : NULL;
import->type = is_main ? RZ_BIN_TYPE_FUNC_STR : import_type(cpool);
import->descriptor = java_class_constant_pool_stringify_at(bin, descriptor_index);
import->ordinal = i;
free(object);
rz_list_append(imports, import);
free(object);
}
}
@ -1575,24 +1615,31 @@ RZ_API RZ_OWN RzList /*<RzBinImport *>*/ *rz_bin_java_class_const_pool_as_import
continue;
}
RzBinImport *import = RZ_NEW0(RzBinImport);
if (!import) {
rz_warn_if_reached();
continue;
}
const ConstPool *cpool = java_class_constant_pool_at(bin, bin->interfaces[i]->index);
if (!cpool || java_constant_pool_resolve(cpool, &class_index, NULL) != 1) {
RZ_LOG_ERROR("java bin: can't resolve interface with constant pool index %u\n", i);
rz_bin_import_free(import);
continue;
}
import->classname = java_class_constant_pool_stringify_at(bin, class_index);
char *object = java_class_constant_pool_stringify_at(bin, class_index);
if (!object) {
continue;
}
RzBinImport *import = RZ_NEW0(RzBinImport);
if (!import) {
rz_warn_if_reached();
free(object);
continue;
}
set_lib_and_class_name(rz_str_newf("L%s;", object), &import->classname, &import->libname);
import->name = strdup("*");
import->bind = RZ_BIN_BIND_WEAK_STR;
import->type = RZ_BIN_TYPE_IFACE_STR;
import->ordinal = i;
rz_list_append(imports, import);
free(object);
}
}
@ -1953,3 +2000,37 @@ RZ_API void rz_bin_java_class_interfaces_as_json(RZ_NONNULL RzBinJavaClass *bin,
}
pj_end(j);
}
/**
* \brief Returns a RzList<RzBinClass*> containing only the class of the bin
*/
RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_java_class_as_classes(RZ_NONNULL RzBinJavaClass *bin) {
rz_return_val_if_fail(bin, NULL);
RzBinClass *bclass = NULL;
RzList *list = rz_list_newf((RzListFree)rz_bin_class_free);
if (!list) {
return NULL;
}
bclass = RZ_NEW0(RzBinClass);
if (!bclass) {
rz_list_free(list);
return NULL;
}
rz_list_append(list, bclass);
bclass->name = demangle_java_and_free(rz_bin_java_class_name(bin));
bclass->super = demangle_java_and_free(rz_bin_java_class_super(bin));
bclass->visibility = rz_bin_java_class_access_flags(bin);
bclass->visibility_str = rz_bin_java_class_access_flags_readable(bin, ACCESS_FLAG_MASK_ALL_NO_SUPER);
bclass->methods = rz_bin_java_class_methods_as_symbols(bin);
bclass->fields = rz_bin_java_class_fields_as_binfields(bin);
if (!bclass->methods || !bclass->fields) {
rz_list_free(list);
return NULL;
}
return list;
}

View file

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-FileCopyrightText: 2021-2023 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021-2023 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_BIN_JAVA_CLASS_H
@ -86,7 +87,7 @@ RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_methods_as_symbols(R
RZ_API void rz_bin_java_class_methods_as_text(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL RzStrBuf *sb);
RZ_API void rz_bin_java_class_methods_as_json(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL PJ *j);
RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_fields_as_symbols(RZ_NONNULL RzBinJavaClass *bin);
RZ_API RZ_OWN RzList /*<RzBinField *>*/ *rz_bin_java_class_fields_as_binfields(RZ_NONNULL RzBinJavaClass *bin);
RZ_API RZ_OWN RzList /*<RzBinClassField *>*/ *rz_bin_java_class_fields_as_binfields(RZ_NONNULL RzBinJavaClass *bin);
RZ_API void rz_bin_java_class_fields_as_text(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL RzStrBuf *sb);
RZ_API void rz_bin_java_class_fields_as_json(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL PJ *j);
RZ_API RZ_OWN RzList /*<RzBinSymbol *>*/ *rz_bin_java_class_const_pool_as_symbols(RZ_NONNULL RzBinJavaClass *bin);
@ -97,5 +98,6 @@ RZ_API RZ_OWN RzList /*<RzBinSection *>*/ *rz_bin_java_class_as_sections(RZ_NONN
RZ_API RZ_OWN RzList /*<char *>*/ *rz_bin_java_class_as_libraries(RZ_NONNULL RzBinJavaClass *bin);
RZ_API void rz_bin_java_class_interfaces_as_text(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL RzStrBuf *sb);
RZ_API void rz_bin_java_class_interfaces_as_json(RZ_NONNULL RzBinJavaClass *bin, RZ_NONNULL PJ *j);
RZ_API RZ_OWN RzList /*<RzBinClass *>*/ *rz_bin_java_class_as_classes(RZ_NONNULL RzBinJavaClass *bin);
#endif /* RZ_BIN_JAVA_CLASS_H */

View file

@ -190,9 +190,9 @@ static void copy_sym_name_with_namespace(char *class_name, char *read_name, RzBi
}
static int sort_by_offset(const void *_a, const void *_b) {
RzBinField *a = (RzBinField *)_a;
RzBinField *b = (RzBinField *)_b;
return a->offset - b->offset;
RzBinClassField *a = (RzBinClassField *)_a;
RzBinClassField *b = (RzBinClassField *)_b;
return a->paddr - b->paddr;
}
static bool read_sivarlist(struct MACH0_(SIVarList) * il, RzBuffer *buf, ut64 base, bool bigendian) {
@ -219,7 +219,7 @@ static void get_ivar_list_t(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzBinClass
int len;
bool bigendian;
mach0_ut ivar_offset;
RzBinField *field = NULL;
RzBinClassField *field = NULL;
ut8 offs[sizeof(mach0_ut)] = { 0 };
if (!bf || !bf->o || !bf->o->bin_obj || !bf->o->info) {
@ -250,7 +250,7 @@ static void get_ivar_list_t(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzBinClass
if (!r) {
return;
}
field = RZ_NEW0(RzBinField);
field = rz_bin_class_field_new(UT64_MAX, UT64_MAX, NULL, klass->name, NULL, NULL);
memset(&i, '\0', sizeof(struct MACH0_(SIVar)));
if (r + left < r || r + sizeof(struct MACH0_(SIVar)) < r) {
goto error;
@ -280,7 +280,7 @@ static void get_ivar_list_t(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzBinClass
goto error;
}
ivar_offset = rz_read_ble(offs, bigendian, 8 * sizeof(mach0_ut));
field->offset = ivar_offset;
field->paddr = ivar_offset;
}
r = va2pa(i.name, NULL, &left, bf);
if (r) {
@ -307,7 +307,7 @@ static void get_ivar_list_t(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzBinClass
name[name_len] = 0;
}
// XXX the field name shouldnt contain the class name
field->name = rz_str_newf("%s::%s%s", klass->name, "(ivar)", name);
field->name = rz_str_newf("%s::(ivar)%s", klass->name, name);
RZ_FREE(name);
}
@ -349,16 +349,11 @@ static void get_ivar_list_t(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzBinClass
if (!rz_list_empty(klass->fields)) {
rz_list_sort(klass->fields, sort_by_offset);
}
RzBinField *isa_field = RZ_NEW0(RzBinField);
isa_field->name = strdup("isa");
isa_field->size = sizeof(mach0_ut);
isa_field->type = strdup("struct objc_class *");
isa_field->vaddr = 0;
isa_field->offset = 0;
rz_list_prepend(klass->fields, isa_field);
field = rz_bin_class_field_new(UT64_MAX, UT64_MAX, "isa", klass->name, NULL, "struct objc_class *");
rz_list_prepend(klass->fields, field);
return;
error:
rz_bin_field_free(field);
rz_bin_class_field_free(field);
}
///////////////////////////////////////////////////////////////////////////////
@ -370,7 +365,7 @@ static void get_objc_property_list(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzB
char *name = NULL;
int len;
bool bigendian;
RzBinField *property = NULL;
RzBinClassField *property = NULL;
ut8 sopl[sizeof(struct MACH0_(SObjcPropertyList))] = { 0 };
ut8 sop[sizeof(struct MACH0_(SObjcProperty))] = { 0 };
@ -415,7 +410,7 @@ static void get_objc_property_list(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzB
return;
}
if (!(property = RZ_NEW0(RzBinField))) {
if (!(property = rz_bin_class_field_new(UT64_MAX, UT64_MAX, NULL, klass->name, NULL, NULL))) {
return;
}
@ -465,8 +460,7 @@ static void get_objc_property_list(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzB
goto error;
}
}
property->name = rz_str_newf("%s::%s%s", klass->name,
"(property)", name);
property->name = rz_str_newf("%s::(property)%s", klass->name, name);
RZ_FREE(name);
}
#if 0
@ -836,7 +830,7 @@ static void get_protocol_list_t(mach0_ut p, RzBinFile *bf, RzBuffer *buf, RzBinC
}
name[name_len] = 0;
}
class_name = rz_str_newf("%s::%s%s", klass->name, "(protocol)", name);
class_name = rz_str_newf("%s::(protocol)%s", klass->name, name);
RZ_FREE(name);
}
@ -1304,12 +1298,12 @@ RZ_API RzList /*<RzBinClass *>*/ *MACH0_(parse_classes)(RzBinFile *bf, objc_cach
// RZ_LOG_ERROR("RzBinClass allocation error\n");
goto get_classes_error;
}
if (!(klass->methods = rz_list_new())) {
if (!(klass->methods = rz_list_newf((RzListFree)rz_bin_symbol_free))) {
// retain just for debug
// RZ_LOG_ERROR("RzList<RzBinField> allocation error\n");
// RZ_LOG_ERROR("RzList<RzBinClassField> allocation error\n");
goto get_classes_error;
}
if (!(klass->fields = rz_list_new())) {
if (!(klass->fields = rz_list_newf((RzListFree)rz_bin_class_field_free))) {
// retain just for debug
// RZ_LOG_ERROR("RzList<RzBinSymbol> allocation error\n");
goto get_classes_error;
@ -1396,11 +1390,11 @@ static RzList /*<RzBinClass *>*/ *MACH0_(parse_categories)(RzBinFile *bf, RzBuff
if (!(klass = RZ_NEW0(RzBinClass))) {
goto error;
}
if (!(klass->methods = rz_list_new())) {
if (!(klass->methods = rz_list_newf((RzListFree)rz_bin_symbol_free))) {
RZ_FREE(klass);
goto error;
}
if (!(klass->fields = rz_list_new())) {
if (!(klass->fields = rz_list_newf((RzListFree)rz_bin_class_field_free))) {
RZ_FREE(klass);
goto error;
}

View file

@ -27,7 +27,6 @@ RZ_IPI RzBinObject *rz_bin_object_new(RzBinFile *binfile, RzBinPlugin *plugin, R
RZ_IPI RzBinObject *rz_bin_object_get_cur(RzBin *bin);
RZ_IPI RzBinObject *rz_bin_object_find_by_arch_bits(RzBinFile *binfile, const char *arch, int bits, const char *name);
RZ_IPI void rz_bin_class_free(RzBinClass *c);
RZ_IPI RzBinSymbol *rz_bin_class_add_method(RzBinFile *binfile, const char *classname, const char *name, int nargs);
RZ_IPI void rz_bin_class_add_field(RzBinFile *binfile, const char *classname, const char *name);

View file

@ -104,15 +104,6 @@ static RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
return rz_bin_dex_symbols(dex);
}
static RzList /*<RzBinField *>*/ *fields(RzBinFile *bf) {
RzBinDex *dex = rz_bin_file_get_dex(bf);
if (!dex) {
return NULL;
}
return rz_bin_dex_fields(dex);
}
static RzList /*<char *>*/ *libraries(RzBinFile *bf) {
RzBinDex *dex = rz_bin_file_get_dex(bf);
if (!dex) {
@ -257,7 +248,6 @@ RzBinPlugin rz_bin_plugin_dex = {
.get_name = &get_name,
.get_offset = &get_offset,
.info = &info,
.fields = fields,
.libs = libraries,
.classes = classes,
.demangle_type = demangle_type,

View file

@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-FileCopyrightText: 2021-2023 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021-2023 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_types.h>
@ -66,51 +67,13 @@ static Sdb *get_sdb(RzBinFile *bf) {
return bf->sdb;
}
static void free_rz_bin_class(void /*RzBinClass*/ *k) {
RzBinClass *bclass = (RzBinClass *)k;
if (bclass) {
rz_list_free(bclass->methods);
rz_list_free(bclass->fields);
free(bclass->name);
free(bclass->super);
free(bclass->visibility_str);
free(bclass);
}
}
static RzList /*<RzBinClass *>*/ *classes(RzBinFile *bf) {
RzBinClass *bclass = NULL;
RzList *classes = NULL;
RzBinJavaClass *jclass = rz_bin_file_get_java_class(bf);
if (!jclass) {
return NULL;
}
classes = rz_list_newf(free_rz_bin_class);
if (!classes) {
return NULL;
}
bclass = RZ_NEW0(RzBinClass);
if (!bclass) {
rz_list_free(classes);
return NULL;
}
rz_list_append(classes, bclass);
bclass->name = rz_bin_java_class_name(jclass);
bclass->super = rz_bin_java_class_super(jclass);
bclass->visibility = rz_bin_java_class_access_flags(jclass);
bclass->visibility_str = rz_bin_java_class_access_flags_readable(jclass, ACCESS_FLAG_MASK_ALL_NO_SUPER);
bclass->methods = rz_bin_java_class_methods_as_symbols(jclass);
bclass->fields = rz_bin_java_class_fields_as_binfields(jclass);
if (!bclass->methods || !bclass->fields) {
rz_list_free(classes);
return NULL;
}
return classes;
return rz_bin_java_class_as_classes(jclass);
}
static RzList /*<RzBinImport *>*/ *imports(RzBinFile *bf) {
@ -153,15 +116,6 @@ static RzList /*<RzBinSymbol *>*/ *symbols(RzBinFile *bf) {
return list;
}
static RzList /*<RzBinField *>*/ *fields(RzBinFile *bf) {
RzBinJavaClass *jclass = rz_bin_file_get_java_class(bf);
if (!jclass) {
return NULL;
}
return rz_bin_java_class_fields_as_binfields(jclass);
}
static RzList /*<char *>*/ *libs(RzBinFile *bf) {
RzBinJavaClass *jclass = rz_bin_file_get_java_class(bf);
if (!jclass) {
@ -241,12 +195,11 @@ RzBinPlugin rz_bin_plugin_java = {
.entries = &entrypoints,
.maps = &rz_bin_maps_of_file_sections,
.sections = sections,
.symbols = symbols,
.symbols = &symbols,
.imports = &imports,
.strings = &strings,
.enrich_asm = &enrich_asm,
.info = &info,
.fields = fields,
.libs = libs,
.classes = classes,
.demangle_type = demangle_type,

View file

@ -3487,12 +3487,12 @@ static char *objc_name_toc(const char *objc_name) {
static void classdump_c(RzCore *r, RzBinClass *c) {
rz_cons_printf("typedef struct class_%s {\n", c->name);
RzListIter *iter2;
RzBinField *f;
RzBinClassField *f;
rz_list_foreach (c->fields, iter2, f) {
if (f->type && f->name) {
char *n = objc_name_toc(f->name);
char *t = objc_type_toc(f->type);
rz_cons_printf(" %s %s; // %d\n", t, n, f->offset);
rz_cons_printf(" %s %s;\n", t, n);
free(t);
free(n);
}
@ -3507,7 +3507,7 @@ static void classdump_objc(RzCore *r, RzBinClass *c) {
rz_cons_printf("@interface %s\n{\n", c->name);
}
RzListIter *iter2, *iter3;
RzBinField *f;
RzBinClassField *f;
RzBinSymbol *sym;
rz_list_foreach (c->fields, iter2, f) {
if (f->name && rz_regex_match("ivar", "e", f->name)) {
@ -3541,7 +3541,7 @@ static inline bool is_known_namespace(const char *string) {
#define CXX_BIN_VISIBILITY_FLAGS (RZ_BIN_METH_PUBLIC | RZ_BIN_METH_PRIVATE | RZ_BIN_METH_PROTECTED)
static void classdump_cpp(RzCore *r, RzBinClass *c) {
RzListIter *iter;
RzBinField *f;
RzBinClassField *f;
RzBinSymbol *sym;
ut64 used = UT64_MAX;
bool has_methods = false;
@ -3622,26 +3622,14 @@ static void classdump_cpp(RzCore *r, RzBinClass *c) {
if (f->visibility & RZ_BIN_METH_CONST) {
rz_cons_print("const ");
}
rz_cons_printf("%s %s;\n", f->type, f->name);
const char *ftype = f->type ? f->type : "unknown_t";
rz_cons_printf("%s %s;\n", ftype, f->name);
}
}
rz_cons_printf("}\n");
}
#undef CXX_BIN_VISIBILITY_FLAGS
static inline char *demangle_class(const char *classname) {
if (!classname || classname[0] != 'L') {
return strdup(classname ? classname : "?");
}
char *demangled = strdup(classname + 1);
if (!demangled) {
return strdup(classname);
}
rz_str_replace_ch(demangled, '/', '.', 1);
demangled[strlen(demangled) - 1] = 0;
return demangled;
}
static inline char *demangle_type(const char *any) {
if (!any) {
return strdup("unknown");
@ -3666,20 +3654,20 @@ static inline const char *resolve_java_visibility(const char *v) {
}
static void classdump_java(RzCore *r, RzBinClass *c) {
RzBinField *f;
RzBinClassField *f;
RzListIter *iter2, *iter3;
RzBinSymbol *sym;
bool simplify = false;
char *package = NULL, *classname = NULL;
char *tmp = (char *)rz_str_rchr(c->name, NULL, '/');
char *tmp = (char *)rz_str_rchr(c->name, NULL, '.');
if (tmp) {
package = demangle_class(c->name);
package = strdup(c->name);
classname = strdup(tmp + 1);
classname[strlen(classname) - 1] = 0;
simplify = true;
} else {
package = strdup("defpackage");
classname = demangle_class(c->name);
classname = strdup(c->name);
}
rz_cons_printf("package %s;\n\n", package);
@ -3725,7 +3713,7 @@ static void classdump_java(RzCore *r, RzBinClass *c) {
static void bin_class_print_rizin(RzCore *r, RzBinClass *c, ut64 at_min) {
RzListIter *iter2;
RzBinFile *bf = rz_bin_cur(r->bin);
RzBinField *f;
RzBinClassField *f;
RzBinSymbol *sym;
// class
@ -3820,7 +3808,7 @@ RZ_API bool rz_core_bin_class_fields_print(RZ_NONNULL RzCore *core, RZ_NONNULL R
RzListIter *iter, *iter2;
RzBinClass *c;
RzBinField *f;
RzBinClassField *f;
int m = 0;
const RzList *cs = rz_bin_object_get_classes(bf->o);
@ -3946,7 +3934,7 @@ RZ_API bool rz_core_bin_classes_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinF
RzListIter *iter, *iter2, *iter3;
RzBinSymbol *sym;
RzBinClass *c;
RzBinField *f;
RzBinClassField *f;
const RzList *cs = rz_bin_object_get_classes(bf->o);
if (!cs) {
@ -4711,7 +4699,7 @@ RZ_API RZ_OWN char *rz_core_bin_method_build_flag_name(RZ_NONNULL RzBinClass *cl
* \brief Returns the flag name of a class field
*
**/
RZ_API RZ_OWN char *rz_core_bin_field_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinField *field) {
RZ_API RZ_OWN char *rz_core_bin_field_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinClassField *field) {
rz_return_val_if_fail(cls && field, NULL);
if (!cls->name || !field->name) {
return NULL;

View file

@ -21,7 +21,7 @@ static void *show_class(RzCore *core, int mode, int *idx, RzBinClass *_c, const
RzListIter *iter;
RzBinClass *c, *cur = NULL;
RzBinSymbol *m, *mur = NULL;
RzBinField *f, *fur = NULL;
RzBinClassField *f, *fur = NULL;
int i = 0;
int skip = *idx - 10;
bool found = false;
@ -195,7 +195,7 @@ RZ_IPI int rz_core_visual_classes(RzCore *core) {
int mode = 'c';
RzBinClass *cur = NULL;
RzBinSymbol *mur = NULL;
RzBinField *fur = NULL;
RzBinClassField *fur = NULL;
void *ptr;
int oldcur = 0;
char *grep = NULL;
@ -214,7 +214,7 @@ RZ_IPI int rz_core_visual_classes(RzCore *core) {
ptr = show_class(core, mode, &index, cur, grep, list);
switch (mode) {
case 'f':
fur = (RzBinField *)ptr;
fur = (RzBinClassField *)ptr;
break;
case 'm':
mur = (RzBinSymbol *)ptr;

View file

@ -59,7 +59,7 @@ RZ_IPI bool rz_core_visual_hud(RzCore *core) {
RZ_IPI bool rz_core_visual_hudclasses(RzCore *core) {
RzListIter *iter, *iter2;
RzBinClass *c;
RzBinField *f;
RzBinClassField *f;
RzBinSymbol *m;
ut64 addr;
char *res;

View file

@ -653,7 +653,7 @@ typedef struct rz_bin_class_t {
int index;
ut64 addr;
RzList /*<RzBinSymbol *>*/ *methods;
RzList /*<RzBinField *>*/ *fields;
RzList /*<RzBinClassField *>*/ *fields;
// RzList *interfaces; // <char *>
int visibility;
} RzBinClass;
@ -765,18 +765,25 @@ typedef struct rz_bin_field_t {
ut64 paddr;
int size;
int offset;
ut32 visibility;
char *name;
char *type;
char *visibility_str;
char *comment;
char *format;
bool format_named; // whether format is the name of a format or a raw pf format string
ut64 flags;
} RzBinField;
RZ_API RzBinField *rz_bin_field_new(ut64 paddr, ut64 vaddr, int size, const char *name, const char *comment, const char *format, bool format_named);
RZ_API void rz_bin_field_free(RzBinField *field);
typedef struct rz_bin_class_field_t {
ut64 vaddr;
ut64 paddr;
char *name;
char *classname;
char *libname;
char *type;
ut32 visibility;
char *visibility_str;
ut64 flags;
} RzBinClassField;
typedef struct rz_bin_mem_t {
char *name;
@ -815,6 +822,12 @@ typedef struct rz_bin_bind_t {
ut32 visibility;
} RzBinBind;
RZ_API RzBinField *rz_bin_field_new(ut64 paddr, ut64 vaddr, int size, const char *name, const char *comment, const char *format, bool format_named);
RZ_API void rz_bin_field_free(RzBinField *field);
RZ_API RzBinClassField *rz_bin_class_field_new(ut64 vaddr, ut64 paddr, const char *name, const char *classname, const char *libname, const char *type);
RZ_API void rz_bin_class_field_free(RzBinClassField *field);
RZ_API void rz_bin_class_free(RzBinClass *k);
RZ_API void rz_bin_virtual_file_free(RzBinVirtualFile *vfile);
RZ_API void rz_bin_map_free(RzBinMap *map);
RZ_API bool rz_bin_map_is_data(RZ_NONNULL const RzBinMap *map);

View file

@ -976,7 +976,7 @@ RZ_API int rz_core_bin_update_arch_bits(RzCore *r);
RZ_API RZ_OWN char *rz_core_bin_class_build_flag_name(RZ_NONNULL RzBinClass *cls);
RZ_API RZ_OWN char *rz_core_bin_super_build_flag_name(RZ_NONNULL RzBinClass *cls);
RZ_API RZ_OWN char *rz_core_bin_method_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinSymbol *meth);
RZ_API RZ_OWN char *rz_core_bin_field_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinField *field);
RZ_API RZ_OWN char *rz_core_bin_field_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinClassField *field);
RZ_API char *rz_core_bin_method_flags_str(ut64 flags, int mode);
RZ_API RZ_OWN char *rz_core_bin_pdb_get_filename(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_bin_pdb_load(RZ_NONNULL RzCore *core, RZ_NONNULL const char *filename);

View file

@ -760,10 +760,10 @@ static RzDiff *rz_diff_imports_new(DiffFile *dfile_a, DiffFile *dfile_b) {
/**************************************** symbols ***************************************/
static ut32 symbol_hash_addr(const RzBinSymbol *elem) {
ut32 hash = rz_diff_hash_data((const ut8 *)elem->name, strlen(elem->name));
hash ^= rz_diff_hash_data((const ut8 *)elem->dname, strlen(elem->dname));
hash ^= rz_diff_hash_data((const ut8 *)elem->libname, strlen(elem->libname));
hash ^= rz_diff_hash_data((const ut8 *)elem->classname, strlen(elem->classname));
ut32 hash = rz_diff_hash_data((const ut8 *)elem->name, elem->name ? strlen(elem->name) : 0);
hash ^= rz_diff_hash_data((const ut8 *)elem->dname, elem->dname ? strlen(elem->dname) : 0);
hash ^= rz_diff_hash_data((const ut8 *)elem->libname, elem->libname ? strlen(elem->libname) : 0);
hash ^= rz_diff_hash_data((const ut8 *)elem->classname, elem->classname ? strlen(elem->classname) : 0);
hash ^= (ut32)(elem->vaddr >> 32);
hash ^= (ut32)elem->vaddr;
hash ^= (ut32)(elem->paddr >> 32);

View file

@ -3,17 +3,17 @@ FILE=bins/dex/HelloWorld.dex
CMDS=aa; afl
EXPECT=<<EOF
0x10000025c 1 34 entry0
0x8000000000 1 2 sym.Ljava_io_PrintStream_.println_Ljava_lang_String__V
0x100000238 1 20 method.public.constructor.LHello_._init___V
0x8000000006 1 2 sym.Ljava_lang_Object_._init___V
0x100000290 1 84 method.public.LHello_.foo_I_V
0x8000000008 1 2 sym.Ljava_lang_StringBuilder_._init___V
0x800000000a 1 2 sym.Ljava_lang_StringBuilder_.append_Ljava_lang_String__Ljava_lang_StringBuilder
0x8000000002 1 2 sym.Ljava_lang_Integer_._init__I_V
0x8000000004 1 2 sym.Ljava_lang_Integer_.toString__Ljava_lang_String
0x800000000c 1 2 sym.Ljava_lang_StringBuilder_.toString__Ljava_lang_String
0x1000002f4 1 20 method.public.constructor.LWorld_._init___V
0x100000318 1 68 method.public.LWorld_.foo_I_V
0x8000000000 1 2 sym.java.io.PrintStream.void_println_String
0x100000238 1 20 method.public.constructor.Hello.void__init
0x8000000006 1 2 sym.Object.void__init
0x100000290 1 84 method.public.Hello.void_foo_int
0x8000000008 1 2 sym.StringBuilder.void__init
0x800000000a 1 2 sym.StringBuilder.StringBuilder_append_String
0x8000000002 1 2 sym.Integer.void__init__int
0x8000000004 1 2 sym.Integer.String_toString
0x800000000c 1 2 sym.StringBuilder.String_toString
0x1000002f4 1 20 method.public.constructor.World.void__init
0x100000318 1 68 method.public.World.void_foo_int
EOF
RUN
@ -27,7 +27,7 @@ RUN
NAME=Dalvik HelloWorld func xref
FILE=bins/dex/HelloWorld.dex
CMDS=aa; axt @ sym.LHello_._init___V
CMDS=aa; axt @ sym.Hello.void__init
EXPECT=<<EOF
entry0 0x10000026e [CALL] invoke-direct {v0}, LHello;-><init>()V
EOF
@ -35,29 +35,29 @@ RUN
NAME=Dalvik HelloWorld func xref to super method
FILE=bins/dex/org.radare.radare2installer.dex
CMDS=aaa; axt @ sym.Landroid_app_Activity_.onDestroy__V~invoke-super
CMDS=aaa; axt @ sym.android.app.Activity.void_onDestroy~invoke-super
EXPECT=<<EOF
method.public.Lorg_radare_radare2installer_ConsoleActivity_.onDestroy__V; void onDestroy() 0x100019e50 [CALL] invoke-super {v1}, Landroid/app/Activity;->onDestroy()V
method.public.Lorg_radare_radare2installer_LaunchActivity_.onDestroy__V 0x10001a256 [CALL] invoke-super {v1}, Landroid/app/Activity;->onDestroy()V
method.public.Lorg_radare_radare2installer_WebActivity_.onDestroy__V; void onDestroy() 0x10001e574 [CALL] invoke-super {v2}, Landroid/app/Activity;->onDestroy()V
method.public.org.radare.radare2installer.ConsoleActivity.void_onDestroy 0x100019e50 [CALL] invoke-super {v1}, Landroid/app/Activity;->onDestroy()V
method.public.org.radare.radare2installer.LaunchActivity.void_onDestroy 0x10001a256 [CALL] invoke-super {v1}, Landroid/app/Activity;->onDestroy()V
method.public.org.radare.radare2installer.WebActivity.void_onDestroy 0x10001e574 [CALL] invoke-super {v2}, Landroid/app/Activity;->onDestroy()V
EOF
RUN
NAME=Dalvik resolve virtual methods called via invoke-virtual
FILE=apk://bins/dex/org.radare.radare2installer.apk
CMDS=aaa ; axt @ sym.Lcom_ice_tar_TarEntry_.getUserName__Ljava_lang_String
CMDS=aaa ; axt @ sym.com.ice.tar.TarEntry.String_getUserName
EXPECT=<<EOF
entry0 0x10000c8ba [CALL] invoke-virtual {v1}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
entry0 0x10000c9e6 [CALL] invoke-virtual {v1}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
method.public.Lcom_ice_tar_TarEntry_.toString__Ljava_lang_String 0x10000f04a [CALL] invoke-virtual {v4}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
method.public.com.ice.tar.TarEntry.String_toString 0x10000f04a [CALL] invoke-virtual {v4}, Lcom/ice/tar/TarEntry;->getUserName()Ljava/lang/String;
EOF
RUN
NAME=Dalvik resolve imports called via invoke-virtual
FILE=apk://bins/dex/org.radare.radare2installer.apk
CMDS=aaa ; axt @ sym.Ljava_net_URL_.openStream__Ljava_io_InputStream
CMDS=aaa ; axt @ sym.java.net.URL.java.io.InputStream_openStream
EXPECT=<<EOF
method.public.Ljavax_activation_URLDataSource_.getInputStream__Ljava_io_InputStream 0x100021180 [CALL] invoke-virtual {v0}, Ljava/net/URL;->openStream()Ljava/io/InputStream;
method.public.javax.activation.URLDataSource.java.io.InputStream_getInputStream 0x100021180 [CALL] invoke-virtual {v0}, Ljava/net/URL;->openStream()Ljava/io/InputStream;
EOF
RUN
@ -116,83 +116,83 @@ aaa
axg @ 0x800000021c
EOF
EXPECT=<<EOF
- 0x800000021c fcn 0x800000021c sym.Landroid_telephony_TelephonyManager_.getDeviceId__Ljava_lang_String
- 0x100018936 fcn 0x1000186b0 method.public.static.Lcom_network_android_SmsReceiver_.a_Lorg_xmlpull_v1_XmlSerializer_Ljava_io_StringWriter_Landroid_content_Context__V
- 0x1000186b0 fcn 0x1000186b0 method.public.static.Lcom_network_android_SmsReceiver_.a_Lorg_xmlpull_v1_XmlSerializer_Ljava_io_StringWriter_Landroid_content_Context__V
- 0x100025f78 fcn 0x100025f70 method.private.static.Lcom_network_android_g_.a_Landroid_content_Context__B_BLjava_io_StringWriter_Ljava_lang_String_Ljava_util_Vector__V
- 0x100025f70 fcn 0x100025f70 method.private.static.Lcom_network_android_g_.a_Landroid_content_Context__B_BLjava_io_StringWriter_Ljava_lang_String_Ljava_util_Vector__V
- 0x10002666c fcn 0x10002653c method.public.static.Lcom_network_android_g_.a_Ljava_lang_String_Ljava_lang_String_Lcom_network_android_x__Ljava_lang_String___BLandroid_content_Context__B_V
- 0x10002653c fcn 0x10002653c method.public.static.Lcom_network_android_g_.a_Ljava_lang_String_Ljava_lang_String_Lcom_network_android_x__Ljava_lang_String___BLandroid_content_Context__B_V
- 0x100019cac fcn 0x100019c60 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_I_V
- 0x100019c60 fcn 0x100019c60 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_I_V
- 0x100019d1c fcn 0x100019c60 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_I_V
- 0x100019e00 fcn 0x100019c60 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_I_V
- 0x10001c7a0 fcn 0x10001c6f0 method.public.final.Lcom_network_android_a_j_.run__V
- 0x10001ac02 fcn 0x10001abb8 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context__BZZ_V
- 0x10001abb8 fcn 0x10001abb8 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context__BZZ_V
- 0x10001ab9e fcn 0x10001ab9c method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context__B_V
- 0x10001ab9c fcn 0x10001ab9c method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context__B_V
- 0x100027fe2 fcn 0x100027fb4 method.public.static.Lcom_network_android_j_.a_Landroid_content_Context_ZZS_Z
- 0x100027fb4 fcn 0x100027fb4 method.public.static.Lcom_network_android_j_.a_Landroid_content_Context_ZZS_Z
- 0x100027e8e fcn 0x100027df0 method.public.static.Lcom_network_android_j_.a_Landroid_content_Context_ZZ_Z
- 0x100027df0 fcn 0x100027df0 method.public.static.Lcom_network_android_j_.a_Landroid_content_Context_ZZ_Z
- 0x10001c948 fcn 0x10001c918 method.public.final.Lcom_network_android_a_l_.run__V
- 0x10001c918 fcn 0x10001c918 method.public.final.Lcom_network_android_a_l_.run__V
- 0x800000021c fcn 0x800000021c sym.android.telephony.TelephonyManager.String_getDeviceId
- 0x100018936 fcn 0x1000186b0 method.public.static.com.network.android.SmsReceiver.void_a_org.xmlpull.v1.XmlSerializer__java.io.StringWriter__android.content.Context
- 0x1000186b0 fcn 0x1000186b0 method.public.static.com.network.android.SmsReceiver.void_a_org.xmlpull.v1.XmlSerializer__java.io.StringWriter__android.content.Context
- 0x100025f78 fcn 0x100025f70 fcn.100025f70
- 0x100025f70 fcn 0x100025f70 fcn.100025f70
- 0x10002666c fcn 0x10002653c method.public.static.com.network.android.g.a
- 0x10002653c fcn 0x10002653c method.public.static.com.network.android.g.a
- 0x100019cac fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
- 0x100019c60 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
- 0x100019d1c fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
- 0x100019e00 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
- 0x10001c7a0 fcn 0x10001c6f0 method.public.final.com.network.android.a.j.void_run
- 0x10001ac02 fcn 0x10001abb8 method.public.static.com.network.android.a.c.void_a_android.content.Context__byte____boolean__boolean
- 0x10001abb8 fcn 0x10001abb8 method.public.static.com.network.android.a.c.void_a_android.content.Context__byte____boolean__boolean
- 0x10001ab9e fcn 0x10001ab9c method.public.static.com.network.android.a.c.void_a_android.content.Context__byte
- 0x10001ab9c fcn 0x10001ab9c method.public.static.com.network.android.a.c.void_a_android.content.Context__byte
- 0x100027fe2 fcn 0x100027fb4 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean__short
- 0x100027fb4 fcn 0x100027fb4 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean__short
- 0x100027e8e fcn 0x100027df0 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean
- 0x100027df0 fcn 0x100027df0 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean
- 0x10001c948 fcn 0x10001c918 method.public.final.com.network.android.a.l.void_run
- 0x10001c918 fcn 0x10001c918 method.public.final.com.network.android.a.l.void_run
- 0x10000ed93 ???
- 0x10001dcd4 fcn 0x10001dcb0 method.public.static.Lcom_network_android_agent_NetworkApp_.b_Landroid_content_Context__V
- 0x10001dcb0 fcn 0x10001dcb0 method.public.static.Lcom_network_android_agent_NetworkApp_.b_Landroid_content_Context__V
- 0x10001dc44 fcn 0x10001daf4 method.static.synthetic.Lcom_network_android_agent_NetworkApp_.a_Lcom_network_android_agent_NetworkApp__V
- 0x10001daf4 fcn 0x10001daf4 method.static.synthetic.Lcom_network_android_agent_NetworkApp_.a_Lcom_network_android_agent_NetworkApp__V
- 0x10001e918 fcn 0x10001e914 method.public.final.Lcom_network_android_agent_c_.run__V
- 0x10001ea30 fcn 0x10001ea2c method.public.final.Lcom_network_android_agent_e_.run__V
- 0x10001dd60 fcn 0x10001dcb0 method.public.static.Lcom_network_android_agent_NetworkApp_.b_Landroid_content_Context__V
- 0x10001ddb0 fcn 0x10001dcb0 method.public.static.Lcom_network_android_agent_NetworkApp_.b_Landroid_content_Context__V
- 0x10001ed72 fcn 0x10001eca0 method.protected.final.Lcom_network_android_android_monitor_AppServicePinger_.onHandleIntent_Landroid_content_Intent__V
- 0x1000285e2 fcn 0x1000285d4 method.public.static.Lcom_network_android_j_.c_Landroid_content_Context__Z
- 0x1000285d4 fcn 0x1000285d4 method.public.static.Lcom_network_android_j_.c_Landroid_content_Context__Z
- 0x100028322 fcn 0x1000282fc method.public.static.Lcom_network_android_j_.b_Landroid_content_Context__V
- 0x1000282fc fcn 0x1000282fc method.public.static.Lcom_network_android_j_.b_Landroid_content_Context__V
- 0x100028812 fcn 0x1000287f4 method.public.final.Lcom_network_android_l_.run__V
- 0x100028802 fcn 0x1000287f4 method.public.final.Lcom_network_android_l_.run__V
- 0x100045a44 fcn 0x100045a1c method.public.final.Lcom_network_h_k_.run__V
- 0x10002d7aa fcn 0x10002d714 method.protected.static.Lcom_network_android_monitor_observer_BatteryReceiver_.a_Landroid_content_Intent_Landroid_content_Context__V
- 0x10002d714 fcn 0x10002d714 method.protected.static.Lcom_network_android_monitor_observer_BatteryReceiver_.a_Landroid_content_Intent_Landroid_content_Context__V
- 0x10002d6f8 fcn 0x10002d6c4 method.public.static.Lcom_network_android_monitor_observer_BatteryReceiver_.a_Landroid_content_Context__Ljava_lang_String
- 0x10002d6c4 fcn 0x10002d6c4 method.public.static.Lcom_network_android_monitor_observer_BatteryReceiver_.a_Landroid_content_Context__Ljava_lang_String
- 0x1000188ec fcn 0x1000186b0 method.public.static.Lcom_network_android_SmsReceiver_.a_Lorg_xmlpull_v1_XmlSerializer_Ljava_io_StringWriter_Landroid_content_Context__V
- 0x10002fc8c fcn 0x10002fc84 method.public.final.Lcom_network_android_monitor_observer_s_.run__V
- 0x10002811a fcn 0x100028064 method.public.static.Lcom_network_android_j_.a_Landroid_telephony_TelephonyManager_Landroid_content_Context_ZLandroid_net_ConnectivityManager__Z
- 0x100028064 fcn 0x100028064 method.public.static.Lcom_network_android_j_.a_Landroid_telephony_TelephonyManager_Landroid_content_Context_ZLandroid_net_ConnectivityManager__Z
- 0x10001eb52 fcn 0x10001eac4 method.public.final.Lcom_network_android_agent_g_.run__V
- 0x100027f7a fcn 0x100027df0 method.public.static.Lcom_network_android_j_.a_Landroid_content_Context_ZZ_Z
- 0x10001c09c fcn 0x10001c074 method.private.static.Lcom_network_android_a_c_.g_Landroid_content_Context__V
- 0x10001c074 fcn 0x10001c074 method.private.static.Lcom_network_android_a_c_.g_Landroid_content_Context__V
- 0x100019eae fcn 0x100019e34 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_III_V
- 0x100019e34 fcn 0x100019e34 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_III_V
- 0x10001c440 fcn 0x10001c404 method.public.final.Lcom_network_android_a_f_.run__V
- 0x10001c48a fcn 0x10001c404 method.public.final.Lcom_network_android_a_f_.run__V
- 0x10001ea86 fcn 0x10001ea68 method.public.final.Lcom_network_android_agent_f_.run__V
- 0x100019f70 fcn 0x100019ed8 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_ILjava_lang_String__V
- 0x100019ed8 fcn 0x100019ed8 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_ILjava_lang_String__V
- 0x10001c8d0 fcn 0x10001c7f8 method.public.final.Lcom_network_android_a_k_.onReceive_Landroid_content_Context_Landroid_content_Intent__V
- 0x10001a1a2 fcn 0x100019f98 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_ILjava_lang_String_I_V
- 0x100019f98 fcn 0x100019f98 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_ILjava_lang_String_I_V
- 0x100019d90 fcn 0x100019c60 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_I_V
- 0x100019de0 fcn 0x100019c60 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_I_V
- 0x10001b088 fcn 0x10001b084 method.public.static.Lcom_network_android_a_c_.b_Landroid_content_Context_I_V
- 0x10001b084 fcn 0x10001b084 method.public.static.Lcom_network_android_a_c_.b_Landroid_content_Context_I_V
- 0x10001c2e2 fcn 0x10001c1c8 method.public.final.Lcom_network_android_a_e_.run__V
- 0x10001c39e fcn 0x10001c1c8 method.public.final.Lcom_network_android_a_e_.run__V
- 0x10001c41c fcn 0x10001c404 method.public.final.Lcom_network_android_a_f_.run__V
- 0x10001c74c fcn 0x10001c6f0 method.public.final.Lcom_network_android_a_j_.run__V
- 0x10001bf4a fcn 0x10001befc method.public.static.Lcom_network_android_a_c_.e_Landroid_content_Context__V
- 0x10001befc fcn 0x10001befc method.public.static.Lcom_network_android_a_c_.e_Landroid_content_Context__V
- 0x10001c9f4 fcn 0x10001c9f0 method.public.final.Lcom_network_android_a_m_.run__V
- 0x10001c6ba fcn 0x10001c6ac method.public.final.Lcom_network_android_a_i_.run__V
- 0x10001c962 fcn 0x10001c918 method.public.final.Lcom_network_android_a_l_.run__V
- 0x10001c248 fcn 0x10001c1c8 method.public.final.Lcom_network_android_a_e_.run__V
- 0x100028408 fcn 0x1000282fc method.public.static.Lcom_network_android_j_.b_Landroid_content_Context__V
- 0x10001a24e fcn 0x100019f98 method.public.static.Lcom_network_android_a_c_.a_Landroid_content_Context_ILjava_lang_String_I_V
- 0x10001dcd4 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
- 0x10001dcb0 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
- 0x10001dc44 fcn 0x10001daf4 method.static.synthetic.com.network.android.agent.NetworkApp.void_a_com.network.android.agent.NetworkApp
- 0x10001daf4 fcn 0x10001daf4 method.static.synthetic.com.network.android.agent.NetworkApp.void_a_com.network.android.agent.NetworkApp
- 0x10001e918 fcn 0x10001e914 method.public.final.com.network.android.agent.c.void_run
- 0x10001ea30 fcn 0x10001ea2c method.public.final.com.network.android.agent.e.void_run
- 0x10001dd60 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
- 0x10001ddb0 fcn 0x10001dcb0 method.public.static.com.network.android.agent.NetworkApp.void_b_android.content.Context
- 0x10001ed72 fcn 0x10001eca0 method.protected.final.com.network.android.android.monitor.AppServicePinger.void_onHandleIntent_android.content.Intent
- 0x1000285e2 fcn 0x1000285d4 method.public.static.com.network.android.j.boolean_c_android.content.Context
- 0x1000285d4 fcn 0x1000285d4 method.public.static.com.network.android.j.boolean_c_android.content.Context
- 0x100028322 fcn 0x1000282fc method.public.static.com.network.android.j.void_b_android.content.Context
- 0x1000282fc fcn 0x1000282fc method.public.static.com.network.android.j.void_b_android.content.Context
- 0x100028812 fcn 0x1000287f4 method.public.final.com.network.android.l.void_run
- 0x100028802 fcn 0x1000287f4 method.public.final.com.network.android.l.void_run
- 0x100045a44 fcn 0x100045a1c method.public.final.com.network.h.k.void_run
- 0x10002d7aa fcn 0x10002d714 method.protected.static.com.network.android.monitor.observer.BatteryReceiver.void_a_android.content.Intent__android.content.Context
- 0x10002d714 fcn 0x10002d714 method.protected.static.com.network.android.monitor.observer.BatteryReceiver.void_a_android.content.Intent__android.content.Context
- 0x10002d6f8 fcn 0x10002d6c4 method.public.static.com.network.android.monitor.observer.BatteryReceiver.String_a_android.content.Context
- 0x10002d6c4 fcn 0x10002d6c4 method.public.static.com.network.android.monitor.observer.BatteryReceiver.String_a_android.content.Context
- 0x1000188ec fcn 0x1000186b0 method.public.static.com.network.android.SmsReceiver.void_a_org.xmlpull.v1.XmlSerializer__java.io.StringWriter__android.content.Context
- 0x10002fc8c fcn 0x10002fc84 method.public.final.com.network.android.monitor.observer.s.void_run
- 0x10002811a fcn 0x100028064 method.public.static.com.network.android.j.boolean_a_android.telephony.TelephonyManager__android.content.Context__boolean__android.net.ConnectivityManager
- 0x100028064 fcn 0x100028064 method.public.static.com.network.android.j.boolean_a_android.telephony.TelephonyManager__android.content.Context__boolean__android.net.ConnectivityManager
- 0x10001eb52 fcn 0x10001eac4 method.public.final.com.network.android.agent.g.void_run
- 0x100027f7a fcn 0x100027df0 method.public.static.com.network.android.j.boolean_a_android.content.Context__boolean__boolean
- 0x10001c09c fcn 0x10001c074 method.private.static.com.network.android.a.c.void_g_android.content.Context
- 0x10001c074 fcn 0x10001c074 method.private.static.com.network.android.a.c.void_g_android.content.Context
- 0x100019eae fcn 0x100019e34 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__int__int
- 0x100019e34 fcn 0x100019e34 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__int__int
- 0x10001c440 fcn 0x10001c404 method.public.final.com.network.android.a.f.void_run
- 0x10001c48a fcn 0x10001c404 method.public.final.com.network.android.a.f.void_run
- 0x10001ea86 fcn 0x10001ea68 method.public.final.com.network.android.agent.f.void_run
- 0x100019f70 fcn 0x100019ed8 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String
- 0x100019ed8 fcn 0x100019ed8 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String
- 0x10001c8d0 fcn 0x10001c7f8 method.public.final.com.network.android.a.k.void_onReceive_android.content.Context__android.content.Intent
- 0x10001a1a2 fcn 0x100019f98 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String__int
- 0x100019f98 fcn 0x100019f98 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String__int
- 0x100019d90 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
- 0x100019de0 fcn 0x100019c60 method.public.static.com.network.android.a.c.void_a_android.content.Context__int
- 0x10001b088 fcn 0x10001b084 method.public.static.com.network.android.a.c.void_b_android.content.Context__int
- 0x10001b084 fcn 0x10001b084 method.public.static.com.network.android.a.c.void_b_android.content.Context__int
- 0x10001c2e2 fcn 0x10001c1c8 method.public.final.com.network.android.a.e.void_run
- 0x10001c39e fcn 0x10001c1c8 method.public.final.com.network.android.a.e.void_run
- 0x10001c41c fcn 0x10001c404 method.public.final.com.network.android.a.f.void_run
- 0x10001c74c fcn 0x10001c6f0 method.public.final.com.network.android.a.j.void_run
- 0x10001bf4a fcn 0x10001befc method.public.static.com.network.android.a.c.void_e_android.content.Context
- 0x10001befc fcn 0x10001befc method.public.static.com.network.android.a.c.void_e_android.content.Context
- 0x10001c9f4 fcn 0x10001c9f0 method.public.final.com.network.android.a.m.void_run
- 0x10001c6ba fcn 0x10001c6ac method.public.final.com.network.android.a.i.void_run
- 0x10001c962 fcn 0x10001c918 method.public.final.com.network.android.a.l.void_run
- 0x10001c248 fcn 0x10001c1c8 method.public.final.com.network.android.a.e.void_run
- 0x100028408 fcn 0x1000282fc method.public.static.com.network.android.j.void_b_android.content.Context
- 0x10001a24e fcn 0x100019f98 method.public.static.com.network.android.a.c.void_a_android.content.Context__int__String__int
EOF
RUN

File diff suppressed because one or more lines are too long

View file

@ -411,8 +411,8 @@ RELROCS false
NX false
;-- entry1:
;-- section.class.methods.TestMultipleVariable.attr.0.code:
;-- sym.LTestVariableSwitchUp_.TestMultipleVariable__V:
/ method.static.LTestVariableSwitchUp_.TestMultipleVariable__V ();
;-- sym.TestVariableSwitchUp.void_TestMultipleVariable:
/ method.static.TestVariableSwitchUp.void_TestMultipleVariable ();
| 0x000002fd 1064 bipush 100
| 0x000002ff b8000f invokestatic Ljava/lang/Integer;.valueOf(I)Ljava/lang/Integer;
| 0x00000302 4b astore_0
@ -5320,21 +5320,21 @@ NAME=ic (file Java)
FILE=bins/java/Hello.class
CMDS=<<EOF
ic
icf 'LHello;'
icm 'LHello;'
icf 'Hello'
icm 'Hello'
EOF
EXPECT=<<EOF
address min max name super
----------------------------------------------------------
0x00000000 0x0000022b 0x000002d3 LHello; java/lang/Object
address index class flags name type
-------------------------------------------------------
0x0000020b 0 LHello; P who Ljava/lang/String;
address index class flags name
-----------------------------------------------------------
0x0000022b 0 LHello; p <init>(Ljava/lang/String;)V
0x00000263 1 LHello; p say()V
0x000002aa 2 LHello; sp main([Ljava/lang/String;)V
address min max name super
----------------------------------------------
0x00000000 0x0000022b 0x000002d3 Hello Object
address index class flags name type
-----------------------------------------
0x0000020b 0 Hello P who String
address index class flags name
-------------------------------------------------
0x0000022b 0 Hello p void <init>(String)
0x00000263 1 Hello p void say()
0x000002aa 2 Hello sp void main(String[])
EOF
RUN
@ -5346,9 +5346,9 @@ icfj
icmj
EOF
EXPECT=<<EOF
[{"classname":"LHello;","addr":0,"index":0,"visibility":"public","super":"java/lang/Object","methods":[{"name":"LHello;.<init>","flags":["public"],"addr":555},{"name":"LHello;.say","flags":["public"],"addr":611},{"name":"LHello;.main","flags":["static","public"],"addr":682}],"fields":[{"name":"who","type":"Ljava/lang/String;","flags":["private"],"addr":523}]}]
[{"type":"Ljava/lang/String;","name":"who","class":"LHello;","flags":["private"],"addr":523}]
[{"name":"<init>(Ljava/lang/String;)V","class":"LHello;","flags":["public"],"addr":555},{"name":"say()V","class":"LHello;","flags":["public"],"addr":611},{"name":"main([Ljava/lang/String;)V","class":"LHello;","flags":["static","public"],"addr":682}]
[{"classname":"Hello","addr":0,"index":0,"visibility":"public","super":"Object","methods":[{"name":"Hello.<init>","flags":["public"],"addr":555},{"name":"Hello.say","flags":["public"],"addr":611},{"name":"Hello.main","flags":["static","public"],"addr":682}],"fields":[{"name":"who","type":"String","flags":["private"],"addr":523}]}]
[{"type":"String","name":"who","class":"Hello","flags":["private"],"addr":523}]
[{"name":"void <init>(String)","class":"Hello","flags":["public"],"addr":555},{"name":"void say()","class":"Hello","flags":["public"],"addr":611},{"name":"void main(String[])","class":"Hello","flags":["static","public"],"addr":682}]
EOF
RUN
@ -5356,7 +5356,7 @@ NAME=icq (file Java)
FILE=bins/java/Hello.class
CMDS=icq
EXPECT=<<EOF
0x00000000 [0x0000022b - 0x000002d3] LHello; java/lang/Object
0x00000000 [0x0000022b - 0x000002d3] Hello Object
EOF
RUN
@ -5364,7 +5364,7 @@ NAME=icqq (file Java)
FILE=bins/java/Hello.class
CMDS=icQ
EXPECT=<<EOF
LHello;
Hello
EOF
RUN
@ -5380,7 +5380,7 @@ BROKEN=1
FILE=bins/java/Hello.class
CMDS=iqqc
EXPECT=<<EOF
LHello;
Hello
EOF
RUN

View file

@ -49,15 +49,15 @@ EXPECT=<<EOF
fs classes
"f class.public.Employee @ 0x100001ae0"
"f super.public.Employee.NSObject @ 0"
"f field.Employee.isa @ 0x00000000"
"f field.Employee.isa @ 0xffffffffffffffff"
"f field.Employee.Employee::_ivar__shortWord @ 0x100003328"
"f field.Employee.Employee::_ivar__username @ 0x100003330"
"f field.Employee.Employee::_ivar__firstName @ 0x100003338"
"f field.Employee.Employee::_ivar__wideWord @ 0x100003340"
"f field.Employee.Employee::_property_username @ 0x00000000"
"f field.Employee.Employee::_property_firstName @ 0x00000000"
"f field.Employee.Employee::_property_shortWord @ 0x00000000"
"f field.Employee.Employee::_property_wideWord @ 0x00000000"
"f field.Employee.Employee::_property_username @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_firstName @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_shortWord @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_wideWord @ 0xffffffffffffffff"
"f method.Employee.helloWorld @ 0x100001ae0"
"f method.Employee.sayHello @ 0x100001b10"
"f method.Employee.p0 @ 0x100001b40"
@ -170,15 +170,15 @@ EXPECT=<<EOF
fs classes
"f class.public.Employee @ 0x100007958"
"f super.public.Employee.NSObject @ 0"
"f field.Employee.isa @ 0x00000000"
"f field.Employee.isa @ 0xffffffffffffffff"
"f field.Employee.Employee::_ivar__shortWord @ 0x10000c228"
"f field.Employee.Employee::_ivar__username @ 0x10000c22c"
"f field.Employee.Employee::_ivar__firstName @ 0x10000c230"
"f field.Employee.Employee::_ivar__wideWord @ 0x10000c234"
"f field.Employee.Employee::_property_username @ 0x00000000"
"f field.Employee.Employee::_property_firstName @ 0x00000000"
"f field.Employee.Employee::_property_shortWord @ 0x00000000"
"f field.Employee.Employee::_property_wideWord @ 0x00000000"
"f field.Employee.Employee::_property_username @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_firstName @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_shortWord @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_wideWord @ 0xffffffffffffffff"
"f method.Employee.sayHello @ 0x100007984"
"f method.Employee.helloWorld @ 0x1000079b0"
"f method.Employee.p0 @ 0x1000079dc"
@ -291,15 +291,15 @@ CMDS=ic*
EXPECT=<<EOF
fs classes
"f class.public.Employee @ 0x1000079a8"
"f field.Employee.isa @ 0x00000000"
"f field.Employee.isa @ 0xffffffffffffffff"
"f field.Employee.Employee::_ivar__shortWord @ 0x10000c1d8"
"f field.Employee.Employee::_ivar__username @ 0x10000c1dc"
"f field.Employee.Employee::_ivar__firstName @ 0x10000c1e0"
"f field.Employee.Employee::_ivar__wideWord @ 0x10000c1e4"
"f field.Employee.Employee::_property_username @ 0x00000000"
"f field.Employee.Employee::_property_firstName @ 0x00000000"
"f field.Employee.Employee::_property_shortWord @ 0x00000000"
"f field.Employee.Employee::_property_wideWord @ 0x00000000"
"f field.Employee.Employee::_property_username @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_firstName @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_shortWord @ 0xffffffffffffffff"
"f field.Employee.Employee::_property_wideWord @ 0xffffffffffffffff"
"f method.Employee.sayHello @ 0x1000079d8"
"f method.Employee.helloWorld @ 0x100007a08"
"f method.Employee.p0 @ 0x100007a38"

View file

@ -78,39 +78,39 @@ NAME=DEX Hello.dex classes (ic, icf & icm command)
FILE=bins/dex/Hello.dex
CMDS=<<EOF
ic
icf 'LHello;'
icm 'LHello;'
icf 'Hello'
icm 'Hello'
EOF
EXPECT=<<EOF
address min max name super
--------------------------------------------------------------
0x00000174 0x1000001a4 0x10000021e LHello; Ljava/lang/Object;
address index class flags name type
--------------------------------------------------------
0x100000336 0 LHello; P who Ljava/lang/String;
address index class flags name
------------------------------------------------------------
0x1000001a4 0 LHello; pC <init>(Ljava/lang/String;)V
0x1000001c0 1 LHello; sp main([Ljava/lang/String;)V
0x1000001e8 2 LHello; p say()V
address min max name super
------------------------------------------------
0x00000174 0x1000001a4 0x10000021e Hello Object
address index class flags name type
------------------------------------------
0x100000336 0 Hello P who String
address index class flags name
--------------------------------------------------
0x1000001a4 0 Hello pC void <init>(String)
0x1000001c0 1 Hello sp void main(String[])
0x1000001e8 2 Hello p void say()
EOF
RUN
NAME=DEX Hello.dex single class (icf & icm LHello)
FILE=bins/dex/Hello.dex
CMDS=<<EOF
icf 'LHello;'
icm 'LHello;'
icf 'Hello'
icm 'Hello'
EOF
EXPECT=<<EOF
address index class flags name type
--------------------------------------------------------
0x100000336 0 LHello; P who Ljava/lang/String;
address index class flags name
------------------------------------------------------------
0x1000001a4 0 LHello; pC <init>(Ljava/lang/String;)V
0x1000001c0 1 LHello; sp main([Ljava/lang/String;)V
0x1000001e8 2 LHello; p say()V
address index class flags name type
------------------------------------------
0x100000336 0 Hello P who String
address index class flags name
--------------------------------------------------
0x1000001a4 0 Hello pC void <init>(String)
0x1000001c0 1 Hello sp void main(String[])
0x1000001e8 2 Hello p void say()
EOF
RUN
@ -118,7 +118,7 @@ NAME=DEX Hello.dex classes quiet (icq command)
FILE=bins/dex/Hello.dex
CMDS=icq
EXPECT=<<EOF
0x00000174 [0x1000001a4 - 0x10000021e] LHello; Ljava/lang/Object;
0x00000174 [0x1000001a4 - 0x10000021e] Hello Object
EOF
RUN
@ -138,7 +138,7 @@ NAME=DEX Hello.dex method flags (r2 commands) (ic*)
FILE=bins/dex/Hello.dex
CMDS=ic*~main
EXPECT=<<EOF
"f method.public.static.LHello_.main__Ljava_lang_String__V @ 0x1000001c0"
"f method.public.static.Hello.void_main_String @ 0x1000001c0"
EOF
RUN
@ -156,13 +156,13 @@ EXPECT=<<EOF
0x1000002f4 20 World void <init>()
0x100000318 68 World void foo(int)
0x00000000 0 java.lang.System imp.out
0x8000000000 2 java.io.PrintStream imp.println(Ljava/lang/String;)V
0x8000000002 2 java.lang.Integer imp.<init>(I)V
0x8000000004 2 java.lang.Integer imp.toString()Ljava/lang/String;
0x8000000006 2 java.lang.Object imp.<init>()V
0x8000000008 2 java.lang.StringBuilder imp.<init>()V
0x800000000a 2 java.lang.StringBuilder imp.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
0x800000000c 2 java.lang.StringBuilder imp.toString()Ljava/lang/String;
0x8000000000 2 java.io.PrintStream imp.void println(String)
0x8000000002 2 java.lang.Integer imp.void <init>(int)
0x8000000004 2 java.lang.Integer imp.String toString()
0x8000000006 2 java.lang.Object imp.void <init>()
0x8000000008 2 java.lang.StringBuilder imp.void <init>()
0x800000000a 2 java.lang.StringBuilder imp.StringBuilder append(String)
0x800000000c 2 java.lang.StringBuilder imp.String toString()
EOF
RUN
@ -171,22 +171,22 @@ FILE=bins/dex/HelloWorld.dex
CMDS=fl
EXPECT=<<EOF
0x00000000 1460 section.file
0x00000000 0 sym.Ljava_lang_System_.out
0x000001e8 1 class.LHello
0x00000208 1 class.LWorld
0x00000000 0 sym.System.out
0x000001e8 1 class.Hello
0x00000208 1 class.World
0x100000228 908 section.data
0x100000238 20 sym.LHello_._init___V
0x100000238 1 method.public.constructor.LHello_._init___V
0x100000238 20 sym.Hello.void__init
0x100000238 1 method.public.constructor.Hello.void__init
0x10000025c 256 main
0x10000025c 1 entry0
0x10000025c 34 sym.LHello_.main__Ljava_lang_String__V
0x10000025c 1 method.public.static.LHello_.main__Ljava_lang_String__V
0x100000290 84 sym.LHello_.foo_I_V
0x100000290 1 method.public.LHello_.foo_I_V
0x1000002f4 20 sym.LWorld_._init___V
0x1000002f4 1 method.public.constructor.LWorld_._init___V
0x100000318 68 sym.LWorld_.foo_I_V
0x100000318 1 method.public.LWorld_.foo_I_V
0x10000025c 34 sym.Hello.void_main_String
0x10000025c 1 method.public.static.Hello.void_main_String
0x100000290 84 sym.Hello.void_foo_int
0x100000290 1 method.public.Hello.void_foo_int
0x1000002f4 20 sym.World.void__init
0x1000002f4 1 method.public.constructor.World.void__init
0x100000318 68 sym.World.void_foo_int
0x100000318 1 method.public.World.void_foo_int
0x100000372 6 str.init
0x10000037a 6 str.Findus
0x100000382 10 str.Hello.java
@ -216,18 +216,18 @@ EXPECT=<<EOF
0x1000004a1 8 str.world
0x1000004ab 8 str.worldVar
0x1000004b5 9 str.worldVar2
0x1000004f0 0 sym.LHello_.localVar2
0x1000004f2 0 sym.LHello_.localVar
0x100000506 0 sym.LWorld_.worldVar
0x100000508 0 sym.LWorld_.worldVar2
0x1000004f0 0 sym.Hello.localVar2
0x1000004f2 0 sym.Hello.localVar
0x100000506 0 sym.World.worldVar
0x100000508 0 sym.World.worldVar2
0x8000000000 14 section.reloc_targets
0x8000000000 2 sym.Ljava_io_PrintStream_.println_Ljava_lang_String__V
0x8000000002 2 sym.Ljava_lang_Integer_._init__I_V
0x8000000004 2 sym.Ljava_lang_Integer_.toString__Ljava_lang_String
0x8000000006 2 sym.Ljava_lang_Object_._init___V
0x8000000008 2 sym.Ljava_lang_StringBuilder_._init___V
0x800000000a 2 sym.Ljava_lang_StringBuilder_.append_Ljava_lang_String__Ljava_lang_StringBuilder
0x800000000c 2 sym.Ljava_lang_StringBuilder_.toString__Ljava_lang_String
0x8000000000 2 sym.java.io.PrintStream.void_println_String
0x8000000002 2 sym.Integer.void__init__int
0x8000000004 2 sym.Integer.String_toString
0x8000000006 2 sym.Object.void__init
0x8000000008 2 sym.StringBuilder.void__init
0x800000000a 2 sym.StringBuilder.StringBuilder_append_String
0x800000000c 2 sym.StringBuilder.String_toString
EOF
RUN
@ -235,16 +235,16 @@ NAME=DEX HelloWorld.dex imports (ii command)
FILE=bins/dex/HelloWorld.dex
CMDS=ii
EXPECT=<<EOF
nth vaddr bind type lib name
-------------------------------------------------------------------------------
0 0x00000000 WEAK FIELD java.lang System.out
1 ---------- WEAK FUNC java.io void PrintStream.println(String)
2 ---------- WEAK FUNC java.lang void Integer.<init>(int)
3 ---------- WEAK FUNC java.lang String Integer.toString()
4 ---------- WEAK FUNC java.lang void Object.<init>()
5 ---------- WEAK FUNC java.lang void StringBuilder.<init>()
6 ---------- WEAK FUNC java.lang StringBuilder StringBuilder.append(String)
7 ---------- WEAK FUNC java.lang String StringBuilder.toString()
nth vaddr bind type lib name
---------------------------------------------------------------------------------------------
0 0x00000000 WEAK FIELD java.lang.System System.out
1 ---------- WEAK FUNC java.io.PrintStream void java.io.PrintStream.println(String)
2 ---------- WEAK FUNC java.lang.Integer void Integer.<init>(int)
3 ---------- WEAK FUNC java.lang.Integer String Integer.toString()
4 ---------- WEAK FUNC java.lang.Object void Object.<init>()
5 ---------- WEAK FUNC java.lang.StringBuilder void StringBuilder.<init>()
6 ---------- WEAK FUNC java.lang.StringBuilder StringBuilder StringBuilder.append(String)
7 ---------- WEAK FUNC java.lang.StringBuilder String StringBuilder.toString()
EOF
RUN
@ -478,8 +478,8 @@ NAME=DEX radare2installer.dex classes (is getProper)
FILE=bins/dex/org.radare.radare2installer.dex
CMDS=ii~getProper
EXPECT=<<EOF
402 ---------- WEAK FUNC java.lang String System.getProperty(String)
403 ---------- WEAK FUNC java.lang String System.getProperty(String, String)
402 ---------- WEAK FUNC java.lang.System String System.getProperty(String)
403 ---------- WEAK FUNC java.lang.System String System.getProperty(String, String)
EOF
RUN
@ -1436,21 +1436,21 @@ RUN
NAME=DEX radare2installer.dex classes
FILE=bins/dex/org.radare.radare2installer.dex
CMDS=<<EOF
icf 'Lcom/stericson/RootTools/Installer;'
icm 'Lcom/stericson/RootTools/Installer;'
icf 'com.stericson.RootTools.Installer'
icm 'com.stericson.RootTools.Installer'
EOF
EXPECT=<<EOF
address index class flags name type
------------------------------------------------------------------------------------------------------
0x10000a4b2 0 Lcom/stericson/RootTools/Installer; sPf BOGUS_FILE_NAME Ljava/lang/String;
0x10000a4b5 1 Lcom/stericson/RootTools/Installer; sPf LOG_TAG Ljava/lang/String;
0x10000a4b7 2 Lcom/stericson/RootTools/Installer; P context Landroid/content/Context;
0x10000a4ba 3 Lcom/stericson/RootTools/Installer; P filesPath Ljava/lang/String;
address index class flags name
------------------------------------------------------------------------------------------------------------------
0x100011410 0 Lcom/stericson/RootTools/Installer; pC <init>(Landroid/content/Context;)V
0x100011440 1 Lcom/stericson/RootTools/Installer; r installBinary(ILjava/lang/String;Ljava/lang/String;)Z
0x100011814 2 Lcom/stericson/RootTools/Installer; r isBinaryInstalled(Ljava/lang/String;)Z
address index class flags name type
--------------------------------------------------------------------------------------------------
0x10000a4b2 0 com.stericson.RootTools.Installer sPf BOGUS_FILE_NAME String
0x10000a4b5 1 com.stericson.RootTools.Installer sPf LOG_TAG String
0x10000a4b7 2 com.stericson.RootTools.Installer P context android.content.Context
0x10000a4ba 3 com.stericson.RootTools.Installer P filesPath String
address index class flags name
-----------------------------------------------------------------------------------------------------
0x100011410 0 com.stericson.RootTools.Installer pC void <init>(android.content.Context)
0x100011440 1 com.stericson.RootTools.Installer r boolean installBinary(int, String, String)
0x100011814 2 com.stericson.RootTools.Installer r boolean isBinaryInstalled(String)
EOF
RUN

View file

@ -226,7 +226,7 @@ address min max name super
0x00000000 0x180014f94 0x180014f98 std
address index class flags name type
------------------------------------------------------------------------
0x00000000 0 Test isa struct objc_class *
---------- 0 Test isa struct objc_class *
0x182068038 1 Test Test::(ivar)someField i
address index class flags name
-----------------------------------------------------------
@ -319,7 +319,7 @@ address min max name super
0x00000000 0x180014f94 0x180014f98 std
address index class flags name type
------------------------------------------------------------------------
0x00000000 0 Test isa struct objc_class *
---------- 0 Test isa struct objc_class *
0x18206c038 1 Test Test::(ivar)someField i
address index class flags name
-----------------------------------------------------------
@ -331,12 +331,12 @@ address index class flags name
0x180018a38 5 Test c someStaticMethod
address index class flags name type
------------------------------------------------------------------------------------------
0x00000000 0 NSObject isa struct objc_class *
---------- 0 NSObject isa struct objc_class *
0x18206d1c4 1 NSObject NSObject::(ivar)isa #
0x00000000 2 NSObject NSObject::(property)hash
0x00000000 3 NSObject NSObject::(property)superclass
0x00000000 4 NSObject NSObject::(property)description
0x00000000 5 NSObject NSObject::(property)debugDescription
---------- 2 NSObject NSObject::(property)hash
---------- 3 NSObject NSObject::(property)superclass
---------- 4 NSObject NSObject::(property)description
---------- 5 NSObject NSObject::(property)debugDescription
address index class flags name
------------------------------------------------------------------------
0x18004144c 0 NSObject init

File diff suppressed because it is too large Load diff

View file

@ -117,7 +117,7 @@ address index class flags name
0x100003aa0 5 Test c someStaticMethod
address index class flags name type
------------------------------------------------------------------------
0x00000000 0 Test isa struct objc_class *
---------- 0 Test isa struct objc_class *
0x1000080f0 1 Test Test::(ivar)someField i
EOF
RUN
@ -149,7 +149,7 @@ address index class flags name
0x100003a70 5 Test c someStaticMethod
address index class flags name type
------------------------------------------------------------------------
0x00000000 0 Test isa struct objc_class *
---------- 0 Test isa struct objc_class *
0x1000080f0 1 Test Test::(ivar)someField i
EOF
RUN

View file

@ -266,11 +266,11 @@ address index class flags name
0x100001e90 0 ViewController viewDidLoad
address index class flags name type
--------------------------------------------------------------------------------
0x00000000 0 AppDelegate AppDelegate::(property)window
0x00000000 1 AppDelegate AppDelegate::(property)hash
0x00000000 2 AppDelegate AppDelegate::(property)superclass
0x00000000 3 AppDelegate AppDelegate::(property)description
0x00000000 4 AppDelegate AppDelegate::(property)debugDescription
---------- 0 AppDelegate AppDelegate::(property)window
---------- 1 AppDelegate AppDelegate::(property)hash
---------- 2 AppDelegate AppDelegate::(property)superclass
---------- 3 AppDelegate AppDelegate::(property)description
---------- 4 AppDelegate AppDelegate::(property)debugDescription
address index class flags name
------------------------------------------------------------------------------------------------
0x100001ee4 0 AppDelegate application:didFinishLaunchingWithOptions:
@ -278,13 +278,13 @@ address index class flags name
0x1000020a4 2 AppDelegate application:didDiscardSceneSessions:
address index class flags name type
----------------------------------------------------------------------------------------------------
0x00000000 0 SceneDelegate isa struct objc_class *
---------- 0 SceneDelegate isa struct objc_class *
0x100009268 1 SceneDelegate SceneDelegate::(ivar)_window @"UIWindow"
0x00000000 2 SceneDelegate SceneDelegate::(property)window
0x00000000 3 SceneDelegate SceneDelegate::(property)hash
0x00000000 4 SceneDelegate SceneDelegate::(property)superclass
0x00000000 5 SceneDelegate SceneDelegate::(property)description
0x00000000 6 SceneDelegate SceneDelegate::(property)debugDescription
---------- 2 SceneDelegate SceneDelegate::(property)window
---------- 3 SceneDelegate SceneDelegate::(property)hash
---------- 4 SceneDelegate SceneDelegate::(property)superclass
---------- 5 SceneDelegate SceneDelegate::(property)description
---------- 6 SceneDelegate SceneDelegate::(property)debugDescription
address index class flags name
--------------------------------------------------------------------------
0x1000021d0 0 SceneDelegate scene:willConnectToSession:options:

View file

@ -11,9 +11,9 @@ address min max name super
0x100001180 0x100000da0 0x100000e20 Person NSObject
address index class flags name type
--------------------------------------------------------------------------
0x00000000 0 Person isa struct objc_class *
---------- 0 Person isa struct objc_class *
0x100001178 1 Person Person::(ivar)name *
0x00000000 2 Person Person::(property)name
---------- 2 Person Person::(property)name
address index class flags name
----------------------------------------
0x100000da0 0 Person sayHello

View file

@ -836,9 +836,9 @@ FILE=bins/java/test.class
CMDS=!rz-bin -c ${RZ_FILE}
EXPECT=<<EOF
[Classes]
address min max name super
-----------------------------------------------------------
0x00000000 0x000008f9 0x00000bcd Ltest; groovy/lang/Script
address min max name super
---------------------------------------------------------
0x00000000 0x000008f9 0x00000bcd test groovy.lang.Script
EOF
RUN
@ -847,7 +847,7 @@ NAME=rz-bin -cq
FILE=bins/java/test.class
CMDS=!rz-bin -cq ${RZ_FILE}
EXPECT=<<EOF
0x00000000 [0x000008f9 - 0x00000bcd] Ltest; groovy/lang/Script
0x00000000 [0x000008f9 - 0x00000bcd] test groovy.lang.Script
EOF
RUN

File diff suppressed because one or more lines are too long