diff --git a/.gitattributes b/.gitattributes index 01d43119f5eb5087ec441621d58d9542b0bf2812..782ca106c0c9c87a4046e5ea05597901dc6a5c7d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,3 +9,7 @@ /set_ida_server -text /start_dev.sh -text /svn.externals.uva_dev -text +zipr_large_only_plugin/SConscript -text +zipr_large_only_plugin/SConstruct -text +zipr_large_only_plugin/large_only.cpp -text +zipr_large_only_plugin/large_only.h -text diff --git a/zipr_large_only_plugin/SConscript b/zipr_large_only_plugin/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..ead2f591912a9235bf11f0508be65f20888292c7 --- /dev/null +++ b/zipr_large_only_plugin/SConscript @@ -0,0 +1,59 @@ +import shutil +import os +import tarfile + +Import('env') + + +#print 'env=' +#print env.Dump() + + + +myenv=env +myenv.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) +myenv.Replace(ZIPR_HOME=os.environ['ZIPR_HOME']) +myenv.Replace(ZIPR_SDK=os.environ['ZIPR_SDK']) +myenv.Replace(ZIPR_INSTALL=os.environ['ZIPR_INSTALL']) +myenv.Replace(do_cgc=ARGUMENTS.get("do_cgc",0)) + +if 'do_cgc' in env and int(env['do_cgc']) == 1: + myenv.Append(CFLAGS=" -DCGC ") + myenv.Append(CCFLAGS=" -DCGC ") + + + + +files= ''' + large_only.cpp + ''' + +# ELFIO needs to be first so we get the zipr version instead of the sectrans version. the zipr version is modified to include get_offset. +cpppath=''' + . + $ZIPR_HOME/third_party/ELFIO/elfio-2.2 + $SECURITY_TRANSFORMS_HOME/include/ + $SECURITY_TRANSFORMS_HOME/libIRDB/include/ + $SECURITY_TRANSFORMS_HOME/beaengine/include + $SECURITY_TRANSFORMS_HOME/beaengine/beaengineSources/Includes/ + $SECURITY_TRANSFORMS_HOME/tools/transforms + $ZIPR_HOME/include/ + $ZIPR_SDK/include/ + ''' + +libs=''' + ''' + +libpath=''' + $SECURITY_TRANSFORMS_HOME/lib + ''' + +myenv.Append(CCFLAGS=" -Wall ") + +myenv=myenv.Clone(CPPPATH=Split(cpppath), LIBS=Split(libs), LIBPATH=Split(libpath), SHLIBSUFFIX=".zpi", SHLIBPREFIX="") +lib=myenv.SharedLibrary("large_only", Split(files)) + +install=myenv.Install("$ZIPR_INSTALL/plugins/", lib) +Default(install) + + diff --git a/zipr_large_only_plugin/SConstruct b/zipr_large_only_plugin/SConstruct new file mode 100644 index 0000000000000000000000000000000000000000..1ef882f0096ade9642ce7c8a6816abe206a54352 --- /dev/null +++ b/zipr_large_only_plugin/SConstruct @@ -0,0 +1,55 @@ +import os +import sys + + +env=Environment() + +# default build options +env.Replace(CFLAGS="-fPIC -w ") +env.Replace(CXXFLAGS="-fPIC -w ") +env.Replace(LINKFLAGS="-fPIC ") + +# parse arguments +env.Replace(SECURITY_TRANSFORMS_HOME=os.environ['SECURITY_TRANSFORMS_HOME']) +env.Replace(ZIPR_HOME=os.environ['ZIPR_HOME']) +env.Replace(ZIPR_INSTALL=os.environ['ZIPR_INSTALL']) +env.Replace(ZIPR_SDK=os.environ['ZIPR_SDK']) +env.Replace(debug=ARGUMENTS.get("debug",0)) +env.Replace(do_64bit_build=ARGUMENTS.get("do_64bit_build",0)) + + +if int(env['debug']) == 1: + print "Setting debug mode" + env.Append(CFLAGS=" -g") + env.Append(CXXFLAGS=" -g") + env.Append(LINKFLAGS=" -g") +else: + print "Setting release mode" + env.Append(CFLAGS=" -O3") + env.Append(CXXFLAGS=" -O3") + env.Append(LINKFLAGS=" -O3") +#env.Append(CXXFLAGS=" -std=c++0x") + +# set 32/64 bit build properly +#print "env[64bit]="+str(env['do_64bit_build']) +#if env['do_64bit_build'] is None: +# print 'Defaulting to default compilation size.' +#elif int(env['do_64bit_build']) == 1: +# print 'Using 64-bit compilation size.' +# env.Append(CFLAGS=" -m64") +# env.Append(CXXFLAGS=" -m64") +# env.Append(LINKFLAGS=" -m64") +# env.Append(SHLINKFLAGS=" -m64") +#else: +# print 'Using 32-bit compilation size.' +# env.Append(CFLAGS=" -m32") +# env.Append(CXXFLAGS=" -m32") +# env.Append(LINKFLAGS=" -m32") +# env.Append(SHLINKFLAGS=" -m32") + +env['build_appfw']=0 +env['build_tools']=0 + +Export('env') +SConscript("SConscript", variant_dir='build') + diff --git a/zipr_large_only_plugin/large_only.cpp b/zipr_large_only_plugin/large_only.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f033db0166af8c2aeae55463eed172f3e60e7d4e --- /dev/null +++ b/zipr_large_only_plugin/large_only.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + * Copyright (c) 2014 Zephyr Software LLC. All rights reserved. + * + * This software is furnished under a license and/or other restrictive + * terms and may be used and copied only in accordance with such terms + * and the inclusion of the above copyright notice. This software or + * any other copies thereof may not be provided or otherwise made + * available to any other person without the express written consent + * of an authorized representative of Zephyr Software LCC. Title to, + * ownership of, and all rights in the software is retained by + * Zephyr Software LCC. + * + * Zephyr Software LLC. Proprietary Information + * + * Unless otherwise specified, the information contained in this + * directory, following this legend, and/or referenced herein is + * Zephyr Software LLC. (Zephyr) Proprietary Information. + * + * CONTACT + * + * For technical assistance, contact Zephyr Software LCC. at: + * + * + * Zephyr Software, LLC + * 2040 Tremont Rd + * Charlottesville, VA 22911 + * + * E-mail: jwd@zephyr-software.com + **************************************************************************/ + + +#include <zipr_sdk.h> +#include <string> +#include <algorithm> +#include "utils.hpp" +#include "Rewrite_Utility.hpp" +#include "large_only.h" + +using namespace libIRDB; +using namespace std; +using namespace Zipr_SDK; +using namespace ELFIO; + +LargeOnly_t::LargeOnly_t(MemorySpace_t *p_ms, + elfio *p_elfio, + FileIR_t *p_firp, + Options_t *p_opts, + InstructionLocationMap_t *p_fil) : + m_memory_space(*p_ms), + m_elfio(*p_elfio), + m_firp(*p_firp), + m_opts(*p_opts), + final_insn_locations(*p_fil) +{ +} + +void LargeOnly_t::RemoveSmallMemorySpaces(void) +{ + Range_t removableRange; + Range_t largeRange; + cout << "Starting to remove all small memory spaces." << endl; + while (m_memory_space.GetRangeCount() != 0) + { + removableRange = m_memory_space.GetFreeRange(0); + cout << "Removing: " << removableRange.GetStart() << " - " << removableRange.GetEnd() << endl; + if (removableRange.GetEnd() == -1) + largeRange = removableRange; + m_memory_space.RemoveFreeRange(removableRange); + cout << "Memory space size: " << m_memory_space.GetRangeCount() << endl; + } + m_memory_space.AddFreeRange(largeRange); + if (m_opts.GetVerbose()) + { + cout << "After removing all small memory spaces:" << endl; + m_memory_space.PrintMemorySpace(cout); + } +} + +extern "C" +Zipr_SDK::ZiprPluginInterface_t* GetPluginInterface( + Zipr_SDK::MemorySpace_t *p_ms, + ELFIO::elfio *p_elfio, + libIRDB::FileIR_t *p_firp, + Zipr_SDK::Options_t *p_opts, + Zipr_SDK::InstructionLocationMap_t *p_fil) +{ + return new LargeOnly_t(p_ms,p_elfio,p_firp,p_opts,p_fil); +} diff --git a/zipr_large_only_plugin/large_only.h b/zipr_large_only_plugin/large_only.h new file mode 100644 index 0000000000000000000000000000000000000000..fcb0cb62e618e8f13e483fd6e43ad7e484c7be7f --- /dev/null +++ b/zipr_large_only_plugin/large_only.h @@ -0,0 +1,79 @@ +/*************************************************************************** + * Copyright (c) 2014 Zephyr Software LLC. All rights reserved. + * + * This software is furnished under a license and/or other restrictive + * terms and may be used and copied only in accordance with such terms + * and the inclusion of the above copyright notice. This software or + * any other copies thereof may not be provided or otherwise made + * available to any other person without the express written consent + * of an authorized representative of Zephyr Software LCC. Title to, + * ownership of, and all rights in the software is retained by + * Zephyr Software LCC. + * + * Zephyr Software LLC. Proprietary Information + * + * Unless otherwise specified, the information contained in this + * directory, following this legend, and/or referenced herein is + * Zephyr Software LLC. (Zephyr) Proprietary Information. + * + * CONTACT + * + * For technical assistance, contact Zephyr Software LCC. at: + * + * + * Zephyr Software, LLC + * 2040 Tremont Rd + * Charlottesville, VA 22911 + * + * E-mail: jwd@zephyr-software.com + **************************************************************************/ + +#ifndef large_only_h +#define large_only_h + +#include <libIRDB-core.hpp> + +class LargeOnly_t : public Zipr_SDK::ZiprPluginInterface_t +{ + public: + LargeOnly_t(Zipr_SDK::MemorySpace_t *p_ms, + ELFIO::elfio *p_elfio, + libIRDB::FileIR_t *p_firp, + Zipr_SDK::Options_t *p_opts, + Zipr_SDK::InstructionLocationMap_t *p_fil); + virtual void PinningBegin() + { + } + virtual void PinningEnd() + { + cout<<"Push64Plugin: Ending pinning, applying push64 relocs."<<endl; + RemoveSmallMemorySpaces(); + } + virtual void DollopBegin() + { + } + virtual void DollopEnd() + { + } + virtual void CallbackLinkingBegin() + { + } + virtual void CallbackLinkingEnd() + { + } + + private: + void RemoveSmallMemorySpaces(void); + // references to input + Zipr_SDK::MemorySpace_t &m_memory_space; + ELFIO::elfio& m_elfio; + libIRDB::FileIR_t& m_firp; + Zipr_SDK::Options_t& m_opts; + Zipr_SDK::InstructionLocationMap_t &final_insn_locations; + + // local data. + libIRDB::InstructionSet_t plopped_relocs; + +}; + +#endif