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:
parent
ca547fc6fb
commit
59080758fb
29 changed files with 1271 additions and 1179 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
1116
test/db/formats/java
1116
test/db/formats/java
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue