diff --git a/.gitmodules b/.gitmodules
index 54bcaee..6b996fa 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,3 +10,6 @@
[submodule "dependencies/cli-parser"]
path = dependencies/cli-parser
url = https://githacks.org/_xeroxz/cli-parser.git
+[submodule "dependencies/mbuild"]
+ path = dependencies/mbuild
+ url = https://github.com/intelxed/mbuild.git
diff --git a/dependencies/mbuild b/dependencies/mbuild
new file mode 160000
index 0000000..09b6654
--- /dev/null
+++ b/dependencies/mbuild
@@ -0,0 +1 @@
+Subproject commit 09b6654be0c52bf1df44e88c88b411a67b624cbd
diff --git a/examples/demo/demo.vcxproj b/examples/demo/demo.vcxproj
index f448972..996a550 100644
--- a/examples/demo/demo.vcxproj
+++ b/examples/demo/demo.vcxproj
@@ -43,6 +43,7 @@
true
stdcpp17
Disabled
+ -Xclang -fno-jump-tables %(AdditionalOptions)
Console
diff --git a/examples/demo/main.cpp b/examples/demo/main.cpp
index 070d9df..341f878 100644
--- a/examples/demo/main.cpp
+++ b/examples/demo/main.cpp
@@ -3,7 +3,21 @@
inline double g_version = 1.0;
-int main()
+int main( int argc, char **argv )
{
- std::printf( "> g_version = %f, get_version = %f\n", g_version, get_version() );
+ switch ( std::atoi( argv[ 1 ] ) )
+ {
+ case 0:
+ return 10;
+ case 1:
+ return 12;
+ case 2:
+ return 342;
+ case 3:
+ return 43;
+ case 4:
+ return 342;
+ default:
+ std::printf( "> g_version = %f, get_version = %f\n", g_version, get_version() );
+ }
}
\ No newline at end of file
diff --git a/include/theo/engine.hpp b/include/theo/engine.hpp
deleted file mode 100644
index 559564e..0000000
--- a/include/theo/engine.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#include
-#include
-#include
-
-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
- {
- ///
- /// swapchain_t is the only one who needs to call iff_t::flush...
- /// so its a friend class... flush is also private...
- ///
- 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:
- ///
- /// flush changes from "sections" back to img...
- ///
- 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
\ No newline at end of file
diff --git a/include/theo/engine/engine.hpp b/include/theo/engine/engine.hpp
new file mode 100644
index 0000000..54f0feb
--- /dev/null
+++ b/include/theo/engine/engine.hpp
@@ -0,0 +1,22 @@
+#pragma once
+#include
+#include
+#include
+#include
+#include
+
+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
\ No newline at end of file
diff --git a/include/theo/engine/iff.hpp b/include/theo/engine/iff.hpp
new file mode 100644
index 0000000..fb8aa85
--- /dev/null
+++ b/include/theo/engine/iff.hpp
@@ -0,0 +1,33 @@
+#pragma once
+#include
+#include
+#include
+
+namespace theo
+{
+ class iff_t
+ {
+ ///
+ /// swapchain_t is the only one who needs to call iff_t::flush...
+ /// so its a friend class... flush is also private...
+ ///
+ 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:
+ ///
+ /// flush changes from "sections" back to img...
+ ///
+ void flush();
+ coff::image_t *img;
+ };
+} // namespace theo
\ No newline at end of file
diff --git a/include/theo/engine/swapchain.hpp b/include/theo/engine/swapchain.hpp
new file mode 100644
index 0000000..2181af4
--- /dev/null
+++ b/include/theo/engine/swapchain.hpp
@@ -0,0 +1,35 @@
+#pragma once
+#include
+#include
+#include
+#include
+
+namespace theo
+{
+ class swapchain_t
+ {
+ ///
+ /// 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...
+ ///
+ 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 );
+
+ ///
+ /// 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...
+ ///
+ ///
+ void swap( std::vector< iff_t > &iffs );
+ };
+} // namespace theo
\ No newline at end of file
diff --git a/include/theo/obf_pass.hpp b/include/theo/obf_pass.hpp
deleted file mode 100644
index 2a176c2..0000000
--- a/include/theo/obf_pass.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#include
-#include
-
-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
\ No newline at end of file
diff --git a/include/theo/obf_pass/obf_pass.hpp b/include/theo/obf_pass/obf_pass.hpp
new file mode 100644
index 0000000..1897922
--- /dev/null
+++ b/include/theo/obf_pass/obf_pass.hpp
@@ -0,0 +1,35 @@
+#pragma once
+#include
+#include
+
+namespace theo
+{
+ enum class lvl_t
+ {
+ ///
+ /// callback gets passed entire IFF structures...
+ ///
+ l_iff,
+
+ ///
+ /// callback gets passed entire IFF section structures...
+ ///
+ l_section,
+
+ ///
+ /// callback gets passed entire IFF symbols...
+ ///
+ 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
\ No newline at end of file
diff --git a/include/theo/obf_pass/obf_pass_wrapper.hpp b/include/theo/obf_pass/obf_pass_wrapper.hpp
new file mode 100644
index 0000000..d8ec054
--- /dev/null
+++ b/include/theo/obf_pass/obf_pass_wrapper.hpp
@@ -0,0 +1,46 @@
+#pragma once
+#include
+#include
+#include
+
+namespace theo
+{
+ ///
+ /// obfuscation pass at the IFF level...
+ ///
+ 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 )
+ {
+ }
+ };
+
+ ///
+ /// obfuscation pass at the IFF section level...
+ ///
+ 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 )
+ {
+ }
+ };
+
+ ///
+ /// obfuscation pass at the IFF symbol level..
+ ///
+ 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
\ No newline at end of file
diff --git a/include/theo/symbol.hpp b/include/theo/symbol.hpp
index bec3c2f..15a9de1 100644
--- a/include/theo/symbol.hpp
+++ b/include/theo/symbol.hpp
@@ -1,10 +1,27 @@
+#pragma once
+#include
#include
-namespace llo
+#define XED_DECODER
+extern "C"
{
- class symbol_t
+#include
+}
+
+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 );
};
-}
\ No newline at end of file
+} // namespace theo
\ No newline at end of file
diff --git a/include/theo/theo.hpp b/include/theo/theo.hpp
new file mode 100644
index 0000000..41ecceb
--- /dev/null
+++ b/include/theo/theo.hpp
@@ -0,0 +1,4 @@
+#pragma once
+#include
+#include
+#include
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 757d7e6..4baed47 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,8 +1,5 @@
-#define _CRT_SECURE_NO_WARNINGS
#include
-#include
-#include
-#include
+#include
#include
int __cdecl main( int argc, const char *argv[] )
@@ -28,7 +25,5 @@ int __cdecl main( int argc, const char *argv[] )
std::vector< std::uint8_t > lib;
umtils->open_binary_file( cli_parser.get< std::string >( "i" ), lib );
-
theo::engine_t theo( lib );
- //theo.add_pass( { theo::obf_pass_t::lvl_t::l_function } );
}
\ No newline at end of file
diff --git a/src/theo/engine/engine.cpp b/src/theo/engine/engine.cpp
new file mode 100644
index 0000000..1781718
--- /dev/null
+++ b/src/theo/engine/engine.cpp
@@ -0,0 +1,33 @@
+#include
+
+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
\ No newline at end of file
diff --git a/src/theo/engine.cpp b/src/theo/engine/iff.cpp
similarity index 57%
rename from src/theo/engine.cpp
rename to src/theo/engine/iff.cpp
index eb1a8b2..6094ecd 100644
--- a/src/theo/engine.cpp
+++ b/src/theo/engine/iff.cpp
@@ -1,8 +1,8 @@
-#include
+#include
namespace theo
{
- engine_t::swapchain_t::iff_t::iff_t( coff::image_t *img )
+ iff_t::iff_t( coff::image_t *img )
{
// add sections to iff...
std::for_each( img->get_sections(), img->get_sections() + img->file_header.num_sections,
@@ -17,7 +17,7 @@ namespace theo
} );
}
- void engine_t::swapchain_t::iff_t::flush()
+ void iff_t::flush()
{
// for each section, loop over symbols to see if they have changed...
std::for_each( sections.begin(), sections.end(), [ & ]( const iff_t::section_t &iff_section ) {
@@ -27,23 +27,4 @@ namespace theo
} );
} );
}
-
- engine_t::swapchain_t::swapchain_t( const std::vector< std::uint8_t > &img ) : front( img ), back( img )
- {
- ar::view lib( front.data(), front.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() } );
- } );
- }
-
- std::shared_ptr< engine_t::swapchain_t > engine_t::swapchain_t::make( const std::vector< std::uint8_t > &img )
- {
- return std::make_shared< engine_t::swapchain_t >( img );
- }
-
- engine_t::engine_t( const std::vector< std::uint8_t > &lib_img ) : swap{ lib_img }
- {
- }
} // namespace theo
\ No newline at end of file
diff --git a/src/theo/engine/swapchain.cpp b/src/theo/engine/swapchain.cpp
new file mode 100644
index 0000000..db30637
--- /dev/null
+++ b/src/theo/engine/swapchain.cpp
@@ -0,0 +1,35 @@
+#include
+
+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
\ No newline at end of file
diff --git a/src/theo/obf_pass/obf_pass_wrapper.cpp b/src/theo/obf_pass/obf_pass_wrapper.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/src/theo/symbol.cpp b/src/theo/symbol.cpp
new file mode 100644
index 0000000..e69de29
diff --git a/theodosius.vcxproj b/theodosius.vcxproj
index 009a93f..8776af0 100644
--- a/theodosius.vcxproj
+++ b/theodosius.vcxproj
@@ -12,7 +12,11 @@
-
+
+
+
+
+
@@ -87,9 +91,13 @@
-
-
+
+
+
+
+
+
16.0
@@ -100,7 +108,7 @@
- StaticLibrary
+ Application
true
v142
Unicode
@@ -126,11 +134,11 @@
true
- $(ProjectDir)dependencies\xtils;$(ProjectDir)dependencies\linux-pe\includes;$(ProjectDir)dependencies\xed\include\public\xed;$(ProjectDir)dependencies\cli-parser\;$(ProjectDir)include\;$(IncludePath);$(ProjectDir)include\
+ $(ProjectDir)dependencies\xtils;$(ProjectDir)dependencies\linux-pe\includes;$(ProjectDir)dependencies\xed\obj\wkit\include\xed\;$(ProjectDir)dependencies\cli-parser\;$(ProjectDir)include\;$(IncludePath);$(ProjectDir)include\
false
- $(ProjectDir)dependencies\xtils;$(ProjectDir)dependencies\linux-pe\includes;$(ProjectDir)dependencies\xed\include\public\xed;$(ProjectDir)dependencies\cli-parser\;$(IncludePath);$(ProjectDir)include\
+ $(ProjectDir)dependencies\xtils;$(ProjectDir)dependencies\linux-pe\includes;$(ProjectDir)dependencies\xed\obj\wkit\include\xed\;$(ProjectDir)dependencies\cli-parser\;$(IncludePath);$(ProjectDir)include\
@@ -143,6 +151,7 @@
Console
true
+ $(ProjectDir)dependencies\xed\obj\wkit\lib\xed.lib;%(AdditionalDependencies)
true
@@ -167,6 +176,7 @@
true
true
true
+ $(ProjectDir)dependencies\xed\obj\wkit\lib\xed.lib;%(AdditionalDependencies)
true
diff --git a/theodosius.vcxproj.filters b/theodosius.vcxproj.filters
index 846fbd5..717bcd0 100644
--- a/theodosius.vcxproj.filters
+++ b/theodosius.vcxproj.filters
@@ -37,12 +37,36 @@
{348d8bd4-31b6-445d-a487-bc39267daf6b}
+
+ {95451c54-49b0-4f77-ab9d-114bc75a44f3}
+
+
+ {56c94e09-c085-4b88-b732-cdf5f0663af1}
+
+
+ {582e72f3-82c8-412f-b686-8e767eb5c229}
+
+
+ {e42f4fe1-e21d-4e37-9b35-320770c78e5f}
+
Source Files
-
+
+ Source Files\theo\engine
+
+
+ Source Files\theo\engine
+
+
+ Source Files\theo\engine
+
+
+ Source Files\theo\obf_pass
+
+
Source Files\theo
@@ -259,13 +283,25 @@
Header Files\xed
-
+
Header Files\theo
-
- Header Files\theo
+
+ Header Files\theo\engine
-
+
+ Header Files\theo\engine
+
+
+ Header Files\theo\engine
+
+
+ Header Files\theo\obf_pass
+
+
+ Header Files\theo\obf_pass
+
+
Header Files\theo