diff options
Diffstat (limited to 'plugins/dex/python/format.c')
-rw-r--r-- | plugins/dex/python/format.c | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/plugins/dex/python/format.c b/plugins/dex/python/format.c index a421549..81db02f 100644 --- a/plugins/dex/python/format.c +++ b/plugins/dex/python/format.c @@ -36,8 +36,10 @@ #include <plugins/pychrysalide/format/executable.h> +#include "constants.h" #include "../class.h" #include "../format.h" +#include "../pool.h" @@ -50,6 +52,24 @@ static PyObject *py_dex_format_count_classes(PyObject *, PyObject *); /* Fournit une classe du format chargée en mémoire. */ static PyObject *py_dex_format_get_class(PyObject *, PyObject *); +/* Fournit la liste de toutes les chaînes de la table globale. */ +static PyObject *py_dex_format_get_pool_strings(PyObject *, void *); + +/* Fournit la liste de tous les types de la table globale. */ +static PyObject *py_dex_format_get_pool_types(PyObject *, void *); + +/* Fournit la liste de tous les prototypes de la table globale. */ +static PyObject *py_dex_format_get_pool_prototypes(PyObject *, void *); + +/* Fournit la liste de tous les champs de la table globale. */ +static PyObject *py_dex_format_get_pool_fields(PyObject *, void *); + +/* Fournit la liste de toutes les méthodes de la table globale. */ +static PyObject *py_dex_format_get_pool_methods(PyObject *, void *); + +/* Fournit la liste de toutes les classes du format. */ +static PyObject *py_dex_format_get_classes(PyObject *, void *); + /****************************************************************************** @@ -152,6 +172,313 @@ static PyObject *py_dex_format_get_class(PyObject *self, PyObject *args) result = pygobject_new(G_OBJECT(class)); + g_object_unref(G_OBJECT(class)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la liste de toutes les chaînes de la table globale. * +* * +* Retour : Liste vide ou remplie de chaînes. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_dex_format_get_pool_strings(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDexFormat *format; /* Version native */ + uint32_t count; /* Nombre d'éléments à traiter */ + uint32_t i; /* Boucle de parcours */ + const char *string; /* Chaîne à intégrer */ + PyObject *str; /* Chaîne au format Python */ + + format = G_DEX_FORMAT(pygobject_get(self)); + + count = count_strings_in_dex_pool(format); + + result = PyTuple_New(count); + + for (i = 0; i < count; i++) + { + string = get_string_from_dex_pool(format, i, NULL); + + if (string == NULL) + { + str = Py_None; + Py_INCREF(str); + } + + else + str = PyUnicode_FromString(string); + + PyTuple_SetItem(result, i, str); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la liste de tous les types de la table globale. * +* * +* Retour : Liste vide ou remplie de types. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_dex_format_get_pool_types(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDexFormat *format; /* Version native */ + uint32_t count; /* Nombre d'éléments à traiter */ + uint32_t i; /* Boucle de parcours */ + GDataType *type; /* Type à intégrer */ + PyObject *tp; /* Type au format Python */ + + format = G_DEX_FORMAT(pygobject_get(self)); + + count = count_types_in_dex_pool(format); + + result = PyTuple_New(count); + + for (i = 0; i < count; i++) + { + type = get_type_from_dex_pool(format, i); + + if (type == NULL) + { + tp = Py_None; + Py_INCREF(tp); + } + + else + { + tp = pygobject_new(G_OBJECT(type)); + g_object_unref(type); + } + + PyTuple_SetItem(result, i, tp); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la liste de tous les champs de la table globale. * +* * +* Retour : Liste vide ou remplie de méthodes. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_dex_format_get_pool_fields(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDexFormat *format; /* Version native */ + uint32_t count; /* Nombre d'éléments à traiter */ + uint32_t i; /* Boucle de parcours */ + GBinVariable *variable; /* Champ à intégrer */ + PyObject *var; /* Champ au format Python */ + + format = G_DEX_FORMAT(pygobject_get(self)); + + count = count_fields_in_dex_pool(format); + + result = PyTuple_New(count); + + for (i = 0; i < count; i++) + { + variable = get_field_from_dex_pool(format, i); + + if (variable == NULL) + { + var = Py_None; + Py_INCREF(var); + } + + else + { + var = pygobject_new(G_OBJECT(variable)); + g_object_unref(variable); + } + + PyTuple_SetItem(result, i, var); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la liste de toutes les méthodes de la table globale. * +* * +* Retour : Liste vide ou remplie de méthodes. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_dex_format_get_pool_methods(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDexFormat *format; /* Version native */ + uint32_t count; /* Nombre d'éléments à traiter */ + uint32_t i; /* Boucle de parcours */ + GDexMethod *method; /* Méthode à intégrer */ + PyObject *meth; /* Méthode au format Python */ + + format = G_DEX_FORMAT(pygobject_get(self)); + + count = count_methods_in_dex_pool(format); + + result = PyTuple_New(count); + + for (i = 0; i < count; i++) + { + method = get_method_from_dex_pool(format, i); + + if (method == NULL) + { + meth = Py_None; + Py_INCREF(meth); + } + + else + { + meth = pygobject_new(G_OBJECT(method)); + g_object_unref(method); + } + + PyTuple_SetItem(result, i, meth); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la liste de tous les prototypes de la table globale. * +* * +* Retour : Liste vide ou remplie de méthodes. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_dex_format_get_pool_prototypes(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDexFormat *format; /* Version native */ + uint32_t count; /* Nombre d'éléments à traiter */ + uint32_t i; /* Boucle de parcours */ + GBinRoutine *routine; /* Routine à intégrer */ + PyObject *rtn; /* Routine au format Python */ + + format = G_DEX_FORMAT(pygobject_get(self)); + + count = count_prototypes_in_dex_pool(format); + + result = PyTuple_New(count); + + for (i = 0; i < count; i++) + { + routine = get_prototype_from_dex_pool(format, i); + + if (routine == NULL) + { + rtn = Py_None; + Py_INCREF(rtn); + } + + else + { + rtn = pygobject_new(G_OBJECT(routine)); + g_object_unref(routine); + } + + PyTuple_SetItem(result, i, rtn); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la liste de toutes les classes du format. * +* * +* Retour : Liste vide ou remplie de classes. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_dex_format_get_classes(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GDexFormat *format; /* Version native */ + size_t count; /* Nombre d'éléments à traiter */ + size_t i; /* Boucle de parcours */ + GDexClass *class; /* Classe du format à intégrer */ + + format = G_DEX_FORMAT(pygobject_get(self)); + + count = g_dex_format_count_classes(format); + + result = PyTuple_New(count); + + for (i = 0; i < count; i++) + { + class = g_dex_format_get_class(format, i); + assert(class != NULL); + + PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(class))); + + g_object_unref(G_OBJECT(class)); + + } + return result; } @@ -186,6 +513,30 @@ PyTypeObject *get_python_dex_format_type(void) }; static PyGetSetDef py_dex_format_getseters[] = { + { + "pool_strings", py_dex_format_get_pool_strings, NULL, + "Strings inside the Dex pool.", NULL + }, + { + "pool_types", py_dex_format_get_pool_types, NULL, + "Types inside the Dex pool.", NULL + }, + { + "pool_prototypes", py_dex_format_get_pool_prototypes, NULL, + "Prototypes inside the Dex pool.", NULL + }, + { + "pool_fields", py_dex_format_get_pool_fields, NULL, + "Fields inside the Dex pool.", NULL + }, + { + "pool_methods", py_dex_format_get_pool_methods, NULL, + "Methods inside the Dex pool.", NULL + }, + { + "classes", py_dex_format_get_classes, NULL, + "Classes inside the Dex format.", NULL + }, { NULL } }; @@ -236,6 +587,9 @@ bool register_python_dex_format(PyObject *module) py_dex_format_type, get_python_executable_format_type())) return false; + if (!define_python_dex_format_constants(py_dex_format_type)) + return false; + return true; } |