diff options
| -rw-r--r-- | bruiser/bruiser.cpp | 1 | ||||
| -rw-r--r-- | bruiser/executioner.cpp | 47 | ||||
| -rw-r--r-- | bruiser/executioner.h | 116 | 
3 files changed, 117 insertions, 47 deletions
| diff --git a/bruiser/bruiser.cpp b/bruiser/bruiser.cpp index 3197a5e..46f8323 100644 --- a/bruiser/bruiser.cpp +++ b/bruiser/bruiser.cpp @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*  #include "../mutator_aux.h"  #include "mutagen.h"  #include "ORCmutation.h" +#include "executioner.h"  /*standard headers*/  #include <fstream>  #include <string> diff --git a/bruiser/executioner.cpp b/bruiser/executioner.cpp deleted file mode 100644 index 5aad56b..0000000 --- a/bruiser/executioner.cpp +++ /dev/null @@ -1,47 +0,0 @@ - -/***************************************************Project Mutator****************************************************/ -//-*-c++-*- -/*first line intentionally left blank.*/ -/*loads the objects into executable memory and registers them with lua.*/ -/*Copyright (C) 2017 Farzad Sadeghi - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*/ -/**********************************************************************************************************************/ -#include <vector> -#include <cstdint> -#include "lua-5.3.4/src/lua.hpp" -/**********************************************************************************************************************/ -namespace { -  constexpr int MEMORY_SIZE = 30000; -  std::vector<uint8_t> memory(MEMORY_SIZE, 0); -} - -class Executioner { -  public: -    Executioner() {} -    ~Executioner() {} - -    void getObjs(std::vector<std::vector<uint8_t>> _objs) { -      objs = _objs; -    } - -    void registerWithLua(lua_State* _lua_State) {} - -  private: -    std::vector<std::vector<uint8_t>> objs; -}; -/**********************************************************************************************************************/ -/*last line intentionally left blank.*/ - diff --git a/bruiser/executioner.h b/bruiser/executioner.h new file mode 100644 index 0000000..d1c0b32 --- /dev/null +++ b/bruiser/executioner.h @@ -0,0 +1,116 @@ + +/***************************************************Project Mutator****************************************************/ +//-*-c++-*- +/*first line intentionally left blank.*/ +/*loads the objects into executable memory and registers them with lua.*/ +/*Copyright (C) 2017 Farzad Sadeghi + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.*/ +/**********************************************************************************************************************/ +#include <iostream> +#include <tuple> +#include <vector> +#include <cstdint> +#include <cstdarg> +#include <cstring> +#include <sys/mman.h> +#include "lua-5.3.4/src/lua.hpp" +/**********************************************************************************************************************/ +#ifndef EXECUTIONER_H +#define EXECUTIONER_H +/**********************************************************************************************************************/ +namespace { +  using XObject = void(*)(void); +  constexpr int MEMORY_SIZE = 32768; +  std::vector<uint8_t> memory(MEMORY_SIZE, 0); + +  void* alloc_writeable_memory(size_t _size) { +    void* ptr = mmap(0, _size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +    if (ptr == (void*)-1) { +      perror("could not allocate virtual memory."); +      return nullptr; +    } +    return ptr; +  } + +  int make_mem_executable(void* _mem, size_t _size) { +    if (mprotect(_mem, _size, PROT_READ | PROT_EXEC) == -1) { +      perror("could not make virtual memory executable."); +      return -1; +    } +    return 0; +  } +} + +int getMemorySize(void) {return MEMORY_SIZE;} + +class Executioner { +  public: +    Executioner() {} +    ~Executioner() { +      for (auto &iter : obj_mem_ptrs) { +        if (iter.first != nullptr) { +          if (munmap(iter.first, iter.second) < 0) { +            perror("could not unmap vmemory."); +          } +        } +      } +    } + +    void getObjs(std::vector<std::vector<uint8_t>>& _objs) {objs = _objs;} + +    void getNames(std::vector<std::string>& _names) {names = _names;} + +    std::pair<void*, size_t> loadObjsInXMem(std::vector<uint8_t>& _obj_code) { +      size_t code_size = _obj_code.size(); +      void* program_memory = alloc_writeable_memory(code_size); +      if (program_memory == nullptr) { +        std::cout << "could not allocate virtual memory\n"; +        return std::make_pair(nullptr, 0); +      } +      memcpy(program_memory, _obj_code.data(), code_size); +      if (make_mem_executable(program_memory, code_size) < 0) { +        std::cout << "could not make vmemory executable.\n"; +        return std::make_pair(nullptr, 0); +      } +      return std::make_pair(program_memory, code_size); +    } + +    void loadAll(void) { +      for (auto &iter : objs) { +        this->loadObjsInXMem(iter); +      } +    } + +    void emitByte(uint8_t _byte, std::vector<uint8_t>& _code) { +      _code.push_back(_byte); +    } + +    void emitBytes(std::vector<uint8_t>& _bytes, std::vector<uint8_t>& _code) { +      for (auto &iter : _bytes) {this->emitByte(iter, _code);} +    } + +    void registerWithLua(lua_State* _lua_State) {} + +  private: +    std::vector<std::pair<void*, size_t>> obj_mem_ptrs; +    std::vector<std::vector<uint8_t>> objs; +    std::vector<std::string> names; +}; +/**********************************************************************************************************************/ +#endif +/**********************************************************************************************************************/ +/*last line intentionally left blank.*/ + | 
