Python СNetGame.cpp

TastyBread123

Известный
Автор темы
627
302
Сейчас работаю над отправкой пакетов на сервер сампа с помощью адресов памяти и питона

Не могли бы вы подсказать, как с помощью PyMem можно организовать отправку к примеру куска ниже, или хотя бы помочь понять, к какому типу данных относится объекты CNetGame и pPacket?

C++:
void CNetGame::Packet_PlayerSync(Packet* pPacket) {
    ((void(__thiscall*)(CNetGame*, Packet*))GetAddress(0xA250))(this, pPacket);
}
Полный код: https://github.com/BlastHackNet/SAMP-API/blob/multiver/src/sampapi/0.3.7-R1/CNetGame.cpp


Также интересует, где можно найти список пакетов (параметр pPacket)
 

TastyBread123

Известный
Автор темы
627
302
Это достаточно тяжело (и бессмысленно).

А вообще:
  1. Открываешь процесс
  2. Получаешь base address
  3. Получаешь адрес этой функции (sendpacket) - baseaddress+offset
  4. Вставляешь куда нибудь asm инструкцию вида:
    Код:
    jmp адрес_функции_с_кодом
    // сама функция с кодом где то в конце, так как врятли будет NOP-место под это дело
    mov eax, packet
    call адрес_sendpacket
    jmp адрес_после_прыжка_к_этой_функции
Python:
# 0Z0SK0 blast.hk 2023

import pymem
import psutil
import ctypes
import mmap
import os

class Finder():
    def getAddress(self, base, offset):
        ## jump to base address
        self.pm = pymem.Pymem("gta_sa.exe")
        self.pointer = pymem.RemotePointer(self.pm.process_handle, base)

        ## jump to base+offset
        self.pointer = pymem.RemotePointer(self.pm.process_handle, self.pointer.value + self.offset)
        return self.pointer
   
    def getBase(self):
        self.all_pids = psutil.pids()
        for self.pid in self.all_pids:
            self.ps = psutil.Process(self.pid)
            if "gta_sa.exe" in self.ps.name():
                return pymem.process.base_address(self.ps.pid)
           
    def sendPacket(self, packet):
        self.f = os.open('gta_sa.exe', os.O_RDWR)
        self.buf = mmap.mmap(self.f, 0)

        ftype = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_int)
        fpointer = ctypes.c_void_p.from_buffer(self.buf)

        f = ftype(ctypes.addressof(fpointer))

        self.address = self.getAddress(self.getBase(), 0xA250)

        ## asm
        self.buf.write(
            f"mov eax, {packet}"
            f"call {self.address}"
        )

        ## perform
        f()

        del fpointer
        self.buf.close()

           
if __name__ == '__main__':
    Finder().sendPacket(1)
довольно наглядное и понятное объяснение, спасибо
 

0Z0SK0

Участник
37
15
Заинтересовала эта тема, и я начал писать SAMP-API для питона.
И вот пример вызова функции по адресу:
CRenderWareSA.py:
def RwStreamFindChunk(self, stream = RwStream(), type = c_uint(0), lengthOut = c_uint(0), versionOut = c_uint(0)):
        self.func_type = CFUNCTYPE(c_int, RwStream, c_uint, c_uint, c_uint)
        self.func = self.func_type(0x007ED2D0)
        return self.func(stream, type, lengthOut, versionOut)
 
  • Вау
Реакции: whyega52

TastyBread123

Известный
Автор темы
627
302
Заинтересовала эта тема, и я начал писать SAMP-API для питона.
И вот пример вызова функции по адресу:
CRenderWareSA.py:
def RwStreamFindChunk(self, stream = RwStream(), type = c_uint(0), lengthOut = c_uint(0), versionOut = c_uint(0)):
        self.func_type = CFUNCTYPE(c_int, RwStream, c_uint, c_uint, c_uint)
        self.func = self.func_type(0x007ED2D0)
        return self.func(stream, type, lengthOut, versionOut)
Есть что-то недоделанное, сам хотел написать подобное

 
  • Вау
  • Нравится
Реакции: whyega52 и reussssya