Пример #1
0
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;
        }
      }
    }
  }
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
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;
  }
}