Theodosius v3.0
Jit linker, symbol mapper, and obfuscator
reloc_transform_pass.cpp
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
32
33namespace theo::obf {
35 static reloc_transform_pass_t obj;
36 return &obj;
37}
38
40 std::optional<recomp::reloc_t*> reloc;
41 if (!(reloc = has_legit_reloc(sym)).has_value())
42 return;
43
44 spdlog::info("adding transformations to relocation in symbol: {}",
45 sym->name());
46
47 xed_error_enum_t err;
48 xed_decoded_inst_t inst;
49 xed_state_t istate{XED_MACHINE_MODE_LONG_64, XED_ADDRESS_WIDTH_64b};
50 xed_decoded_inst_zero_set_mode(&inst, &istate);
51
52 if ((err = xed_decode(&inst, sym->data().data(), sym->data().size())) !=
53 XED_ERROR_NONE) {
54 spdlog::error("failed to decode instruction, reason: {} in symbol: {}",
55 xed_error_enum_t2str(err), sym->name());
56
57 assert(err == XED_ERROR_NONE);
58 }
59
60 auto transforms_bytes = transform::generate(&inst, reloc.value(), 3, 6);
61 sym->data().insert(sym->data().end(), transforms_bytes.begin(),
62 transforms_bytes.end());
63};
64
65std::optional<recomp::reloc_t*> reloc_transform_pass_t::has_legit_reloc(
66 decomp::symbol_t* sym) {
67 auto res = // see if there are any relocations with offset not equal to
68 // zero... relocations with zero mean its a relocation to the next
69 // instruction...
70 std::find_if(
71 sym->relocs().begin(), sym->relocs().end(),
72 [&](recomp::reloc_t& reloc) -> bool { return reloc.offset(); });
73
74 return res != sym->relocs().end() ? &(*res)
75 : std::optional<recomp::reloc_t*>();
76}
77} // namespace theo::obf