Changeset 1239
- Timestamp:
- 04/25/07 23:54:29 (2 years ago)
- Files:
-
- libemu/trunk/include/emu/emu_graph.h (modified) (2 diffs)
- libemu/trunk/include/emu/emu_queue.h (added)
- libemu/trunk/include/emu/emu_source.h (added)
- libemu/trunk/include/emu/emu_track.h (modified) (3 diffs)
- libemu/trunk/src/Makefile.am (modified) (1 diff)
- libemu/trunk/src/emu_queue.c (added)
- libemu/trunk/src/emu_source.c (added)
- libemu/trunk/src/emu_track.c (modified) (4 diffs)
- libemu/trunk/testsuite/sctest.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
libemu/trunk/include/emu/emu_graph.h
r1229 r1239 27 27 header_list_functions(emu_vertexes,emu_vertex_root, emu_vertex, link); 28 28 29 enum emu_vertex_color { white, grey, black }; 29 30 31 32 enum emu_color { black, blue, cyan, green, grey, magenta, red, white, yellow }; 30 33 31 34 struct emu_vertex … … 35 38 36 39 emu_vertex_link link; 37 enum emu_ vertex_color color;40 enum emu_color color; 38 41 39 42 emu_edge_root *backedges; libemu/trunk/include/emu/emu_track.h
r1225 r1239 1 1 /* @header@ */ 2 3 #ifndef HAVE_EMU_TRACK_H 4 #define HAVE_EMU_TRACK_H 2 5 3 6 #include <stdint.h> … … 7 10 struct emu_graph; 8 11 struct emu_instruction; 12 struct emu_source; 9 13 10 14 11 struct emu_ track_instr_info15 struct emu_source_and_track_instr_info 12 16 { 13 17 uint32_t eip; … … 32 36 }; 33 37 34 struct emu_ track_instr_info *emu_track_instr_info_new(struct emu_cpu *cpu, uint32_t eip_before_instruction);35 void emu_ track_instr_info_free();38 struct emu_source_and_track_instr_info *emu_source_and_track_instr_info_new(struct emu_cpu *cpu, uint32_t eip_before_instruction); 39 void emu_source_track_instr_info_free(struct emu_source_and_track_instr_info *esantii); 36 40 37 bool emu_ track_instr_info_cmp(void *a, void *b);38 uint32_t emu_ track_instr_info_hash(void *key);41 bool emu_source_and_track_instr_info_cmp(void *a, void *b); 42 uint32_t emu_source_and_track_instr_info_hash(void *key); 39 43 40 44 41 struct emu_track 45 struct emu_track_and_source 42 46 { 43 47 uint32_t eflags; 44 48 uint32_t reg[8]; 45 49 46 struct emu_graph *trackgraph; 47 struct emu_hashtable *instrtable; 50 struct emu_graph *instr_graph; 51 struct emu_hashtable *instr_table; 52 53 struct emu_source *source; 48 54 }; 49 55 50 56 51 struct emu_track *emu_track_new(); 52 void emu_track_free(struct emu_track *et); 53 uint32_t emu_track_tree_create(struct emu *e, struct emu_track *et, uint32_t datastart, uint32_t datasize); 54 int32_t emu_track_instruction_check(struct emu *e, struct emu_track *et); 57 struct emu_track_and_source *emu_track_and_source_new(); 58 void emu_track_and_source_free(struct emu_track_and_source *et); 55 59 60 int32_t emu_track_instruction_check(struct emu *e, struct emu_track_and_source *et); 61 62 #endif libemu/trunk/src/Makefile.am
r1225 r1239 22 22 libemu_la_SOURCES += emu_graph.c 23 23 libemu_la_SOURCES += emu_hashtable.c 24 libemu_la_SOURCES += emu_queue.c 25 libemu_la_SOURCES += emu_source.c 24 26 libemu_la_SOURCES += emu_track.c 25 27 libemu_la_SOURCES += functions/aaa.c libemu/trunk/src/emu_track.c
r1236 r1239 1 /* @header@ */ 2 1 3 #include <string.h> 2 4 … … 6 8 #include "emu/emu_instruction.h" 7 9 #include "emu/emu_track.h" 10 #include "emu/emu_source.h" 8 11 #include "emu/emu_hashtable.h" 9 12 #include "emu/emu_graph.h" 10 13 11 struct emu_track_ instr_info *emu_track_instr_info_new(struct emu_cpu *cpu, uint32_t eip_before_instruction)14 struct emu_track_and_source *emu_track_and_source_new() 12 15 { 13 struct emu_track_instr_info *etii = (struct emu_track_instr_info *)malloc(sizeof(struct emu_track_instr_info)); 14 memset(etii, 0, sizeof(struct emu_track_instr_info)); 15 16 etii->eip = eip_before_instruction; 17 etii->instrstring = strdup(cpu->instr_string); 18 19 if ( cpu->instr.is_fpu ) 20 { 21 etii->source.norm_pos = cpu->instr.fpu.source.norm_pos; 22 }else 23 { 24 etii->source.has_cond_pos = cpu->instr.cpu.source.has_cond_pos; 25 etii->source.cond_pos = cpu->instr.cpu.source.cond_pos; 26 etii->source.norm_pos = cpu->instr.cpu.source.norm_pos; 27 28 etii->track.init.eflags = cpu->instr.cpu.track.init.eflags; 29 memcpy(etii->track.init.reg, cpu->instr.cpu.track.init.reg, sizeof(uint32_t)*8); 30 31 etii->track.need.eflags = cpu->instr.cpu.track.need.eflags; 32 memcpy(etii->track.need.reg, cpu->instr.cpu.track.need.reg, sizeof(uint32_t)*8); 33 } 34 return etii; 35 } 36 37 void emu_track_instr_info_free(struct emu_track_instr_info *etii) 38 { 39 if (etii->instrstring != NULL) 40 free(etii->instrstring); 41 42 free(etii); 43 } 44 45 bool emu_track_instr_info_cmp(void *a, void *b) 46 { 47 if ((uint32_t)a == (uint32_t)b) 48 return true; 49 50 return false; 51 } 52 53 uint32_t emu_track_instr_info_hash(void *key) 54 { 55 uint32_t ukey = (uint32_t)key; 56 ukey++; 57 return ukey; 58 } 59 60 61 struct emu_track *emu_track_new() 62 { 63 struct emu_track *et = (struct emu_track *)malloc(sizeof(struct emu_track)); 64 memset(et, 0, sizeof(struct emu_track)); 16 struct emu_track_and_source *et = (struct emu_track_and_source *)malloc(sizeof(struct emu_track_and_source)); 17 memset(et, 0, sizeof(struct emu_track_and_source)); 65 18 et->reg[esp] = 0xffffffff; 66 19 return et; 67 20 } 68 21 69 void emu_track_ free(struct emu_track*et)22 void emu_track_and_source_free(struct emu_track_and_source *et) 70 23 { 71 if (et->instr table != NULL)72 emu_hashtable_free(et->instr table);24 if (et->instr_table != NULL) 25 emu_hashtable_free(et->instr_table); 73 26 74 if (et-> trackgraph != NULL)75 emu_graph_free(et-> trackgraph);27 if (et->instr_graph != NULL) 28 emu_graph_free(et->instr_graph); 76 29 77 30 free(et); … … 79 32 } 80 33 81 uint32_t emu_track_tree_create(struct emu *e, struct emu_track *et, uint32_t datastart, uint32_t datasize)82 {83 printf("tracking from %x to %x\n", datastart, datastart+datasize);84 struct emu_cpu *c = emu_cpu_get(e);85 86 et->trackgraph = emu_graph_new();87 et->instrtable = emu_hashtable_new(datasize/2, emu_track_instr_info_hash, emu_track_instr_info_cmp);88 89 uint32_t i;90 for (i=datastart;i<datastart+datasize;i++)91 {92 emu_cpu_eip_set(c, i);93 94 if ( emu_cpu_parse(c) != 0)95 continue;96 97 if ( emu_cpu_step(c) != 0)98 continue;99 100 struct emu_track_instr_info *etii = emu_track_instr_info_new(c,i);101 struct emu_vertex *ev = emu_vertex_new();102 ev->data = etii;103 emu_hashtable_insert(et->instrtable, (void *)i, ev);104 emu_graph_vertex_add(et->trackgraph, ev);105 }106 107 struct emu_vertex *ev;108 for ( ev = emu_vertexes_first(et->trackgraph->vertexes); !emu_vertexes_attail(ev); ev = emu_vertexes_next(ev) )109 {110 struct emu_track_instr_info *etii = (struct emu_track_instr_info *)ev->data;111 112 struct emu_hashtable_item *ehi = emu_hashtable_search(et->instrtable, (void *)etii->source.norm_pos);113 printf("NORM from %08x to %08x\n",((struct emu_track_instr_info *)ev->data)->eip, etii->source.norm_pos);114 if (ehi != NULL)115 {116 struct emu_vertex *to = (struct emu_vertex *)ehi->value;117 emu_vertex_edge_add(ev, to);118 119 }else120 {121 printf("NORM IS UNKNOWN\n");122 }123 124 if (etii->source.has_cond_pos == 1)125 {126 printf("COND from %08x to %08x\n",((struct emu_track_instr_info *)ev->data)->eip, etii->source.cond_pos);127 ehi = emu_hashtable_search(et->instrtable, (void *)etii->source.cond_pos);128 if (ehi != NULL)129 {130 struct emu_vertex *to = (struct emu_vertex *)ehi->value;131 emu_vertex_edge_add(ev, to);132 133 }else134 {135 printf("COND IS UNKNOWN\n");136 }137 }138 }139 return 0;140 }141 34 142 35 void debug_instruction(struct emu_cpu_instruction *i); 143 36 144 int32_t emu_track_instruction_check(struct emu *e, struct emu_track *et)37 int32_t emu_track_instruction_check(struct emu *e, struct emu_track_and_source *et) 145 38 { 146 39 struct emu_cpu *c = emu_cpu_get(e); … … 179 72 return 0; 180 73 } 74 75 76 struct emu_source_and_track_instr_info *emu_source_and_track_instr_info_new(struct emu_cpu *cpu, uint32_t eip_before_instruction) 77 { 78 struct emu_source_and_track_instr_info *etii = (struct emu_source_and_track_instr_info *)malloc(sizeof(struct emu_source_and_track_instr_info)); 79 memset(etii, 0, sizeof(struct emu_source_and_track_instr_info)); 80 81 etii->eip = eip_before_instruction; 82 etii->instrstring = strdup(cpu->instr_string); 83 84 if ( cpu->instr.is_fpu ) 85 { 86 etii->source.norm_pos = cpu->instr.fpu.source.norm_pos; 87 }else 88 { 89 etii->source.has_cond_pos = cpu->instr.cpu.source.has_cond_pos; 90 etii->source.cond_pos = cpu->instr.cpu.source.cond_pos; 91 etii->source.norm_pos = cpu->instr.cpu.source.norm_pos; 92 93 etii->track.init.eflags = cpu->instr.cpu.track.init.eflags; 94 memcpy(etii->track.init.reg, cpu->instr.cpu.track.init.reg, sizeof(uint32_t)*8); 95 96 etii->track.need.eflags = cpu->instr.cpu.track.need.eflags; 97 memcpy(etii->track.need.reg, cpu->instr.cpu.track.need.reg, sizeof(uint32_t)*8); 98 } 99 return etii; 100 } 101 102 void emu_source_and_track_instr_info_free(struct emu_source_and_track_instr_info *etii) 103 { 104 if (etii->instrstring != NULL) 105 free(etii->instrstring); 106 107 free(etii); 108 } 109 110 bool emu_source_and_track_instr_info_cmp(void *a, void *b) 111 { 112 if ((uint32_t)a == (uint32_t)b) 113 return true; 114 115 return false; 116 } 117 118 uint32_t emu_source_and_track_instr_info_hash(void *key) 119 { 120 uint32_t ukey = (uint32_t)key; 121 ukey++; 122 return ukey; 123 } 124 libemu/trunk/testsuite/sctest.c
r1237 r1239 1420 1420 1421 1421 #include <emu/emu_track.h> 1422 1423 void bfs_from_getpc(struct emu_vertex *ev) 1424 { 1425 printf("%08x %s\n", (unsigned int)ev, ((struct emu_track_instr_info *)ev->data)->instrstring); 1426 1427 struct emu_edge *ee; 1428 /* for ( ee = emu_edges_first(ev->backedges); !emu_edges_attail(ee); ee = emu_edges_next(ee) ) 1429 { 1430 if (ee->destination->color == white) 1431 bfs_from_getpc(ee->destination); 1432 } 1433 */ 1434 if ( emu_edges_length(ev->backedges) == 0 ) 1435 { 1436 ev->color = grey; 1437 } 1438 else 1439 { 1440 ev->color = black; 1441 } 1442 1443 for ( ee = emu_edges_first(ev->backedges); !emu_edges_attail(ee); ee = emu_edges_next(ee) ) 1444 { 1445 if ( ee->destination->color == white ) 1446 bfs_from_getpc(ee->destination); 1447 } 1448 1449 } 1450 1451 int32_t run_and_track(struct emu *e, struct emu_track *et, struct emu_env_w32 *env) 1422 #include <emu/emu_source.h> 1423 1424 int32_t run_and_track(struct emu *e, struct emu_track_and_source *et, struct emu_env_w32 *env) 1452 1425 { 1453 1426 int ret = -1; … … 1512 1485 struct emu_memory *mem = emu_memory_get(e); 1513 1486 struct emu_env_w32 *env = emu_env_w32_new(e); 1514 struct emu_track *et = emu_track_new();1487 struct emu_track_and_source *et = emu_track_and_source_new(); 1515 1488 1516 1489 if ( env == 0 ) … … 1636 1609 { 1637 1610 printf("FOX\n"); 1638 emu_ track_tree_create(e, et, static_offset, tests[i].codesize);1611 emu_source_instruction_graph_create(e, et, static_offset, tests[i].codesize); 1639 1612 1640 1613 struct emu_vertex *ev; 1641 for ( ev = emu_vertexes_first(et->trackgraph->vertexes); !emu_vertexes_attail(ev); ev = emu_vertexes_next(ev) ) 1642 { 1643 ev->color = white; 1644 } 1645 1646 /* for ( ev = emu_vertexes_first(et->trackgraph->vertexes); !emu_vertexes_attail(ev); ev = emu_vertexes_next(ev) ) 1647 { 1648 bfs_from_getpc(ev); 1649 } 1650 */ 1651 struct emu_hashtable_item *ehi = emu_hashtable_search(et->instrtable, (void *)(static_offset+offset)); 1614 1615 struct emu_hashtable_item *ehi = emu_hashtable_search(et->instr_table, (void *)(static_offset+offset)); 1652 1616 1653 1617 if ( ehi != NULL ) 1654 1618 { 1655 1619 ev = (struct emu_vertex *)ehi->value; 1656 bfs_from_getpc(ev);1657 1658 for ( ev = emu_vertexes_first(et-> trackgraph->vertexes);1620 emu_source_bfs(et, ev); 1621 1622 for ( ev = emu_vertexes_first(et->instr_graph->vertexes); 1659 1623 !emu_vertexes_attail(ev) && found_good_candidate_after_getpc == false; 1660 1624 ev = emu_vertexes_next(ev) ) 1661 1625 { 1662 if ( ev->color == gre y)1626 if ( ev->color == green ) 1663 1627 { 1664 1628 printf("POSSIBLE\n"); 1665 struct emu_ track_instr_info *etii = (struct emu_track_instr_info *)ev->data;1629 struct emu_source_and_track_instr_info *etii = (struct emu_source_and_track_instr_info *)ev->data; 1666 1630 1667 1631 for ( j=0;j<8;j++ )
