trainerbase 3.3.0__tar.gz → 3.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: trainerbase
3
- Version: 3.3.0
3
+ Version: 3.4.0
4
4
  Summary: Framework for creating game trainers/mods
5
5
  Home-page: https://gitlab.com/python-trainers/trainer-base
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "trainerbase"
3
- version = "3.3.0"
3
+ version = "3.4.0"
4
4
  description = "Framework for creating game trainers/mods"
5
5
  authors = ["v01d <v01d@v01d.ru>", "doomayka <zd@doomayka.ru>"]
6
6
  license = "MIT"
@@ -3,7 +3,7 @@ from pathlib import Path
3
3
  from subprocess import DEVNULL
4
4
  from subprocess import run as run_executable
5
5
  from tempfile import TemporaryDirectory
6
- from typing import Self, override
6
+ from typing import Never, Self, override
7
7
 
8
8
  from pymem.exception import MemoryWriteError
9
9
 
@@ -65,28 +65,40 @@ class AllocatingCodeInjection(AbstractCodeInjection): # pylint: disable=too-man
65
65
  code_to_inject: Code,
66
66
  original_code_length: int = 0,
67
67
  new_memory_size: int = 1024,
68
- is_long_x64_jump_needed: bool = False,
68
+ is_long_x64_jump_needed: Never = Never,
69
69
  ):
70
+ if is_long_x64_jump_needed is not Never:
71
+ raise Exception(
72
+ "Since TrainerBase 3.4.0 is_long_x64_jump_needed has been deprecated."
73
+ " Now there is not need to manually pop and push rax. That's why you must"
74
+ " rewrite injections based on manual pop rax, push rax and then remove is_long_x64_jump_needed"
75
+ " argument"
76
+ )
77
+
70
78
  self.address = ensure_address(address)
79
+
71
80
  self.code_to_inject = compile_asm(code_to_inject)
81
+
82
+ if not pm.is_WoW64:
83
+ self.code_to_inject = compile_asm("pop rax") + self.code_to_inject + compile_asm("push rax")
84
+
72
85
  self.original_code: bytes = b""
73
86
 
74
87
  self.original_code_length = original_code_length
75
88
  self.new_memory_size = new_memory_size
76
89
  self.new_memory_address: int = 0
77
- self.is_long_x64_jump_needed = is_long_x64_jump_needed
78
90
 
79
91
  @override
80
92
  def inject(self):
81
93
  self.original_code = pm.read_bytes(self.address.resolve(), self.original_code_length)
82
94
  self.new_memory_address: int = pm.allocate(self.new_memory_size)
83
95
 
84
- if self.is_long_x64_jump_needed:
85
- new_mem_jump_code_generator = get_long_x64_jump_to_new_mem_code
86
- jump_back_code_generator = get_long_x64_jump_back_code
87
- else:
96
+ if pm.is_WoW64:
88
97
  new_mem_jump_code_generator = get_simple_jump_code
89
98
  jump_back_code_generator = get_simple_jump_code
99
+ else:
100
+ new_mem_jump_code_generator = get_long_x64_jump_to_new_mem_code
101
+ jump_back_code_generator = get_long_x64_jump_back_code
90
102
 
91
103
  jump_to_new_mem = compile_asm(new_mem_jump_code_generator(self.new_memory_address))
92
104
  jumper_length = len(jump_to_new_mem)
@@ -97,7 +109,7 @@ class AllocatingCodeInjection(AbstractCodeInjection): # pylint: disable=too-man
97
109
  raise ValueError(f"Jumper length > original code length: {jumper_length} > {self.original_code_length}")
98
110
 
99
111
  jump_back_address = self.address.resolve() + jumper_length
100
- if self.is_long_x64_jump_needed:
112
+ if not pm.is_WoW64:
101
113
  jump_back_address -= 1
102
114
 
103
115
  jump_back = compile_asm(jump_back_code_generator(jump_back_address))
@@ -154,3 +154,7 @@ def ensure_address(obj: ConvertibleToAddress) -> AbstractAddress:
154
154
  return AOBScan(obj)
155
155
  case _:
156
156
  raise TypeError(f"Cannot create AbstractAddress from {type(obj)}")
157
+
158
+
159
+ def allocate_pointer() -> int:
160
+ return pm.allocate(POINTER_SIZE)
File without changes
File without changes