diff options
Diffstat (limited to 'src/format/dex/pool.c')
-rw-r--r-- | src/format/dex/pool.c | 114 |
1 files changed, 46 insertions, 68 deletions
diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c index 1724dd9..056443e 100644 --- a/src/format/dex/pool.c +++ b/src/format/dex/pool.c @@ -342,44 +342,6 @@ GBinVariable *get_field_from_dex_pool(GDexFormat *format, uint32_t index) /****************************************************************************** * * -* Paramètres : format = représentation interne du format DEX à compléter. * -* * -* Description : Charge tous les prototypes listés dans le contenu binaire. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool load_all_dex_prototypes(GDexFormat *format) -{ - bool result; /* Bilan à retourner */ - uint32_t i; /* Boucle de parcours */ - GBinRoutine *proto; /* Prototype récupéré */ - - result = true; - - format->prototypes = (GBinRoutine **)calloc(format->header.proto_ids_size, sizeof(GBinRoutine *)); - - for (i = 0; i < format->header.proto_ids_size && result; i++) - { - proto = get_prototype_from_dex_pool(format, i); - - if (proto != NULL) - g_object_unref(G_OBJECT(proto)); - else - result = false; - - } - - return result; - -} - - -/****************************************************************************** -* * * Paramètres : format = représentation interne du format DEX à consulter. * * index = index de la routine recherchée. * * * @@ -405,56 +367,72 @@ GBinRoutine *get_prototype_from_dex_pool(GDexFormat *format, uint32_t index) result = NULL; - if (index >= format->header.method_ids_size) + /** + * Les prototypes sont personnalisés après chargement. + * Donc on ne peut pas conserver de version globale comme pour + * les autres éléments de la table des constantes. + */ + + if (index >= format->header.proto_ids_size) goto grfdp_error; - if (format->prototypes[index] == NULL) - { - pos = format->header.proto_ids_off + index * sizeof(proto_id_item); - init_vmpa(&addr, pos, VMPA_NO_VIRTUAL); + pos = format->header.proto_ids_off + index * sizeof(proto_id_item); + init_vmpa(&addr, pos, VMPA_NO_VIRTUAL); - if (!read_dex_proto_id_item(format, &addr, &proto_id)) - goto grfdp_error; + if (!read_dex_proto_id_item(format, &addr, &proto_id)) + goto grfdp_error; - /* Type de retour */ + /* Type de retour */ - type = get_type_from_dex_pool(format, proto_id.return_type_idx); + type = get_type_from_dex_pool(format, proto_id.return_type_idx); - /* Nom de la méthode */ + /* Nom de la méthode */ - name = get_string_from_dex_pool(format, proto_id.shorty_idx); + name = get_string_from_dex_pool(format, proto_id.shorty_idx); - /* Liste des arguments */ + /* Liste des arguments */ - pos = proto_id.parameters_off; - init_vmpa(&addr, pos, VMPA_NO_VIRTUAL); + pos = proto_id.parameters_off; + init_vmpa(&addr, pos, VMPA_NO_VIRTUAL); - if (read_dex_type_list(format, &addr, &args)) - for (i = 0; i < args.size; i++) - { - type = get_type_from_dex_pool(format, args.list[i].type_idx); - if (type == NULL) continue; + result = g_binary_routine_new();/////////////////////// - arg = g_binary_variable_new(type); - //g_binary_routine_add_arg(result, arg); + if (read_dex_type_list(format, &addr, &args)) + for (i = 0; i < args.size; i++) + { + type = get_type_from_dex_pool(format, args.list[i].type_idx); + if (type == NULL) continue; - } + printf(" ++ PROTO POOL ++ type '%s'\n", g_data_type_to_string(type)); - /* Mise en place finale */ + arg = g_binary_variable_new(type); + g_binary_routine_add_arg(result, arg);/////////////////////// - format->prototypes[index] = demangle_routine(G_TYPE_DEX_DEMANGLER, name); + printf(" ++ PROTO POOL ++ arg '%s'\n", g_binary_variable_to_string(arg, true)); -#if 0 - if (format->prototypes[index] != NULL) - g_binary_routine_set_return_type(format->prototypes[index], type); -#endif + } - } + /* Mise en place finale */ - result = format->prototypes[index]; + ///////result = demangle_routine(G_TYPE_DEX_DEMANGLER, name); + + g_binary_routine_set_name(result, strdup("...")); + + printf(" PROTO POOL // from %s to %s\n", + name, + result == NULL ? NULL : + g_binary_routine_to_string(result)); + + +#if 1 + if (result != NULL)/////////////////////// + g_binary_routine_set_return_type(result, type); +#endif + /* if (result != NULL) g_object_ref(G_OBJECT(result)); + */ grfdp_error: |