https://qweme.dev
-
Автор темы
- #1
В связи с большим спросом, как и обещал пилю гайд по конварам
Для начала нам нужно найти хреф на конвар (я делаю это все в x64dbg)
1. Нажимаем ctrl+g и пишем client.entry
2. Пкм по тому что нашли (Search for > Current module > String references)
3. Ждем пока загрузит хрефы и вписываем dota_use_particle_fow (конвар который хотим менять через наш код, можно и любой другой)
4. C хрефа на название квара ты находишь функцию которая вызывает конструктор, в rcx прямо перед вызовом самого конструктора будет засунут квар ибо конструктор это __thiscall (не знаю как понятнее обьснить, Liberalist)
Дальше смотрим что читает значение (7FFC60562990 + 0x58, 0x58 оффсет на котором лежит значение квара) нашего конвара (F5 в CE)
Бинго, осталось сделать сигу на 7FFC605629C8 (48 8B ? ? ? ? ? 83 78 58 ? 48 8B ? ? ? ? ? 0F 95)
Теперь в коде нам нужно засигсканить нашу хуйню, найти адрес и перезаписать
Кто то там пиздел в топиках, что питон не может сигсканить, ну так что, докажем обратное? xd
В питоне уже есть готовый модуль для работы с памятью в винде (pymem), и не поверите, там даже есть готовый патерн сканер, вау
Я же написал небольшую обертку над pymem (унаследовал класс и дописал свои функи)
Осталось самое легкое - написать код)
ггвп, девочки и мальчики
Для начала нам нужно найти хреф на конвар (я делаю это все в x64dbg)
1. Нажимаем ctrl+g и пишем client.entry
2. Пкм по тому что нашли (Search for > Current module > String references)
3. Ждем пока загрузит хрефы и вписываем dota_use_particle_fow (конвар который хотим менять через наш код, можно и любой другой)
4. C хрефа на название квара ты находишь функцию которая вызывает конструктор, в rcx прямо перед вызовом самого конструктора будет засунут квар ибо конструктор это __thiscall (не знаю как понятнее обьснить, Liberalist)
Дальше смотрим что читает значение (7FFC60562990 + 0x58, 0x58 оффсет на котором лежит значение квара) нашего конвара (F5 в CE)
Код:
7FFC5DA19514 - and rbp,-40
7FFC5DA19518 - mov rax,[7FFC605629C8] <<< Указатель на квар
7FFC5DA1951F - cmp dword ptr [rax+58],00
7FFC5DA19523 - mov rax,[7FFC60562B08]
7FFC5DA1952A - setne byte ptr [7FFC6074C718]
Теперь в коде нам нужно засигсканить нашу хуйню, найти адрес и перезаписать
Кто то там пиздел в топиках, что питон не может сигсканить, ну так что, докажем обратное? xd
В питоне уже есть готовый модуль для работы с памятью в винде (pymem), и не поверите, там даже есть готовый патерн сканер, вау
Я же написал небольшую обертку над pymem (унаследовал класс и дописал свои функи)
Python:
class QwemeMemory(pymem.Pymem):
def getAbsAddr(self, ptr: int, offset: int, size: int) -> int:
return ptr + self.read_int(ptr + offset) + size
def sigScan(self, module_name, pattern) -> int:
module = pymem.process.module_from_name(self.process_handle, module_name)
pattern_bytes_str = ""
for byte in pattern.split(" "):
if byte == "?":
pattern_bytes_str += "."
else:
pattern_bytes_str += "\\x" + byte
pattern_bytes = bytes(pattern_bytes_str, "utf-8")
value = pymem.pattern.pattern_scan_module(self.process_handle, module, pattern_bytes)
if value is None:
value = 0
return value
Python:
def main() -> int:
dota = QwemeMemory("dota2.exe")
dota_use_particle_fow_ptr = dota.sigScan("client.dll", "48 8B ? ? ? ? ? 83 78 58 ? 48 8B ? ? ? ? ? 0F 95")
dota_use_particle_fow_addr = dota.getAbsAddr(dota_use_particle_fow_ptr, 3, 7)
dota_use_particle_fow_value = dota.read_ulonglong(dota_use_particle_fow_addr) + 0x58 # value of convar on 0x58
dota.write_int(dota_use_particle_fow_value, 0) # equal dota_use_particle_fow 0
return 0
Python:
import pymem
import pymem.process
import pymem.pattern
class QwemeMemory(pymem.Pymem):
def getAbsAddr(self, ptr: int, offset: int, size: int) -> int:
return ptr + self.read_int(ptr + offset) + size
def sigScan(self, module_name, pattern) -> int:
module = pymem.process.module_from_name(self.process_handle, module_name)
pattern_bytes_str = ""
for byte in pattern.split(" "):
if byte == "?":
pattern_bytes_str += "."
else:
pattern_bytes_str += "\\x" + byte
pattern_bytes = bytes(pattern_bytes_str, "utf-8")
value = pymem.pattern.pattern_scan_module(self.process_handle, module, pattern_bytes)
if value is None:
value = 0
return value
def main() -> int:
dota = QwemeMemory("dota2.exe")
dota_use_particle_fow_ptr = dota.sigScan("client.dll", "48 8B ? ? ? ? ? 83 78 58 ? 48 8B ? ? ? ? ? 0F 95")
dota_use_particle_fow_addr = dota.getAbsAddr(dota_use_particle_fow_ptr, 3, 7)
dota_use_particle_fow_value = dota.read_ulonglong(dota_use_particle_fow_addr) + 0x58 # value of convar on 0x58
dota.write_int(dota_use_particle_fow_value, 0) # equal dota_use_particle_fow 0
return 0
if __name__ == "__main__":
exit(main())