parent
0e8d76b564
commit
062fdd49bd
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 09b6654be0c52bf1df44e88c88b411a67b624cbd
|
@ -1,54 +0,0 @@
|
|||||||
#include <coff/archive.hpp>
|
|
||||||
#include <coff/image.hpp>
|
|
||||||
#include <theo/obf_pass.hpp>
|
|
||||||
|
|
||||||
namespace theo
|
|
||||||
{
|
|
||||||
class engine_t
|
|
||||||
{
|
|
||||||
class swapchain_t
|
|
||||||
{
|
|
||||||
std::vector< std::uint8_t > front, back;
|
|
||||||
std::vector< std::vector< std::uint8_t > > objs;
|
|
||||||
|
|
||||||
public:
|
|
||||||
class iff_t
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// swapchain_t is the only one who needs to call iff_t::flush...
|
|
||||||
/// so its a friend class... flush is also private...
|
|
||||||
/// </summary>
|
|
||||||
friend class swapchain_t;
|
|
||||||
|
|
||||||
public:
|
|
||||||
struct section_t
|
|
||||||
{
|
|
||||||
coff::section_header_t header;
|
|
||||||
std::vector< std::pair< std::uint32_t, coff::symbol_t > > symbols;
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit iff_t( coff::image_t *img );
|
|
||||||
std::vector< section_t > sections;
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// <summary>
|
|
||||||
/// flush changes from "sections" back to img...
|
|
||||||
/// </summary>
|
|
||||||
void flush();
|
|
||||||
coff::image_t *img;
|
|
||||||
};
|
|
||||||
explicit swapchain_t( const std::vector< std::uint8_t > &img );
|
|
||||||
std::shared_ptr< swapchain_t > make( const std::vector< std::uint8_t > &img );
|
|
||||||
void swap( std::vector< iff_t > &iffs );
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit engine_t( const std::vector< std::uint8_t > &lib_img );
|
|
||||||
void add_pass( const obf_pass_t &pass );
|
|
||||||
void run( std::vector< std::uint8_t > &result );
|
|
||||||
|
|
||||||
private:
|
|
||||||
swapchain_t swap;
|
|
||||||
std::vector< theo::obf_pass_t > passes;
|
|
||||||
};
|
|
||||||
} // namespace theo
|
|
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <coff/archive.hpp>
|
||||||
|
#include <coff/image.hpp>
|
||||||
|
#include <theo/engine/iff.hpp>
|
||||||
|
#include <theo/engine/swapchain.hpp>
|
||||||
|
#include <theo/obf_pass/obf_pass.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
class engine_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit engine_t( const std::vector< std::uint8_t > &lib_img );
|
||||||
|
engine_t &add_pass( const obf_pass_t &pass );
|
||||||
|
engine_t &add_passes( const std::vector< obf_pass_t > &passes );
|
||||||
|
void run( std::vector< std::uint8_t > &result );
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr< theo::swapchain_t > swapchain;
|
||||||
|
std::vector< theo::obf_pass_t > obf_passes;
|
||||||
|
};
|
||||||
|
} // namespace theo
|
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <coff/image.hpp>
|
||||||
|
#include <vector>
|
||||||
|
#include <xtils.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
class iff_t
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// swapchain_t is the only one who needs to call iff_t::flush...
|
||||||
|
/// so its a friend class... flush is also private...
|
||||||
|
/// </summary>
|
||||||
|
friend class swapchain_t;
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct section_t
|
||||||
|
{
|
||||||
|
coff::section_header_t header;
|
||||||
|
std::vector< std::pair< std::uint32_t, coff::symbol_t > > symbols;
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit iff_t( coff::image_t *img );
|
||||||
|
std::vector< section_t > sections;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// <summary>
|
||||||
|
/// flush changes from "sections" back to img...
|
||||||
|
/// </summary>
|
||||||
|
void flush();
|
||||||
|
coff::image_t *img;
|
||||||
|
};
|
||||||
|
} // namespace theo
|
@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <coff/archive.hpp>
|
||||||
|
#include <coff/image.hpp>
|
||||||
|
#include <theo/engine/iff.hpp>
|
||||||
|
#include <xtils.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
class swapchain_t
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// pair of front and back buffers...
|
||||||
|
/// changes are flushed to the back buffer, then the front
|
||||||
|
/// buffer gets overwritten by the back buffer when swapped...
|
||||||
|
/// </summary>
|
||||||
|
struct pair_t
|
||||||
|
{
|
||||||
|
std::vector< std::uint8_t > front, back;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector< pair_t > objs;
|
||||||
|
std::vector< std::uint8_t > archive;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit swapchain_t( const std::vector< std::uint8_t > &img );
|
||||||
|
static std::shared_ptr< swapchain_t > make( const std::vector< std::uint8_t > &img );
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// if theo::swapchain::swap takes in an empty vector then it will simply fill it up
|
||||||
|
/// instead of flushing the iff data to the back buffer then swapping...
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="iffs"></param>
|
||||||
|
void swap( std::vector< iff_t > &iffs );
|
||||||
|
};
|
||||||
|
} // namespace theo
|
@ -1,23 +0,0 @@
|
|||||||
#include <xtils.hpp>
|
|
||||||
#include <theo/symbol.hpp>
|
|
||||||
|
|
||||||
namespace theo
|
|
||||||
{
|
|
||||||
class obf_pass_t
|
|
||||||
{
|
|
||||||
friend class engine_t;
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum class lvl_t
|
|
||||||
{
|
|
||||||
l_section,
|
|
||||||
l_function,
|
|
||||||
l_instr
|
|
||||||
};
|
|
||||||
obf_pass_t( const lvl_t &pass_lvl );
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual void callback() = 0;
|
|
||||||
lvl_t lvl;
|
|
||||||
};
|
|
||||||
} // namespace theo
|
|
@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <theo/symbol.hpp>
|
||||||
|
#include <xtils.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
enum class lvl_t
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// callback gets passed entire IFF structures...
|
||||||
|
/// </summary>
|
||||||
|
l_iff,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// callback gets passed entire IFF section structures...
|
||||||
|
/// </summary>
|
||||||
|
l_section,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// callback gets passed entire IFF symbols...
|
||||||
|
/// </summary>
|
||||||
|
l_symbol
|
||||||
|
};
|
||||||
|
|
||||||
|
class obf_pass_t
|
||||||
|
{
|
||||||
|
friend class engine_t;
|
||||||
|
virtual void obfuscate( const theo::iff_t & ) = 0;
|
||||||
|
lvl_t lvl;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit obf_pass_t( const lvl_t &pass_lvl );
|
||||||
|
lvl_t get_lvl() const;
|
||||||
|
};
|
||||||
|
} // namespace theo
|
@ -0,0 +1,46 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <theo/engine/engine.hpp>
|
||||||
|
#include <theo/obf_pass/obf_pass.hpp>
|
||||||
|
#include <theo/symbol.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// obfuscation pass at the IFF level...
|
||||||
|
/// </summary>
|
||||||
|
class obf_pass_iff_t : public obf_pass_t
|
||||||
|
{
|
||||||
|
void obfuscate( const theo::iff_t & ) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
obf_pass_iff_t() : obf_pass_t( lvl_t::l_iff )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// obfuscation pass at the IFF section level...
|
||||||
|
/// </summary>
|
||||||
|
class obf_pass_section_t : public obf_pass_t
|
||||||
|
{
|
||||||
|
void obfuscate( const theo::iff_t & ) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
obf_pass_section_t() : obf_pass_t( lvl_t::l_section )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// obfuscation pass at the IFF symbol level..
|
||||||
|
/// </summary>
|
||||||
|
class obf_pass_symbol_t : public obf_pass_t
|
||||||
|
{
|
||||||
|
void obfuscate( const theo::iff_t & ) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
obf_pass_symbol_t() : obf_pass_t( lvl_t::l_symbol )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace theo
|
@ -1,10 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <coff/image.hpp>
|
||||||
#include <xtils.hpp>
|
#include <xtils.hpp>
|
||||||
|
|
||||||
namespace llo
|
#define XED_DECODER
|
||||||
|
extern "C"
|
||||||
{
|
{
|
||||||
class symbol_t
|
#include <xed-decode.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
class symbol_t
|
||||||
{
|
{
|
||||||
public:
|
std::uint32_t symbol_table_idx;
|
||||||
|
coff::symbol_t coff_symbol;
|
||||||
|
|
||||||
|
std::vector< symbol_t * > deps;
|
||||||
|
std::vector< xed_decoded_inst_t > instrs;
|
||||||
|
|
||||||
|
void on_update();
|
||||||
|
|
||||||
|
public:
|
||||||
|
symbol_t();
|
||||||
|
void add_dep( const symbol_t &dep );
|
||||||
};
|
};
|
||||||
}
|
} // namespace theo
|
@ -0,0 +1,4 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <theo/engine/engine.hpp>
|
||||||
|
#include <theo/obf_pass/obf_pass_wrapper.hpp>
|
||||||
|
#include <theo/symbol.hpp>
|
@ -0,0 +1,33 @@
|
|||||||
|
#include <theo/engine/engine.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
engine_t::engine_t( const std::vector< std::uint8_t > &lib_img ) : swapchain( theo::swapchain_t::make( lib_img ) )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
engine_t &theo::engine_t::add_pass( const obf_pass_t &pass )
|
||||||
|
{
|
||||||
|
obf_passes.push_back( pass );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
engine_t &theo::engine_t::add_passes( const std::vector< obf_pass_t > &passes )
|
||||||
|
{
|
||||||
|
obf_passes.insert( obf_passes.end(), passes.begin(), passes.end() );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void theo::engine_t::run( std::vector< std::uint8_t > &result )
|
||||||
|
{
|
||||||
|
std::for_each( obf_passes.begin(), obf_passes.end(), [ & ]( theo::obf_pass_t &obf_pass ) {
|
||||||
|
std::vector< theo::iff_t > iffs;
|
||||||
|
swapchain->swap( iffs );
|
||||||
|
|
||||||
|
std::for_each( iffs.begin(), iffs.end(), [ & ]( const theo::iff_t &iff ) {
|
||||||
|
obf_pass.obfuscate( iff );
|
||||||
|
swapchain->swap( iffs );
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} // namespace theo
|
@ -0,0 +1,35 @@
|
|||||||
|
#include <theo/engine/swapchain.hpp>
|
||||||
|
|
||||||
|
namespace theo
|
||||||
|
{
|
||||||
|
swapchain_t::swapchain_t( const std::vector< std::uint8_t > &img ) : archive( img )
|
||||||
|
{
|
||||||
|
ar::view lib( archive.data(), archive.size() );
|
||||||
|
// extract obj files from lib archive...
|
||||||
|
std::for_each( lib.begin(), lib.end(), [ & ]( const auto &coff_data ) {
|
||||||
|
const auto &[ coff_name, coff_img ] = coff_data;
|
||||||
|
objs.push_back( { { coff_img.begin(), coff_img.end() }, { coff_img.begin(), coff_img.end() } } );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr< theo::swapchain_t > swapchain_t::make( const std::vector< std::uint8_t > &img )
|
||||||
|
{
|
||||||
|
return std::make_shared< theo::swapchain_t >( img );
|
||||||
|
}
|
||||||
|
|
||||||
|
void theo::swapchain_t::swap( std::vector< iff_t > &iffs )
|
||||||
|
{
|
||||||
|
if ( iffs.empty() )
|
||||||
|
{
|
||||||
|
for ( auto &[ front, back ] : objs )
|
||||||
|
{
|
||||||
|
theo::iff_t iff( reinterpret_cast< coff::image_t * >( front.data() ) );
|
||||||
|
iffs.push_back( iff );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO flush results to the back buffer and swap front and back...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace theo
|
Loading…
Reference in new issue