From ada7337cf5b48331717644f54047d76cf8a97341 Mon Sep 17 00:00:00 2001 From: jdh8d <jdh8d@git.zephyr-software.com> Date: Tue, 27 Jan 2015 23:56:44 +0000 Subject: [PATCH] forgot new files. --- .gitattributes | 1 + src/nonce_relocs.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/nonce_relocs.cpp diff --git a/.gitattributes b/.gitattributes index c4a0da4..0d5afd2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -49,6 +49,7 @@ include/zipr_stats.h -text src/Makefile -text src/main.cpp -text src/memory_space.cpp -text +src/nonce_relocs.cpp -text src/zipr.cpp -text src/zipr_options.cpp -text src/zipr_stats.cpp -text diff --git a/src/nonce_relocs.cpp b/src/nonce_relocs.cpp new file mode 100644 index 0000000..6865800 --- /dev/null +++ b/src/nonce_relocs.cpp @@ -0,0 +1,94 @@ + +#include <zipr_all.h> +#include <string> + +using namespace libIRDB; +using namespace std; +using namespace zipr; +using namespace ELFIO; + + +bool NonceRelocs_t::IsNonceRelocation(Relocation_t& reloc) +{ + if(strstr(reloc.GetType().c_str(),"cfi_nonce=")==NULL) + return false; + return true; +} + + +int NonceRelocs_t::GetNonceValue(Relocation_t& reloc) +{ + int value=0; + size_t loc=reloc.GetType().find('='); + + // get the tail of the string starting a position "loc" + string nonce_value=reloc.GetType().substr(loc,reloc.GetType().size()-loc); + + return (int)strtol(nonce_value.c_str(),0,16); +} + +int NonceRelocs_t::GetNonceSize(Relocation_t& reloc) +{ + int size=-reloc.GetOffset(); + return size; +} + +void NonceRelocs_t::HandleNonceRelocation(Instruction_t &insn, Relocation_t& reloc) +{ + int size=GetNonceSize(reloc); + int value=GetNonceValue(reloc); + + assert(insn.GetIndirectBranchTargetAddress()); + RangeAddress_t addr=insn.GetIndirectBranchTargetAddress()->GetVirtualOffset()-size; + + + if(!m_memory_space.AreBytesFree(addr,size)) + { + cout<<"Cannot insert nonce at "<<std::hex<<addr<<" because memory is already busy"<<endl; + slow_path_nonces.insert(&insn); + } + + // for each byte of the nonce, plop down the values + cout<<"Plopping nonce "<<std::hex<<value<<" at "<<std::hex<<addr<<endl; + for(int i=0;i<size;i++) + { + m_memory_space.PlopByte(addr+i,value&0xff); + value=value>>8; + } + + // plop bytes for nonce into exe + +} + +void NonceRelocs_t::HandleNonceRelocs() +{ + int handled=0; + int insns=0; + int relocs=0; + // for each instruction + InstructionSet_t::iterator iit; + for(iit=m_firp.GetInstructions().begin(); iit!=m_firp.GetInstructions().end(); ++iit) + { + Instruction_t& insn=*(*iit); + insns++; + + // for each relocation on this instruction + RelocationSet_t::iterator rit; + for( rit=insn.GetRelocations().begin(); rit!=insn.GetRelocations().end(); ++rit) + { + relocs++; + Relocation_t& reloc=*(*rit); + if(IsNonceRelocation(reloc)) + { + HandleNonceRelocation(insn,reloc); + handled++; + } + } + } + cout<<"#ATTRIBUTE nonce_references="<< std::dec<<handled<<endl; + cout<<"#ATTRIBUTE relocations="<< std::dec<<handled<<endl; + cout<<"#ATTRIBUTE instructions="<< std::dec<<handled<<endl; + cout<<"#ATTRIBUTE slow_path_nonces="<< std::dec<<slow_path_nonces.size()<<endl; + +} + -- GitLab