Skip to content

Commit 96f3257

Browse files
committed
fix "Add VT struct" to deal with bad/mangled/duplicate names; + few minor fixes
1 parent e67a96a commit 96f3257

File tree

3 files changed

+30
-21
lines changed

3 files changed

+30
-21
lines changed

src/hrtng.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,7 @@ ACT_DEF(var_reuse)
10121012
if(vi == -1)
10131013
return 0;
10141014

1015-
types_locator_t tl(lvars, vi);
1015+
types_locator_t tl(lvars, (int)vi);
10161016
tl.apply_to(&vu->cfunc->body, NULL);
10171017
if(tl.types.size() < 2) {
10181018
msg("[hrt] There is no stack var reusing found (%s)\n", var->name.c_str());
@@ -1633,7 +1633,7 @@ ACT_DEF(recognize_shape)
16331633
}
16341634
}
16351635

1636-
offset_locator_t ifi(lvars, vi);
1636+
offset_locator_t ifi(lvars, (int)vi);
16371637
ifi.apply_to(&vu.cfunc->body, NULL);
16381638

16391639
structs_shape_t rs(offset);
@@ -1893,13 +1893,16 @@ static bool is_cast_assign(cfuncptr_t cfunc, cexpr_t * var, tinfo_t * ts)
18931893
} else if(asg->x != var)
18941894
return false;
18951895

1896-
if(ts) {
1897-
cexpr_t* y = skipCast(asg->y);
1898-
tinfo_t yType = y->type; //??? use getExpType(cfunc_t *func, cexpr_t* exp)
1899-
if(bDerefPtr)
1900-
yType = make_pointer(yType);
1896+
cexpr_t* y = skipCast(asg->y);
1897+
tinfo_t yType = y->type; //??? use getExpType(cfunc_t *func, cexpr_t* exp)
1898+
if(bDerefPtr)
1899+
yType = make_pointer(yType);
1900+
1901+
if(asg->x->type == yType)
1902+
return false;
1903+
1904+
if(ts)
19011905
*ts = yType;
1902-
}
19031906
return true;
19041907
}
19051908

@@ -5317,7 +5320,7 @@ plugmod_t*
53175320
addon.producer = "Sergey Belov and Milan Bohacek, Rolf Rolles, Takahiro Haruyama," \
53185321
" Karthik Selvaraj, Ali Rahbar, Ali Pezeshk, Elias Bachaalany, Markus Gaasedelen";
53195322
addon.url = "https://github.com/KasperskyLab/hrtng";
5320-
addon.version = "2.3.24";
5323+
addon.version = "2.3.25";
53215324
register_addon(&addon);
53225325

53235326
return PLUGIN_KEEP;

src/opt.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ bool TraceAndExtractOpsMovAndSubBy1(mblock_t* blk, mop_t*& opMov, mop_t*& opSub,
936936
return 0;
937937
}
938938
MSG_DO(("[I] call_ARITH_2const: '%s'", call->dstr()));
939-
op->make_number(res, fi->return_type.get_size());
939+
op->make_number(res, (int)fi->return_type.get_size());
940940
return 1;
941941
}
942942

@@ -986,7 +986,7 @@ bool TraceAndExtractOpsMovAndSubBy1(mblock_t* blk, mop_t*& opMov, mop_t*& opSub,
986986
if(opcode == m_ret) {
987987
if(!op)
988988
return 0;
989-
op->make_number(n, fi->return_type.get_size());
989+
op->make_number(n, (int)fi->return_type.get_size());
990990
} else {
991991
if(fi->args.size() < 1)
992992
return 0;
@@ -1001,7 +1001,7 @@ bool TraceAndExtractOpsMovAndSubBy1(mblock_t* blk, mop_t*& opMov, mop_t*& opSub,
10011001
ins->l.make_reg(reg2mreg(R_ds), 2); //FIXME: x86 specific!
10021002
} else {
10031003
ins->l = fi->args.front();
1004-
ins->r.make_number(n, fi->return_type.get_size());
1004+
ins->r.make_number(n, (int)fi->return_type.get_size());
10051005
}
10061006
ins->opcode = opcode;
10071007
}

src/structures.cpp

+15-9
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,9 @@ tid_t create_VT_struc(ea_t VT_ea, const char * basename, uval_t idx /*= BADADDR*
563563
if(has_user_name(get_flags(VT_ea))) {
564564
name_vt = get_name(VT_ea);
565565
if(name_vt.length() > 9 && !strncmp(name_vt.c_str(), "??_7", 4)) {
566+
//remove everything except main class name
566567
name_vt.remove(0, 4);
567-
name_vt.remove(name_vt.find("@@6B@"), 5); //"@@6B@" on the end may be followed by "_0" suffix
568+
name_vt = name_vt.substr(0, name_vt.find("@@6B"));
568569
}
569570
if(!strnicmp(name_vt.c_str(), "vtbl_", 5))
570571
name_vt.remove(0, 5);
@@ -593,9 +594,11 @@ tid_t create_VT_struc(ea_t VT_ea, const char * basename, uval_t idx /*= BADADDR*
593594

594595
#if IDA_SDK_VERSION < 900
595596
tid_t newid = get_struc_id(name_vt.c_str());
596-
if (newid == BADADDR)
597+
if (newid != BADADDR) {
598+
warning("[hrt] struct '%s' already exist,\n rename VTBL global name or remove/rename conflicting type and try again\n", name_vt.c_str());
599+
return BADNODE;
600+
}
597601
newid = add_struc(idx, name_vt.c_str());
598-
599602
if (newid == BADADDR) {
600603
msg("[hrt] add_struc(%d, \"%s\") failed\n", idx, name_vt.c_str());
601604
return BADNODE;
@@ -607,18 +610,21 @@ tid_t create_VT_struc(ea_t VT_ea, const char * basename, uval_t idx /*= BADADDR*
607610
set_struc_cmt(newid, struccmt.c_str(), true);
608611
#else //IDA_SDK_VERSION >= 900
609612
tid_t newid = get_named_type_tid(name_vt.c_str());
613+
if (newid != BADADDR) {
614+
warning("[hrt] type '%s' already exist,\n rename VTBL global name or remove/rename conflicting type and try again\n", name_vt.c_str());
615+
return BADNODE;
616+
}
617+
610618
tinfo_t newstruc;
611-
if (newid == BADADDR) {
612619
udt_type_data_t s;
620+
tinfo_code_t err = TERR_BAD_TYPE;
613621
s.taudt_bits |= TAUDT_UNALIGNED;
614622
s.set_vftable(true);
615-
if(!newstruc.create_udt(s) || newstruc.set_named_type(NULL, name_vt.c_str()) != TERR_OK)
616-
return BADNODE;
617-
newid = newstruc.get_tid();
618-
} else {
619-
if(!get_type_by_tid(&newstruc, newid) || !newstruc.is_decl_struct())
623+
if (!newstruc.create_udt(s) || (err = newstruc.set_named_type(NULL, name_vt.c_str())) != TERR_OK) {
624+
msg("[hrt] error %d (%s) on create vtbl stuct\n", err, tinfo_errstr(err));
620625
return BADNODE;
621626
}
627+
newid = newstruc.get_tid();
622628
newstruc.set_type_cmt(struccmt.c_str());
623629

624630
// actually set_vftable_ea is appeared in ida 7.6 but here will be used from ida9 becouse it probably depends on TAUDT_VFTABLE flag has been set few lines above

0 commit comments

Comments
 (0)