void dump_ctrees_in_file(std::map<ea_t, ctree_dump_line> &data_to_dump, qstring &crypto_prefix) { int file_id = create_open_file("ctrees.txt"); if (file_id != -1) { size_t crypt_prefix_len = crypto_prefix.length(); for (std::map<ea_t, ctree_dump_line>::iterator ctrees_iter = data_to_dump.begin(); ctrees_iter != data_to_dump.end() ; ctrees_iter ++) { qstring sha_hash; int err = get_hash_of_string((*ctrees_iter).second.ctree_for_hash, sha_hash); if (err == shaSuccess) { qstring dump_line = sha_hash + ";"; err = get_hash_of_string((*ctrees_iter).second.ctree_dump, sha_hash); if (err == shaSuccess) { dump_line += sha_hash + ";"; dump_line += (*ctrees_iter).second.ctree_dump; dump_line.cat_sprnt(";%d", (*ctrees_iter).second.func_depth); dump_line.cat_sprnt(";%08X", (*ctrees_iter).second.func_start); dump_line.cat_sprnt(";%08X", (*ctrees_iter).second.func_end); if (((*ctrees_iter).second.func_name.length() > crypt_prefix_len) && (crypt_prefix_len > 0) && ((*ctrees_iter).second.func_name.find(crypto_prefix) == 0)) dump_line.cat_sprnt(";E", (*ctrees_iter).second.func_end); else dump_line.cat_sprnt(";N", (*ctrees_iter).second.func_end); if (((*ctrees_iter).second.heuristic_flag)) dump_line.cat_sprnt(";H", (*ctrees_iter).second.func_end); else dump_line.cat_sprnt(";N", (*ctrees_iter).second.func_end); dump_line += "\n"; } qwrite(file_id, dump_line.c_str(), dump_line.length()); } if (err != shaSuccess) { logmsg(ERROR, "Error in computing SHA1 hash\r\n"); } } qclose(file_id); } else { logmsg(ERROR, "Failed to open file for dumping ctress\r\n"); } }
bool idaapi extract_all_types(void *ud) { logmsg(DEBUG, "extract_types()\n"); // find vtables in the binary search_objects(false); qvector <VTBL_info_t>::iterator vtbl_iter; std::map<ea_t, VTBL_info_t> vtbl_map; for (vtbl_iter = vtbl_t_list.begin(); vtbl_iter != vtbl_t_list.end(); vtbl_iter++) vtbl_map[(*vtbl_iter).ea_begin] = (*vtbl_iter); int file_id = create_open_file("types.txt"); if (file_id == -1) { logmsg(ERROR, "Failed to open file for dumping types.txt\r\n"); return false; } int struct_no = 0; for (vtbl_iter = vtbl_t_list.begin(); vtbl_iter != vtbl_t_list.end(); vtbl_iter++) { qstring info_msg; info_msg.cat_sprnt("Processing vtable %s\n", (*vtbl_iter).vtbl_name.c_str()); logmsg(DEBUG, info_msg.c_str()); qstring type_name; type_name.sprnt("struc_2_%d", struct_no); ea_t cur_vt_ea = (*vtbl_iter).ea_begin; int struct_subno = 0; qvector <qstring> types_to_merge; for (ea_t addr = get_first_dref_to(cur_vt_ea); addr != BADADDR; addr = get_next_dref_to(cur_vt_ea, addr)) { qstring name; if (get_func_name(&name, addr) <= 0) continue; qstring info_msg1; info_msg1.cat_sprnt("\t%s\n", name.c_str()); logmsg(DEBUG, info_msg1.c_str()); func_t *pfn = get_func(addr); if (!pfn) continue; hexrays_failure_t hf; cfuncptr_t cfunc = decompile(pfn, &hf); if (cfunc != NULL) { qstring var_name; info_msg.clear(); if (find_var(cfunc, (*vtbl_iter).vtbl_name, var_name)) { info_msg.cat_sprnt(" : %s\n", var_name.c_str()); logmsg(DEBUG, info_msg.c_str()); qstring sub_type_name = type_name; sub_type_name.cat_sprnt("_%d", struct_subno); struct_subno++; if (reconstruct_type(cfunc, var_name, sub_type_name)) { if (check_subtype((*vtbl_iter), sub_type_name)) { types_to_merge.push_back(sub_type_name); } } } else { info_msg.cat_sprnt(" : none\n"); logmsg(DEBUG, info_msg.c_str()); } } } struct_no++; merge_types(types_to_merge, type_name); dump_type_info(file_id, (*vtbl_iter), type_name, vtbl_map); } qclose(file_id); return true; }