diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-11-25 22:00:02 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-11-25 22:00:02 (GMT) |
commit | 671cacb80fd438a5f4d51db853ed08d7a6edb9ab (patch) | |
tree | 3081bc41bca43137cca75e52fcbcf81798e8b4e2 /src/arch/dalvik/operands | |
parent | 40d448bc4734882ca4a2580b481738f4720ebabe (diff) |
Fortified Chrysalide a little bit against wrong APK files.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@291 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/dalvik/operands')
-rw-r--r-- | src/arch/dalvik/operands/pool.c | 82 |
1 files changed, 66 insertions, 16 deletions
diff --git a/src/arch/dalvik/operands/pool.c b/src/arch/dalvik/operands/pool.c index 803d173..fbe68cf 100644 --- a/src/arch/dalvik/operands/pool.c +++ b/src/arch/dalvik/operands/pool.c @@ -24,6 +24,7 @@ #include "pool.h" +#include <stdio.h> #include <string.h> @@ -181,6 +182,7 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { const char *string; /* Chaîne de caractères #1 */ GDataType *type; /* Type à représenter */ + size_t len; /* Taille du texte à créer */ char *tmp; /* Chaîne de caractères #2 */ GBinVariable *field; /* Champ à représenter */ GBinRoutine *routine; /* Routine à représenter */ @@ -188,14 +190,30 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff switch (operand->type) { case DPT_NONE: - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "????", 4, RTT_SECTION); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "????", 4, RTT_ERROR); break; case DPT_STRING: - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); string = get_string_from_dex_pool(operand->format, operand->index); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, string, strlen(string), RTT_STRING); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); + + if (string != NULL) + { + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, string, strlen(string), RTT_STRING); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); + } + else + { + len = strlen(_("<bad string index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad string index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + free(tmp); + + } + break; case DPT_TYPE: @@ -205,14 +223,24 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { tmp = g_data_type_to_string(type); g_object_unref(G_OBJECT(type)); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); + } else - tmp = strdup(_("invalid type")); + { + len = strlen(_("<bad type index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad type index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + } - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); free(tmp); + break; case DPT_PROTO: @@ -226,13 +254,24 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { tmp = g_binary_variable_to_string(field, false); g_object_unref(G_OBJECT(field)); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); + } else - tmp = strdup(_("invalid field")); + { + len = strlen(_("<bad field index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad field index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + } + + free(tmp); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); break; case DPT_METHOD: @@ -242,13 +281,24 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { tmp = g_binary_routine_to_string(routine); g_object_unref(G_OBJECT(routine)); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); + } else - tmp = strdup(_("invalid method")); + { + len = strlen(_("<bad method index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad method index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + } + + free(tmp); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); break; } |