diff --git a/libIRDB/include/core/file.hpp b/libIRDB/include/core/file.hpp index e6c49d2586e2ce90420df6af82d41b24db7aed96..f6c860aa9e3bbf91f9216309ff00c2c8783f7b86 100644 --- a/libIRDB/include/core/file.hpp +++ b/libIRDB/include/core/file.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 - Zephyr Software LLC + * Copyright (c) 2014-2015 - Zephyr Software LLC * * This file may be used and modified for non-commercial purposes as long as * all copyright, permission, and nonwarranty notices are preserved. @@ -24,7 +24,7 @@ class File_t : public BaseObj_t public: // create new item. File_t(db_id_t file_id, db_id_t orig_fid, std::string url, std::string hash, std::string arch, int elfoid, - std::string atn, std::string ftn, std::string itn, std::string ibn, std::string rtn, std::string typ, db_id_t doipid); + std::string atn, std::string ftn, std::string itn, std::string icfs, std::string icfs_map, std::string rtn, std::string typ, db_id_t doipid); File_t(db_id_t file_id) : BaseObj_t(NULL) { assert(0);} // read from DB void WriteToDB() { assert(0); } // writes to DB ID is not -1. @@ -32,7 +32,9 @@ class File_t : public BaseObj_t std::string GetAddressTableName() { return address_table_name; } std::string GetFunctionTableName() { return function_table_name; } std::string GetInstructionTableName() { return instruction_table_name; } - std::string GetIBTargetsTableName() { return ibtargets_table_name; } +// xxx std::string GetIBTargetsTableName() { return ibtargets_table_name; } + std::string GetICFSTableName() { return icfs_table_name; } + std::string GetICFSMapTableName() { return icfs_map_table_name; } std::string GetRelocationsTableName() { return relocs_table_name; } std::string GetTypesTableName() { return types_table_name; } std::string GetURL() { return url; } @@ -52,7 +54,8 @@ class File_t : public BaseObj_t friend class PointerType_t; friend class AggregateType_t; friend class FuncType_t; - friend class IBTargets; + friend class ICFS_t; +// friend class IBTargets; private: db_id_t orig_fid; @@ -62,7 +65,8 @@ class File_t : public BaseObj_t std::string address_table_name; std::string function_table_name; std::string instruction_table_name; - std::string ibtargets_table_name; + std::string icfs_table_name; + std::string icfs_map_table_name; std::string relocs_table_name; std::string types_table_name; int elfoid; diff --git a/libIRDB/include/core/fileir.hpp b/libIRDB/include/core/fileir.hpp index f1e5184d4ce26d856ffc54d52f2a4db4984a6f57..c88986f2a3ba2223347edbe448dd73699f797bf8 100644 --- a/libIRDB/include/core/fileir.hpp +++ b/libIRDB/include/core/fileir.hpp @@ -22,7 +22,6 @@ typedef std::set<Function_t*> FunctionSet_t; typedef std::set<AddressID_t*> AddressSet_t; -typedef std::map<Instruction_t*, InstructionCFGNodeSet_t> IBTargetMap_t; // A variant of a problem, this // may be an original variant @@ -43,7 +42,7 @@ class FileIR_t : public BaseObj_t InstructionSet_t& GetInstructions() { return insns; } AddressSet_t& GetAddresses() { return addrs; } RelocationSet_t& GetRelocations() { return relocs; } - IBTargets& GetIBTargets() { return ibtargets; } + ICFSSet_t& GetAllICFS() { return icfs_set; } // generate the spri rules into the output file, fout. void GenerateSPRI(std::ostream &fout, bool with_ilr=false); @@ -81,7 +80,7 @@ class FileIR_t : public BaseObj_t #define ASM_REG_MAX_SIZE 500000 typedef std::map<Instruction_t*,std::string> registry_type; - typedef std::map<Instruction_t*,InstructionCFGNode_t*> ICFGNodeMap_t; +// xxx typedef std::map<Instruction_t*,InstructionCFGNode_t*> ICFGNodeMap_t; // a pointer to the original variants IR, NULL means not yet loaded. FileIR_t* orig_variant_ir_p; @@ -96,8 +95,8 @@ class FileIR_t : public BaseObj_t RelocationSet_t relocs; TypeSet_t types; VariantID_t progid; + ICFSSet_t icfs_set; File_t* fileptr; - IBTargets ibtargets; // instructions* --> target set std::map<db_id_t,AddressID_t*> ReadAddrsFromDB(); std::map<db_id_t,Function_t*> ReadFuncsFromDB @@ -108,14 +107,17 @@ class FileIR_t : public BaseObj_t std::map<db_id_t,Instruction_t*> ReadInsnsFromDB ( std::map<db_id_t,Function_t*> &funcMap, - std::map<db_id_t,AddressID_t*> &addrMap - ) ; + std::map<db_id_t,AddressID_t*> &addrMap, + std::map<db_id_t,Instruction_t*> &addressToInstructionMap, + std::map<Instruction_t*, db_id_t> &unresolvedICFS + ); void ReadRelocsFromDB ( std::map<db_id_t,Instruction_t*> &insnMap ); std::map<db_id_t, Type_t*> ReadTypesFromDB(TypeSet_t& types); - void ReadIBTargetsFromDB(std::map<db_id_t,Instruction_t*> &insnMap); + void ReadAllICFSFromDB(std::map<db_id_t,Instruction_t*> &addr2insnMap, + std::map<Instruction_t*, db_id_t> &unresolvedICFS); }; diff --git a/libIRDB/include/core/function.hpp b/libIRDB/include/core/function.hpp index 01d86a1544685973623026e83db936bc51fc4558..cfe32f719fc4ac226bff5edbda6121b2cea43fb6 100644 --- a/libIRDB/include/core/function.hpp +++ b/libIRDB/include/core/function.hpp @@ -20,8 +20,6 @@ #include "core/type.hpp" -typedef std::set<Instruction_t*> InstructionSet_t; - // The basic Function of a variant. class Function_t : public BaseObj_t { diff --git a/libIRDB/include/core/ibtargets.hpp b/libIRDB/include/core/ibtargets.hpp index dae773d658b5fe4878e03466364c0f0776a79bbb..7d2342512ec880565c95dfee8fa432294d601773 100644 --- a/libIRDB/include/core/ibtargets.hpp +++ b/libIRDB/include/core/ibtargets.hpp @@ -18,6 +18,7 @@ * */ +DEPRECATED DO NOT USE #ifndef _ibtargets_ #define _ibtargets_ diff --git a/libIRDB/include/core/instruction.hpp b/libIRDB/include/core/instruction.hpp index d85377e6ef7ffef4ea460c6e9f412981b2cfd9aa..674588b666a42c6ed47ffc2d5429dabf95b5d81e 100644 --- a/libIRDB/include/core/instruction.hpp +++ b/libIRDB/include/core/instruction.hpp @@ -38,17 +38,18 @@ class Instruction_t : public BaseObj_t db_id_t GetOriginalAddressID() const { return orig_address_id; } Instruction_t* GetFallthrough() const { return fallthrough; } Instruction_t* GetTarget() const { return target; } + ICFS_t* GetIBTargets() const { return icfs; } std::string GetDataBits() const { return data; } std::string GetCallback() const { return callback; } std::string GetComment() const { return comment; } - InstructionCFGNodeSet_t& GetIBTargets(); void SetAddress(AddressID_t* newaddr) { my_address=newaddr; } void SetFunction(Function_t* func ) { my_function=func;} void SetOriginalAddressID(db_id_t origid) { orig_address_id=origid; /* you shouldn't do this, unless you know what you're doing! */} void SetFallthrough(Instruction_t* i) { fallthrough=i; } void SetTarget(Instruction_t* i) { target=i; } + void SetIBTargets(ICFS_t *p_icfs) { icfs=p_icfs; } void SetDataBits(std::string orig) { data=orig; } void SetCallback(std::string orig) { callback=orig; } void SetComment(std::string orig) { comment=orig; } @@ -82,5 +83,5 @@ class Instruction_t : public BaseObj_t std::string comment; AddressID_t* indTarg; RelocationSet_t relocs; - InstructionCFGNodeSet_t ibtargets; // IB targets + ICFS_t* icfs; }; diff --git a/libIRDB/include/libIRDB-core.hpp b/libIRDB/include/libIRDB-core.hpp index c44f98a14de83068c21f5d05142067cb5af5ef31..85b7addd2c77be3aa9b99244b27e2e9d14b5da34 100644 --- a/libIRDB/include/libIRDB-core.hpp +++ b/libIRDB/include/libIRDB-core.hpp @@ -42,9 +42,9 @@ class Instruction_t; // forward decl for many classes #include <core/baseobj.hpp> #include <core/reloc.hpp> #include <core/address.hpp> -#include <core/instructioncfg.hpp> +// xxx #include <core/instructioncfg.hpp> +#include <core/icfs.hpp> #include <core/instruction.hpp> -#include <core/ibtargets.hpp> #include <core/file.hpp> #include <core/function.hpp> #include <core/variantid.hpp> diff --git a/libIRDB/src/core/Makefile b/libIRDB/src/core/Makefile index 93bfc5792e9855c929d2a793f63335a1480bcd9a..21680626fb0e068dd52219f8ebc1b5a771e9776e 100644 --- a/libIRDB/src/core/Makefile +++ b/libIRDB/src/core/Makefile @@ -2,7 +2,7 @@ LIB=../../lib/libIRDB-core.a -OBJS=baseobj.o type.o variantid.o pqxxdb.o dbinterface.o function.o fileir.o file.o instruction.o ibtargets.o address.o generate_spri.o +OBJS=baseobj.o type.o variantid.o pqxxdb.o dbinterface.o function.o fileir.o file.o instruction.o address.o generate_spri.o all: $(OBJS) diff --git a/libIRDB/src/core/file.cpp b/libIRDB/src/core/file.cpp index 68fadbfffebf871bbf074f63a5f417dfcb788424..bbaae5778075211c0398f948bee685cfa78c05d1 100644 --- a/libIRDB/src/core/file.cpp +++ b/libIRDB/src/core/file.cpp @@ -32,9 +32,9 @@ using namespace std; File_t::File_t(db_id_t myfile_id, db_id_t my_orig_fid, std::string myurl, std::string myhash, std::string myarch, int myoid, - std::string atn, std::string ftn, std::string itn, std::string ibn, std::string rtn, std::string typ, db_id_t mydoipid) : + std::string atn, std::string ftn, std::string itn, std::string icfs, std::string icfs_map, std::string rtn, std::string typ, db_id_t mydoipid) : BaseObj_t(NULL), url(myurl), hash(myhash), arch(myarch), elfoid(myoid), - address_table_name(atn), function_table_name(ftn), instruction_table_name(itn), ibtargets_table_name(ibn), + address_table_name(atn), function_table_name(ftn), instruction_table_name(itn), icfs_table_name(icfs), icfs_map_table_name(icfs_map), relocs_table_name(rtn), types_table_name(typ), orig_fid(my_orig_fid) { SetBaseID(myfile_id); @@ -53,7 +53,8 @@ void File_t::CreateTables() address_table_name+" "+ function_table_name+" "+ instruction_table_name+" "+ - ibtargets_table_name+" "+ + icfs_table_name+" "+ + icfs_map_table_name+" "+ relocs_table_name+" "+ types_table_name+" "+ tmpfile; diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp index 059a0c055b139b1ce73a09811d3b990c2df7f4ee..bbf9fe8c4f18780c0203f58d734ea56097d6a39a 100644 --- a/libIRDB/src/core/fileir.cpp +++ b/libIRDB/src/core/fileir.cpp @@ -95,6 +95,8 @@ FileIR_t::~FileIR_t() { delete *i; } + + // @todo: clear icfs_t } // DB operations @@ -105,9 +107,13 @@ void FileIR_t::ReadFromDB() std::map<db_id_t,Type_t*> typesMap = ReadTypesFromDB(types); std::map<db_id_t,AddressID_t*> addrMap=ReadAddrsFromDB(); std::map<db_id_t,Function_t*> funcMap=ReadFuncsFromDB(addrMap, typesMap); - std::map<db_id_t,Instruction_t*> insnMap=ReadInsnsFromDB(funcMap,addrMap); - ReadIBTargetsFromDB(insnMap); + std::map<db_id_t,Instruction_t*> addressToInstructionMap; + std::map<Instruction_t*, db_id_t> unresolvedICFS; + + std::map<db_id_t,Instruction_t*> insnMap=ReadInsnsFromDB(funcMap,addrMap,addressToInstructionMap, unresolvedICFS); + + ReadAllICFSFromDB(addressToInstructionMap, unresolvedICFS); ReadRelocsFromDB(insnMap); UpdateEntryPoints(insnMap); @@ -338,7 +344,9 @@ std::map<db_id_t,AddressID_t*> FileIR_t::ReadAddrsFromDB std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB ( std::map<db_id_t,Function_t*> &funcMap, - std::map<db_id_t,AddressID_t*> &addrMap + std::map<db_id_t,AddressID_t*> &addrMap, + std::map<db_id_t,Instruction_t*> &addressToInstructionMap, + std::map<Instruction_t*, db_id_t> &unresolvedICFS ) { std::map<db_id_t,Instruction_t*> idMap; @@ -358,6 +366,7 @@ std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB // orig_address_id integer REFERENCES #PROGNAME#_address, // fallthrough_address_id integer, // target_address_id integer, +// icfs_id integer, // data bytea, // callback text, // comment text, @@ -370,6 +379,7 @@ std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB db_id_t orig_address_id=atoi(dbintr->GetResultColumn("orig_address_id").c_str()); db_id_t fallthrough_address_id=atoi(dbintr->GetResultColumn("fallthrough_address_id").c_str()); db_id_t targ_address_id=atoi(dbintr->GetResultColumn("target_address_id").c_str()); + db_id_t icfs_id=atoi(dbintr->GetResultColumn("icfs_id").c_str()); std::string data=(dbintr->GetResultColumn("data")); std::string callback=(dbintr->GetResultColumn("callback")); std::string comment=(dbintr->GetResultColumn("comment")); @@ -397,8 +407,20 @@ std::map<db_id_t,Instruction_t*> FileIR_t::ReadInsnsFromDB fallthroughs[instruction_id]=fallthrough_address_id; targets[instruction_id]=targ_address_id; + addressToInstructionMap[aid] = newinsn; insns.insert(newinsn); + if (icfs_id == NOT_IN_DATABASE) + { + newinsn->SetIBTargets(NULL); + } + else + { + // keep track of instructions for which we have not yet + // resolved the ICFS + unresolvedICFS[newinsn] = icfs_id; + } + dbintr->MoveToNextRow(); } @@ -457,7 +479,8 @@ void FileIR_t::WriteToDB() db_id_t j=-1; dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->instruction_table_name + string(" cascade;")); - dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->ibtargets_table_name + string(" cascade;")); + dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->icfs_table_name + string(" cascade;")); + dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->icfs_map_table_name + string(" cascade;")); dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->function_table_name + string(" cascade;")); dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->address_table_name + string(" cascade;")); dbintr->IssueQuery(string("TRUNCATE TABLE ")+ fileptr->relocs_table_name + string(" cascade;")); @@ -572,8 +595,10 @@ void FileIR_t::WriteToDB() } dbintr->IssueQuery(q); - q = string(""); - q = ibtargets.WriteToDB(fileptr); +/* xxx + xxxq = string(""); + xxxq = ibtargets.WriteToDB(fileptr); +*/ dbintr->IssueQuery(q); } @@ -879,6 +904,74 @@ std::map<db_id_t, Type_t*> FileIR_t::ReadTypesFromDB (TypeSet_t& types) return tMap; } +void FileIR_t::ReadAllICFSFromDB(std::map<db_id_t,Instruction_t*> &addr2instMap, + std::map<Instruction_t*, db_id_t> &unresolvedICFS) +{ + std::map<db_id_t, ICFS_t*> icfsMap; + + // retrieve all sets + std::string q= "select * from " + fileptr->icfs_table_name + " ; "; + dbintr->IssueQuery(q); + + while(!dbintr->IsDone()) + { + db_id_t icfs_id = atoi(dbintr->GetResultColumn("icfs_id").c_str()); + bool isComplete=false; + string isCompleteString=dbintr->GetResultColumn("is_complete"); + const char *isCompletestr=isCompleteString.c_str(); + if (isCompleteString.size() > 0) + { + if (isCompletestr[0] == 't' || isCompletestr[0] == 'T' || isCompletestr[0] == '1' || isCompletestr[0] == 'y' || isCompletestr[0] == 'Y') + isComplete = true; + } + + ICFS_t* icfs = new ICFS_t(icfs_id, isComplete); + GetAllICFS().insert(icfs); + + icfsMap[icfs_id] = icfs; + } + + ICFSSet_t all_icfs = GetAllICFS(); + + // for each set, populate its members + for (ICFSSet_t::iterator it = all_icfs.begin(); it != all_icfs.end(); ++it) + { + char query2[2048]; + ICFS_t *icfs = *it; + assert(icfs); + int icfsid = icfs->GetBaseID(); + sprintf(query2,"select * from %s WHERE icfs_id = %d;", fileptr->icfs_map_table_name.c_str(), icfsid); + dbintr->IssueQuery(query2); + while(!dbintr->IsDone()) + { + db_id_t address_id = atoi(dbintr->GetResultColumn("address_id").c_str()); + Instruction_t* instruction = addr2instMap[address_id]; + if (instruction) + icfs->insert(instruction); + // @todo: handle cross-file addresses + // these are allowed by the DB schema but we don't yet handle them + // if we encounter an unresolved address, we should mark the ICFS + // as unresolved + } + } + + // backpatch all unresolved instruction -> ICFS + std::map<Instruction_t*, db_id_t>::iterator uit; + for (std::map<Instruction_t*, db_id_t>::iterator uit = unresolvedICFS.begin(); uit != unresolvedICFS.end(); ++uit) + { + Instruction_t* unresolved = uit->first; + db_id_t icfs_id = uit->second; + + assert(unresolved); + + ICFS_t *icfs = icfsMap[icfs_id]; + assert(icfs); + + unresolved->SetIBTargets(icfs); + } +} + +/* void FileIR_t::ReadIBTargetsFromDB(std::map<db_id_t,Instruction_t*> &insnMap) { std::string q= "select * from " + fileptr->ibtargets_table_name + " ; "; @@ -912,3 +1005,4 @@ void FileIR_t::ReadIBTargetsFromDB(std::map<db_id_t,Instruction_t*> &insnMap) dbintr->MoveToNextRow(); } } +*/ diff --git a/libIRDB/src/core/ibtargets.cpp b/libIRDB/src/core/ibtargets.cpp index 5173a938ff0854b5837924c287888fb64b386ff4..19141a66f6ca7a6738d88fb23c30b1b475703152 100644 --- a/libIRDB/src/core/ibtargets.cpp +++ b/libIRDB/src/core/ibtargets.cpp @@ -18,6 +18,7 @@ * */ +#ifdef DEPRECATED #include <all.hpp> #include <core/ibtargets.hpp> #include <utils.hpp> @@ -188,3 +189,4 @@ const string IBTargets::toString() return ss.str(); } +#endif diff --git a/libIRDB/src/core/instruction.cpp b/libIRDB/src/core/instruction.cpp index 9a8a02d4e01dbc627d3ba5cf22ff7f4fa65d1520..48a030e4deb22ae1df620a93fafececfab0220eb 100644 --- a/libIRDB/src/core/instruction.cpp +++ b/libIRDB/src/core/instruction.cpp @@ -42,6 +42,7 @@ Instruction_t::Instruction_t() : fallthrough=NULL; target=NULL; indTarg=NULL; + icfs=NULL; } Instruction_t::Instruction_t(db_id_t id, @@ -66,6 +67,7 @@ Instruction_t::Instruction_t(db_id_t id, orig_address_id=orig_id; fallthrough=NULL; target=NULL; + icfs=NULL; } int Instruction_t::Disassemble(DISASM &disasm) const @@ -173,6 +175,10 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader) if(target) targ_id=target->GetBaseID(); + db_id_t icfs_id=NOT_IN_DATABASE; + if (icfs) + icfs_id=icfs->GetBaseID(); + db_id_t indirect_bt_id=NOT_IN_DATABASE; if(indTarg) indirect_bt_id=indTarg->GetBaseID(); @@ -181,7 +187,7 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader) if (p_withHeader) q = string("insert into ")+fid->instruction_table_name + - string(" (instruction_id, address_id, parent_function_id, orig_address_id, fallthrough_address_id, target_address_id, data, callback, comment, ind_target_address_id, doip_id) VALUES "); + string(" (instruction_id, address_id, parent_function_id, orig_address_id, fallthrough_address_id, target_address_id, icfs_id, data, callback, comment, ind_target_address_id, doip_id) VALUES "); else q = ","; @@ -196,6 +202,7 @@ string Instruction_t::WriteToDB(File_t *fid, db_id_t newid, bool p_withHeader) string("'") + to_string(orig_address_id) + string("', ") + string("'") + to_string(ft_id) + string("', ") + string("'") + to_string(targ_id) + string("', ") + + string("'") + to_string(icfs_id) + string("', ") + string("decode('") + hex_data.str() + string("', 'hex'), ") + string("'") + callback + string("', ") + string("'") + comment + string("', ") + @@ -261,8 +268,3 @@ bool Instruction_t::SetsStackPointer(DISASM* disasm) return false; } - -InstructionCFGNodeSet_t& Instruction_t::GetIBTargets() -{ - return ibtargets; -} diff --git a/libIRDB/src/core/variantid.cpp b/libIRDB/src/core/variantid.cpp index 332744b3936a834314a8cc1adcba2e2a37790ab7..b37c7e2f513c55f4107d8e31e864c348a0a22c75 100644 --- a/libIRDB/src/core/variantid.cpp +++ b/libIRDB/src/core/variantid.cpp @@ -185,7 +185,8 @@ File_t* VariantID_t::CloneFile(File_t* fptr) std::string atn="atnfid"+to_string(newfid); std::string ftn="ftnfid"+to_string(newfid); std::string itn="itnfid"+to_string(newfid); - std::string ibn="ibnfid"+to_string(newfid); + std::string icfs="icfsfid"+to_string(newfid); + std::string icfsmap="icfsmapfid"+to_string(newfid); std::string rtn="rtnfid"+to_string(newfid); std::string typ="typfid"+to_string(newfid); @@ -195,8 +196,10 @@ File_t* VariantID_t::CloneFile(File_t* fptr) q+=ftn; q+="', instruction_table_name='"; q+=itn; - q+="', ibtargets_table_name='"; - q+=ibn; + q+="', icfs_table_name='"; + q+=icfs; + q+="', icfs_map_table_name='"; + q+=icfsmap; q+="', relocs_table_name='"; q+=rtn; q+="', types_table_name='"; @@ -207,8 +210,7 @@ File_t* VariantID_t::CloneFile(File_t* fptr) dbintr->IssueQuery(q); - File_t* newfile=new File_t(newfid, fptr->orig_fid, fptr->url, fptr->hash, fptr->arch, fptr->elfoid, - atn, ftn, itn, ibn, rtn, typ, fptr->GetDoipID()); + File_t* newfile=new File_t(newfid, fptr->orig_fid, fptr->url, fptr->hash, fptr->arch, fptr->elfoid, atn, ftn, itn, icfs, icfsmap, rtn, typ, fptr->GetDoipID()); newfile->CreateTables(); @@ -219,7 +221,12 @@ File_t* VariantID_t::CloneFile(File_t* fptr) dbintr->IssueQuery(q); q="drop table "; - q+=ibn; + q+=icfs; + q+=" ; "; + dbintr->IssueQuery(q); + + q="drop table "; + q+=icfsmap; q+=" ; "; dbintr->IssueQuery(q); @@ -259,9 +266,16 @@ File_t* VariantID_t::CloneFile(File_t* fptr) dbintr->IssueQuery(q); q="select * into "; - q+=ibn; + q+=icfs; + q+=" from "; + q+=fptr->icfs_table_name; + q+=" ;"; + dbintr->IssueQuery(q); + + q="select * into "; + q+=icfsmap; q+=" from "; - q+=fptr->ibtargets_table_name; + q+=fptr->icfs_map_table_name; q+=" ;"; dbintr->IssueQuery(q); @@ -367,7 +381,7 @@ File_t* VariantID_t::GetMainFile() const void VariantID_t::ReadFilesFromDB() { - std::string q= "select file_info.orig_file_id, file_info.address_table_name, file_info.instruction_table_name, file_info.ibtargets_table_name," + std::string q= "select file_info.orig_file_id, file_info.address_table_name, file_info.instruction_table_name, file_info.icfs_table_name,file_info.icfs_map_table_name," " file_info.function_table_name, file_info.relocs_table_name, file_info.types_table_name, file_info.file_id, file_info.url, file_info.hash," " file_info.arch, file_info.type, file_info.elfoid, file_info.doip_id " " from file_info,variant_dependency " @@ -390,12 +404,13 @@ void VariantID_t::ReadFilesFromDB() std::string atn=(BaseObj_t::dbintr->GetResultColumn("address_table_name")); std::string ftn=(BaseObj_t::dbintr->GetResultColumn("function_table_name")); std::string itn=(BaseObj_t::dbintr->GetResultColumn("instruction_table_name")); - std::string ibn=(BaseObj_t::dbintr->GetResultColumn("ibtargets_table_name")); + std::string icfs=(BaseObj_t::dbintr->GetResultColumn("icfs_table_name")); + std::string icfs_map=(BaseObj_t::dbintr->GetResultColumn("icfs_map_table_name")); std::string rtn=(BaseObj_t::dbintr->GetResultColumn("relocs_table_name")); std::string typ=(BaseObj_t::dbintr->GetResultColumn("types_table_name")); - File_t *newfile=new File_t(file_id,orig_fid,url,hash,type,oid,atn,ftn,itn,ibn, rtn,typ,doipid); + File_t *newfile=new File_t(file_id,orig_fid,url,hash,type,oid,atn,ftn,itn,icfs,icfs_map,rtn,typ,doipid); std::cout<<"Found file "<<file_id<<"."<<std::endl; std::cout<<" atn: " << atn << " ftn: " << ftn << " rtn: " << rtn << " typ: " << typ << std::endl; diff --git a/libIRDB/test/fill_in_indtargs.cpp b/libIRDB/test/fill_in_indtargs.cpp index a961c8b75579bb159fe0b1622136e793ac7d50b8..75ca30c7516ad59735196fb7d0bf6524a3823c49 100644 --- a/libIRDB/test/fill_in_indtargs.cpp +++ b/libIRDB/test/fill_in_indtargs.cpp @@ -234,7 +234,8 @@ void mark_jmptables(FileIR_t *firp) assert(instr && ibtarget); - firp->GetIBTargets().AddTarget(instr, ibtarget); + assert(0); // XXX wip +// firp->GetIBTargets().AddTarget(instr, ibtarget); } } } @@ -1035,7 +1036,8 @@ void check_for_indirect_jmps(FileIR_t* firp, Instruction_t* insn) if (getenv("IB_VERBOSE")) cout << insn->getDisassembly() << " is an indirect call, assign to DEFAULT HELNNODE" << endl; - firp->GetIBTargets().AddHellnodeTarget(insn, DEFAULT_ICFG_HELLNODE); + assert(0); +// firp->GetIBTargets().AddHellnodeTarget(insn, DEFAULT_ICFG_HELLNODE); } void check_for_indirect_calls(FileIR_t* firp, Instruction_t* insn) @@ -1054,7 +1056,8 @@ void check_for_indirect_calls(FileIR_t* firp, Instruction_t* insn) if (getenv("IB_VERBOSE")) cout << insn->getDisassembly() << " is an indirect call, assign to CALL HELNNODE" << endl; - firp->GetIBTargets().AddHellnodeTarget(insn, CALL_ICFG_HELLNODE); +// firp->GetIBTargets().AddHellnodeTarget(insn, CALL_ICFG_HELLNODE); + assert(0); } @@ -1188,10 +1191,13 @@ void fill_in_indtargs(FileIR_t* firp, elfio* elfiop) mark_jmptables(firp); +/* +xxx XXX wip if(getenv("IB_VERBOSE")!=NULL) { cout << firp->GetIBTargets().toString() << endl; } + */ } diff --git a/libIRDB/test/fix_calls.cpp b/libIRDB/test/fix_calls.cpp index ea1b07918d641378073d435f20074b53074ede81..c44762bae068ce0fa93b3cf1b98d081a2e18e5e9 100644 --- a/libIRDB/test/fix_calls.cpp +++ b/libIRDB/test/fix_calls.cpp @@ -459,28 +459,9 @@ void fix_call(Instruction_t* insn, FileIR_t *firp) callinsn->SetFunction(insn->GetFunction()); callinsn->SetComment(insn->GetComment()+" Jump part"); - // handle IB targets - // insn is the old call instruction - // callinsn is the jmp part of the push/jump - InstructionCFGNodeSet_t nodes = insn->GetIBTargets(); - InstructionCFGNodeSet_t::iterator it; - for (it = nodes.begin(); it != nodes.end(); ++it) - { - InstructionCFGNode_t *node = *it; - if (node->IsHellnode()) - { - firp->GetIBTargets().AddHellnodeTarget(callinsn, node->GetHellnodeType()); - firp->GetIBTargets().RemoveHellnodeTarget(insn, node->GetHellnodeType()); - } - else - { - firp->GetIBTargets().AddTarget(callinsn, node->GetInstruction()); - firp->GetIBTargets().RemoveTarget(insn, node); - } - } - - // complete remove from map - firp->GetIBTargets().Remove(insn); + /* handle ib targets */ + callinsn->SetIBTargets(insn->GetIBTargets()); + insn->SetIBTargets(NULL); // We need the control transfer instruction to be from the orig program because // if for some reason it's fallthrough/target isn't in the DB, we need to correctly @@ -535,7 +516,6 @@ void fix_call(Instruction_t* insn, FileIR_t *firp) insn->GetRelocations().insert(reloc); firp->GetRelocations().insert(reloc); - /* If the fallthrough is not marked as indirectly branchable-to, then mark it so */ if(newindirtarg && !newindirtarg->GetIndirectBranchTargetAddress()) { @@ -545,7 +525,7 @@ void fix_call(Instruction_t* insn, FileIR_t *firp) newaddr->SetFileID(newindirtarg->GetAddress()->GetFileID()); newaddr->SetVirtualOffset(newindirtarg->GetAddress()->GetVirtualOffset()); - /* set the insturction and include this address in the list of addrs */ + /* set the instruction and include this address in the list of addrs */ newindirtarg->SetIndirectBranchTargetAddress(newaddr); firp->GetAddresses().insert(newaddr); } @@ -871,8 +851,6 @@ main(int argc, char* argv[]) fix_other_pcrel(firp); firp->WriteToDB(); - cout << firp->GetIBTargets().toString() << endl; - cout<<"Done!"<<endl; delete firp; diff --git a/libIRDB/test/read_variantir.cpp b/libIRDB/test/read_variantir.cpp index c62696554acfd4fdab35534614dc3984ad7c51b0..d2ff4c826313c659c40b0685205f175f62555e30 100644 --- a/libIRDB/test/read_variantir.cpp +++ b/libIRDB/test/read_variantir.cpp @@ -71,22 +71,19 @@ main(int argc, char* argv[]) { Instruction_t* insn=*it; cout<<"Found insn at addr:" << std::hex << insn->GetAddress()->GetVirtualOffset() << " " << insn->getDisassembly() << endl; - InstructionCFGNodeSet_t ibtargets = insn->GetIBTargets(); - InstructionCFGNodeSet_t::iterator ibtargets_it; + ICFS_t* ibtargets = insn->GetIBTargets(); + if (!ibtargets) continue; - for (ibtargets_it = ibtargets.begin(); ibtargets_it != ibtargets.end(); ++ibtargets_it) + ICFS_t::iterator ibtargets_it; + + for (ibtargets_it = ibtargets->begin(); ibtargets_it != ibtargets->end(); ++ibtargets_it) { - InstructionCFGNode_t *node = *ibtargets_it; - assert(node); - if (node->IsHellnode()) - cout<<" indirect branch target: hellnode" << std::endl; - else - cout<<" indirect branch target: " << std::hex << node->GetInstruction()->GetAddress()->GetVirtualOffset() << dec << endl; + Instruction_t* insn = *ibtargets_it; + assert(insn); + cout<<" indirect branch target: " << std::hex << insn->GetAddress()->GetVirtualOffset() << dec << endl; } } - cout << firp->GetIBTargets().toString() << endl; - delete firp; } delete pidp;