diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-05-11 23:42:48 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-05-11 23:42:48 (GMT) |
commit | 96cb6971ee3ca529958b8cb1e8e55a6eb4e60eae (patch) | |
tree | 68e49f325de3e93ef186d3e078da8ddc473aedf7 /src/analysis | |
parent | 80dc0ac97987ad9246bee7c47458a015339453bf (diff) |
Reorganized the way the program is built again and added partial support for the JVM.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@63 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rwxr-xr-x | src/analysis/Makefile.am | 2 | ||||
-rw-r--r-- | src/analysis/binary.c | 41 | ||||
-rw-r--r-- | src/analysis/line.c | 2 | ||||
-rw-r--r-- | src/analysis/line.h | 2 | ||||
-rw-r--r-- | src/analysis/line_code.c | 20 | ||||
-rw-r--r-- | src/analysis/line_code.h | 2 |
6 files changed, 39 insertions, 30 deletions
diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am index 065704a..f763f53 100755 --- a/src/analysis/Makefile.am +++ b/src/analysis/Makefile.am @@ -1,5 +1,5 @@ -lib_LTLIBRARIES = libanalysis.la +noinst_LTLIBRARIES = libanalysis.la libanalysis_la_SOURCES = \ binary.h binary.c \ diff --git a/src/analysis/binary.c b/src/analysis/binary.c index b606752..e5e14bc 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -46,8 +46,6 @@ - - #ifndef _ # define _(str) str #endif @@ -68,7 +66,7 @@ struct _openida_binary uint8_t *bin_data; /* Données binaires brutes */ exe_format *format; /* Format du binaire */ - asm_processor *proc; /* Architecture du binaire */ + GArchProcessor *proc; /* Architecture du binaire */ GRenderingLine *lines; /* Lignes de rendu en place */ disass_options options; /* Options de désassemblage */ @@ -116,9 +114,17 @@ openida_binary *load_binary_file(const char *filename) result->format = load_new_exe_format(result->bin_data, result->bin_length); if (result->format == NULL) goto lbf_error; + switch (get_exe_target_machine(result->format)) + { + case FTM_JVM: + result->proc = get_arch_processor_for_type(APT_JVM); + break; - result->proc = create_processor(); + default: + goto lbf_error; + break; + } result->options.show_address = true; result->options.show_code = true; @@ -573,7 +579,9 @@ GRenderingLine *build_binary_prologue(const char *filename, const uint8_t *data, void disassemble_openida_binary(openida_binary *binary) { - asm_instr *instr; + + + GArchInstruction *instr; bin_routine **routines; /* Liste des routines trouvées */ size_t routines_count; /* Nombre de ces routines */ @@ -591,7 +599,7 @@ void disassemble_openida_binary(openida_binary *binary) off_t len; uint64_t base = 0; - uint64_t offset = 0; + vmpa_t addr = 0; size_t i; @@ -616,14 +624,16 @@ void disassemble_openida_binary(openida_binary *binary) disass = get_one_plugin_for_action(PGA_DISASSEMBLE); - if (disass != NULL) + if (0 && disass != NULL) binary->lines = g_plugin_module_disassemble_binary_parts(disass, binary); else { - parts = get_elf_default_code_parts(binary->format, &parts_count); + parts = get_java_default_code_parts(binary->format, &parts_count); qsort(parts, parts_count, sizeof(bin_part *), compare_bin_parts); + printf("PARTS COUNT :: %d\n", parts_count); + for (i = 0; i < parts_count; i++) { get_bin_part_values(parts[i], &pos, &len, &base); @@ -635,19 +645,18 @@ void disassemble_openida_binary(openida_binary *binary) while (pos < len) { - offset = base + pos; + addr = base + pos; - instr = decode_instruction(binary->proc, &binary->bin_data[start], &pos, len, start, offset); + instr = g_arch_processor_decode_instruction(binary->proc, &binary->bin_data[start], &pos, len, start, addr); - - line = g_code_line_new(offset, instr, &binary->options); + line = g_code_line_new(addr, instr, &binary->options); g_rendering_line_add_to_lines(&binary->lines, line); } /* Ajout des prototypes de fonctions */ - +#if 0 for (k = 0; k < routines_count; k++) { routine_offset = get_binary_routine_offset(routines[k]); @@ -662,16 +671,16 @@ void disassemble_openida_binary(openida_binary *binary) free(routine_desc); } - +#endif } } - + /* line = g_rendering_line_find_by_offset(binary->lines, get_exe_entry_point(binary->format)); if (line != NULL) g_rendering_line_add_flag(line, RLF_ENTRY_POINT); - + */ diff --git a/src/analysis/line.c b/src/analysis/line.c index fb8295e..b1af518 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -38,8 +38,6 @@ -/* FIXME */ -//extern GtkWidget *mywid; diff --git a/src/analysis/line.h b/src/analysis/line.h index 0213cab..5744d24 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -60,7 +60,7 @@ typedef struct _disass_options bool show_code; /* Affichage du code brut ? */ exe_format *format; /* Format du contenu bianire */ - asm_processor *proc; /* Architecture utilisée */ + GArchProcessor *proc; /* Architecture utilisée */ } disass_options; diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c index 2dd5a7c..44bb59f 100644 --- a/src/analysis/line_code.c +++ b/src/analysis/line_code.c @@ -37,7 +37,7 @@ struct _GCodeLine { GRenderingLine parent; /* Instance parente */ - asm_instr *instr; /* Instruction représentée */ + GArchInstruction *instr; /* Instruction représentée */ const disass_options *options; /* Options de représentation */ }; @@ -133,7 +133,7 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen) { off_t len; /* Taille propre à la ligne */ - get_asm_instr_offset_and_length(line->instr, NULL, &len); + g_arch_instruction_get_location(line->instr, NULL, &len, NULL); *blen = MAX(*blen, len); @@ -158,7 +158,8 @@ void g_code_line_refresh_markup(GCodeLine *line) char *content; /* Contenu réellement imprimé */ off_t bin_offset; /* Début de l'instruction */ off_t bin_len; /* Taille d'instruction */ - char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */ + char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser #1 */ + char *buffer2; /* Zone tampon à utiliser #2 */ const uint8_t *exe_content; /* Contenu binaire global */ char *bin_code; /* Tampon du code binaire */ off_t k; /* Boucle de parcours #2 */ @@ -169,7 +170,7 @@ void g_code_line_refresh_markup(GCodeLine *line) strcpy(content, "<tt>"); if (line->options->show_code) - get_asm_instr_offset_and_length(line->instr, &bin_offset, &bin_len); + g_arch_instruction_get_location(line->instr, &bin_offset, &bin_len, NULL); /* Eventuelle adresse virtuelle */ @@ -230,15 +231,16 @@ void g_code_line_refresh_markup(GCodeLine *line) /* Instruction proprement dite */ - print_hinstruction(line->options->proc, line->options->format, - line->instr, buffer, CODE_BUFFER_LEN, ASX_INTEL/*FIXME*/); + buffer2 = g_arch_instruction_get_text(line->instr, line->options->format, ASX_INTEL/*FIXME*/); if (line->options->show_address || line->options->show_code) len += strlen("\t"); - len += strlen(buffer); + len += strlen(buffer2); content = (char *)realloc(content, len * sizeof(char)); if (line->options->show_address || line->options->show_code) strcat(content, "\t"); - strcat(content, buffer); + strcat(content, buffer2); + + free(buffer2); /* Finalisation */ @@ -267,7 +269,7 @@ void g_code_line_refresh_markup(GCodeLine *line) * * ******************************************************************************/ -GRenderingLine *g_code_line_new(uint64_t offset, asm_instr *instr, const disass_options *options) +GRenderingLine *g_code_line_new(uint64_t offset, GArchInstruction *instr, const disass_options *options) { GCodeLine *result; /* Structure à retourner */ diff --git a/src/analysis/line_code.h b/src/analysis/line_code.h index 3564038..8a06f28 100644 --- a/src/analysis/line_code.h +++ b/src/analysis/line_code.h @@ -52,7 +52,7 @@ typedef struct _GCodeLineClass GCodeLineClass; GType g_code_line_get_type(void); /* Crée une ligne de code binaire. */ -GRenderingLine *g_code_line_new(uint64_t, asm_instr *, const disass_options *); +GRenderingLine *g_code_line_new(uint64_t, GArchInstruction *, const disass_options *); |