Theodosius  v3.0
Jit linker, mapper, obfuscator, and mutator
jcc_rewrite_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 
33 
34 namespace theo::obf {
36  static jcc_rewrite_pass_t obj;
37  return &obj;
38 }
39 
41  std::int32_t disp = {};
42  xed_decoded_inst_t inst;
43  xed_state_t istate{XED_MACHINE_MODE_LONG_64, XED_ADDRESS_WIDTH_64b};
44  xed_decoded_inst_zero_set_mode(&inst, &istate);
45  xed_decode(&inst, sym->data().data(), XED_MAX_INSTRUCTION_BYTES);
46 
47  // if the instruction is branching...
48  if ((disp = xed_decoded_inst_get_branch_displacement(&inst))) {
49  disp += xed_decoded_inst_get_length(&inst);
50 
51  // update displacement...
52  xed_decoded_inst_set_branch_displacement(
53  &inst, sym->data().size() - xed_decoded_inst_get_length(&inst),
54  xed_decoded_inst_get_branch_displacement_width(&inst));
55 
56  xed_encoder_request_init_from_decode(&inst);
57  xed_encoder_request_t* req = &inst;
58 
59  // update jcc in the buffer...
60  std::uint32_t len = {};
61  xed_encode(req, sym->data().data(), xed_decoded_inst_get_length(&inst),
62  &len);
63 
64  // create a relocation to the instruction the branch would normally go
65  // too...
66  auto offset = disp < 0 ? sym->offset() - std::abs(disp)
67  : sym->offset() + std::abs(disp);
68 
69  auto sym_name =
70  std::string(
71  sym->sym()->name.to_string(sym->img()->get_strings()).data())
72  .append("@")
73  .append(std::to_string(offset));
74 
75  sym->relocs().push_back(
76  recomp::reloc_t(0, decomp::symbol_t::hash(sym_name), sym_name.data()));
77 
78  // run next_inst_pass on this symbol to generate the transformations for the
79  // relocation to the jcc branch dest instruction...
80  next_inst_pass_t::get()->run(sym);
81  }
82 };
83 } // namespace theo::obf
symbol_t is an abstraction upon the coff symbol. this allows for easier manipulation of the symbol....
Definition: symbol.hpp:53
coff::symbol_t * sym() const
returns a pointer to the coff symbol object.
Definition: symbol.cpp:92
std::uintptr_t offset() const
gets the offset into the section where the symbol is located.
Definition: symbol.cpp:56
std::size_t hash()
gets the hash of the symbol name.
Definition: symbol.cpp:88
std::vector< std::uint8_t > & data()
returns a vector by reference of bytes containing the data of the symbol.
Definition: symbol.cpp:76
std::vector< recomp::reloc_t > & relocs()
returns a vector of relocations.
Definition: symbol.cpp:96
coff::image_t * img() const
gets the imagine in which the symbol is located inside of.
Definition: symbol.cpp:68
jcc rewrite pass which rewrites rip relative jcc's so that they are position independent.
void run(decomp::symbol_t *sym)
virtual method which must be implimented by the pass that inherits this class.
static jcc_rewrite_pass_t * get()
static next_inst_pass_t * get()
void run(decomp::symbol_t *sym)
virtual method which must be implimented by the pass that inherits this class.
meta data about a relocation for a symbol
Definition: reloc.hpp:41
this is the main namespace for obfuscation related things.
Definition: engine.hpp:36