void StrucCmp::add_all_members(void) throw() { if(m_struc_id != BADNODE) { struc_t *sptr = get_struc(m_struc_id); ssize_t const struc_len = get_struc_name(m_struc_id, NULL, 0); for(size_t idx = 0; idx < sptr->memqty; ++idx) { member_t *mptr = &(sptr->members[idx]); // get_member_name crashes when given a NULL pointer... // we need to get the "struct.field" name and // substract the "struct." part // len is without the '\0' character ssize_t len = get_member_fullname(mptr->id, NULL, 0); if(len != -1) { len -= struc_len; char *buf = static_cast<char *>(qalloc(len)); if(buf != NULL) { get_member_name(mptr->id, buf, len); m_members[buf] = m_is_union ? 0 : mptr->soff; } } } } }
bool idaapi reconstruct_type(void *ud) { vdui_t &vu = *(vdui_t *)ud; // Determine the ctree item to highlight vu.get_current_item(USE_KEYBOARD); citem_t *highlight = vu.item.is_citem() ? vu.item.e : NULL; // highlight == NULL might happen if one chooses variable at local variables declaration statement if(highlight != NULL) { // the chosen item must be an expression and of 'variable' type if(highlight->is_expr() && (highlight->op == cot_var)) { cexpr_t *highl_expr = (cexpr_t *)highlight; // initialize type rebuilder type_builder_t type_bldr; type_bldr.highl_expr = highl_expr; highl_expr->print1(type_bldr.highl_expr_name, MAXSTR, NULL); tag_remove(type_bldr.highl_expr_name, type_bldr.highl_expr_name, 0); // traverse the ctree structure type_bldr.apply_to(&vu.cfunc->body, NULL); tid_t struct_type_id = type_bldr.get_structure(NULL); if(struct_type_id != 0 || struct_type_id != -1) { qstring struct_name; struct_name = get_struc_name(struct_type_id); va_list va; va_end(va); char * type_name = vaskstr(0, struct_name.c_str(), "Enter type name", va); if(type_name != NULL) { set_struc_name(struct_type_id, type_name); // get the structure description char buffr[MAXSTR*10]; type_bldr.get_structure(type_name, buffr, sizeof(buffr)); msg("%s", buffr); } } } } else { msg("Invalid item is choosen"); } return true; }
char * idaapi matched_structs::get_type_line(void *obj, uint32 n, char *buf) { matched_structs & ms = *(matched_structs*)obj; if (n==0) qstpncpy( buf, "type", MAXSTR ); else { qstring name; ; tid_t id = ms.idcka[n-1]; struc_t * struc = get_struc(id); if (struc) get_struc_name(&name, id); //asize_t size = get_struc_size(id); qsnprintf(buf, MAXSTR, "%s", name.c_str()); } return buf; }
std::vector<IDAStructure> GetStructsFromDb() { std::vector<IDAStructure> structures; constexpr size_t bufferSize = 256; std::array<char, bufferSize> buffer; for (auto i = get_first_struc_idx(); i != -1; i = get_next_struc_idx(i)) { IDAStructure newStruct; const struc_t* idaStruct = get_struc(get_struc_by_idx(i)); get_struc_name(idaStruct->id, buffer.data(), bufferSize); newStruct.m_name = std::string(buffer.data()); get_struc_cmt(idaStruct->id, true, buffer.data(), bufferSize); newStruct.m_comment = std::string(buffer.data()); newStruct.m_size = get_struc_size(idaStruct->id); msg("Struct %d = %s (%s) [%d bytes]\n", i, newStruct.m_name.c_str(), newStruct.m_comment.c_str(), newStruct.m_size); size_t offset = 0; member_t* idaStructMember = get_member(idaStruct, offset); while (idaStructMember != nullptr) { IDAStructure::Member newMember; get_member_fullname(idaStructMember->id, buffer.data(), bufferSize); newMember.m_name = std::string(buffer.data()); { tinfo_t typeInfo; get_member_tinfo2(idaStructMember, &typeInfo); qstring typeName; if (typeInfo.get_type_name(&typeName)) { newMember.m_type = std::string(typeName.c_str()); } else { newMember.m_type = "undefined"; } } get_member_cmt(idaStructMember->id, true, buffer.data(), bufferSize); newMember.m_comment = std::string(buffer.data()); newMember.m_size = get_member_size(idaStructMember); offset += newMember.m_size; msg(" %s {%s} (%s) [%d bytes]\n", newMember.m_name.c_str(), newMember.m_type.c_str(), newMember.m_comment.c_str(), newMember.m_size); newStruct.m_members.push_back(std::move(newMember)); idaStructMember = get_member(idaStruct, offset); } structures.push_back(std::move(newStruct)); } return std::move(structures); }
void enum_members2(struc_t *st) { char buf[MAXSTR]; type_t type[MAXSTR] = {0}; int gap_cnt = 1; asize_t ofs = 0, gapend = BADADDR, gapstart = BADADDR; for (size_t i=0;i<st->memqty;i++) { member_t &mem = st->members[i]; // unexpected beginning of member? if (mem.soff != ofs) { // msg("gap detected @ %a!\n", ofs); gapstart = ofs; } if (gapstart != BADADDR) { gapend = mem.soff; msg("char pad%d[%d]\n", gap_cnt, gapend - gapstart); //msg("gap size=%a\n", gapend - gapstart); gapend = gapstart = BADADDR; gap_cnt++; } typeinfo_t mem_ti; retrieve_member_info(&mem, &mem_ti); // data type size of member asize_t dt_mem_size = get_data_type_size(mem.flag, &mem_ti); // member size asize_t mem_size = get_member_size(&mem); // get the member's name get_member_name(mem.id, buf, sizeof(buf)); char dtype[MAXSTR]; char arraystr[MAXSTR]; char typemod[10]; arraystr[0] = 0; typemod[0] = 0; if (isWord(mem.flag)) strcpy(dtype, "unsigned short"); else if (isDwrd(mem.flag)) strcpy(dtype, "unsigned long"); else if (isByte(mem.flag)) strcpy(dtype, "char"); else if (isStruct(mem.flag)) { struc_t *nested_st = get_sptr(&mem); get_struc_name(nested_st->id, dtype, MAXSTR); } else strcpy(dtype, "user_type"); if (isOff0(mem.flag)) { strcpy(typemod, "*"); } if (isEnum0(mem.flag)) { get_enum_name(mem_ti.ec.tid, dtype, sizeof(dtype)); } asize_t ar_size = mem_size / dt_mem_size; // an array? if (ar_size > 1) { sprintf(arraystr, "[%d]", ar_size); } char out[100]; sprintf(out, "%s " /* type */ "%s" /* typemodif */ "%s" /* varname */ "%s" /*array*/ ";", dtype, typemod, buf, arraystr); msg("%s\n", out); /* inline bool idaapi isByte (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_BYTE; } inline bool idaapi isWord (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_WORD; } inline bool idaapi isDwrd (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_DWRD; } inline bool idaapi isQwrd (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_QWRD; } inline bool idaapi isOwrd (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_OWRD; } inline bool idaapi isTbyt (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_TBYT; } inline bool idaapi isFloat (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_FLOAT; } inline bool idaapi isDouble(flags_t F) { return isData(F) && (F & DT_TYPE) == FF_DOUBLE; } inline bool idaapi isPackReal(flags_t F) { return isData(F) && (F & DT_TYPE) == FF_PACKREAL; } inline bool idaapi isASCII (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_ASCI; } inline bool idaapi isStruct(flags_t F) { return isData(F) && (F & DT_TYPE) == FF_STRU; } inline bool idaapi is3byte (flags_t F) { return isData(F) && (F & DT_TYPE) == FF_3BYTE; } */ /* msg("member[%d], name=%s; %a-%a ; id=%d; flags=%x type=%s dt_mem_size=%a mem_size=%a\n", i, buf, mem.soff, mem.eoff, mem.id, mem.flag, type, dt_mem_size, mem_size); */ // we expect next member to begin @ end of last member ofs = mem.eoff; } }