Theodosius v3.0
Jit linker, symbol mapper, and obfuscator
theo.hpp
Go to the documentation of this file.
1// Copyright (c) 2022, _xeroxz
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7// 1. Redistributions of source code must retain the above copyright notice,
8// this list of conditions and the following disclaimer.
9//
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13//
14// 3. Neither the name of the copyright holder nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28// POSSIBILITY OF SUCH DAMAGE.
29//
30
31#pragma once
32#include <spdlog/spdlog.h>
33#include <decomp/decomp.hpp>
34#include <obf/engine.hpp>
35#include <recomp/recomp.hpp>
37
41
42#include <optional>
43#include <tuple>
44#include <vector>
45
46#define XED_ENCODER
47extern "C" {
48#include <xed-decode.h>
49#include <xed-interface.h>
50}
51
52/// <summary>
53/// The outer most encompassing namespace of this project.
54/// </summary>
55namespace theo {
56
57/// <summary>
58/// tuple of functions used by theo to allocate, copy, and resolve symbols.
59/// </summary>
60using lnk_fns_t =
61 std::tuple<recomp::allocator_t, recomp::copier_t, recomp::resolver_t>;
62
63/// <summary>
64/// the main class which encapsulates a symbol table, decomp, and recomp
65/// objects. This class is a bridge that connects all three: decomp, obf,
66/// recomp.
67///
68/// You will create an object of this type when using theo.
69/// </summary>
70class theo_t {
71 public:
72 /// <summary>
73 /// explicit constructor for theo class.
74 /// </summary>
75 /// <param name="lib">a vector of bytes consisting of a lib</param>
76 /// <param name="lnkr_fns"></param>
77 /// <param name="entry_sym">the name of the function which will be used as the
78 /// entry point</param>
79 explicit theo_t(std::vector<std::uint8_t>& lib,
80 lnk_fns_t lnkr_fns,
81 const std::string&& entry_sym);
82
83 /// <summary>
84 /// decomposes the lib file and return the number of symbols that are used.
85 /// </summary>
86 /// <returns>optional amount of symbols that are used. no value if
87 /// decomposition fails.</returns>
88 std::optional<std::uint32_t> decompose();
89
90 /// <summary>
91 /// compose the decomposed module. This will run obfuscation passes, the map
92 /// and resolve symbols to each other.
93 /// </summary>
94 /// <returns>returns the address of the entry point symbol</returns>
95 std::uintptr_t compose();
96
97 /// <summary>
98 /// given the name of a symbol, it returns the address of where its mapped.
99 /// </summary>
100 /// <param name="sym">the name of the symbol</param>
101 /// <returns>the address of the symbol</returns>
102 std::uintptr_t resolve(const std::string&& sym);
103
104 private:
105 std::string m_entry_sym;
106 decomp::decomp_t m_dcmp;
107 recomp::recomp_t m_recmp;
108 recomp::symbol_table_t m_sym_tbl;
109};
110} // namespace theo