LINUX.ORG.RU

Помогите с чтением памяти.

 , ,


1

1

Здравствуйте, подскажите пожалуйста, смогу ли я реализовать чтение памяти другого процесса в Pythone? если да-то как? Конкретно интересует Wine приложение.

Пишу маленький скрипт-бот для игры, эмуляцию нажатия клавиш я реализовал через pyatspi, написал алгоритм нажатий, но этого мне оказалось мало и я решил глубже задаться этим вопросом.

Можно ли через Pythone найти ячейку памяти которая, допустим, сожержит количество HP персонажа, или хотя-бы читать эту ячейку, если она будет найдена через аналог Artmoney. Подскажите хотя-бы куда копать.

С линуксом общаюсь я не долго, всего около года сижу на Ubuntu. С Python знаком 2й день(кстати очень понравился, очень простой). Гуглил этот вопрос, но вразумительных ответов так и не нашел, только еще больше растерялся.

Посмотри, как реализовано, например, в DwarfTherapist.
Оно на питоне, если память не совсем отшибло, и именно чтением/записью в чужую память и занимается.

takino ★★★★★
()
Ответ на: комментарий от takino

takino: Посмотри, как реализовано, например, в DwarfTherapist. Оно на питоне, если память не совсем отшибло, и именно чтением/записью в чужую память и занимается.

http://www.ohloh.net/p/dwarftherapist говорят что она на C++ написана.

а мне если и брать C++, то я там месяц даже автокликкер буду писать, тяжело он мне дается совсем.

xandr24
() автор топика
Ответ на: комментарий от stderr

stderr: Нагуглил такой велосипед на python-ptrace

О, спасибо, это уже лучше.

Features: * High level Python object API * Able to control multiple processes: catch fork events * Read/write bytes to arbitrary addresses * Execution step by step using ptrace_singlestep() or hardware int 3 * Can use distorm disassembler * Dump registers, memory mappings, stack, etc. * Syscall tracer and parser (strace command)

а я уж подумал что Phyton такого не умеет.

xandr24
() автор топика
Ответ на: комментарий от stderr

вот бы мне еще кто помог разобраться )

#!/usr/bin/python
from ptrace.debugger.child import createChild
from ptrace.debugger import PtraceProcess
from ptrace.debugger import PtraceDebugger
from ptrace.binding import HAS_PTRACE_SINGLESTEP
from ptrace.disasm import HAS_DISASSEMBLER
from signal import SIGTRAP, SIGINT

PROGRAM=["./RainSlickEp2_bin"]
#instruction size, bytes
COOKIES=[
[0x080BAEEB,"\x0F\x94"],
[0x0819CF84,"\xeb"],
[0x0819CC6E,"\xeb"],
[0x0819C6A4,"\xeb"],
]


class loader():
    def __init__(self):
        self.program = PROGRAM
        self.debugger = PtraceDebugger()
    def run(self,args):
        return createChild(args, False , None)
    def attachProcess(self,pid):
        self.process = self.debugger.addProcess(pid,True)
    def step(self, enter_call, address=None):
        if (not HAS_PTRACE_SINGLESTEP) or (not enter_call):
            if address is None:
                address = self.process.getInstrPointer()
                size = self.readInstrSize(address, default_size=None)
                if not size:
                    return "Unable to read instruction size at %s" \
                        % str(address)
                address += size
            size = self.readInstrSize(address)

            # Set a breakpoint
            breakpoint = self.process.createBreakpoint(address, size)

            # Continue the process
            self.process.cont()
        else:
            # Use ptrace single step command
            self.process.singleStep()
            breakpoint = None

        # Execute processus until next TRAP
        try:
            self.process.waitSignals(SIGTRAP)
            if breakpoint:
                breakpoint.desinstall(set_ip=True)
        except:
            if breakpoint:
                breakpoint.desinstall()
            raise
        return None
    def readInstrSize(self, address, default_size=None):
        if not HAS_DISASSEMBLER:
            return default_size
        try:
            # Get address and size of instruction at specified address
            instr = self.process.disassembleOne(address)
            return instr.size
        except PtraceError, err:
            return default_size
    def Patch(self,cookie):
        print ""
        if HAS_DISASSEMBLER:
            print "Patching: " + str(self.process.disassembleOne(cookie[0]))
        else:
            print "Patching: " + str(cookie[0])

        self.process.writeBytes(cookie[0],cookie[1])

        if HAS_DISASSEMBLER:
            print "To: " + str(self.process.disassembleOne(cookie[0]))
    def main(self):
        self.pid = self.run(self.program)
        self.attachProcess(self.pid)
        print ("PID: " + str(self.pid))
        self.step(False)
        for cookie in COOKIES:
            self.Patch(cookie)
        self.process.detach()

if __name__ == "__main__":
    loader().main()

Если вот тут идет импорт с пакета ptrace неких функций( о боже, я не знаю даже как назвать то что импортируется, надеюсь это действительно фунуции, краснею), то остальное я понять могу с большим трудом.

from ptrace.debugger.child import createChild
from ptrace.debugger import PtraceProcess
from ptrace.debugger import PtraceDebugger
from ptrace.binding import HAS_PTRACE_SINGLESTEP
from ptrace.disasm import HAS_DISASSEMBLER

а вот это либо то как называется программа, либо название самого процесса к которому идет обращение.

 PROGRAM=["./RainSlickEp2_bin"] 

у меня это будет abc.exe допустим. и там есть 2 адреса: «ac8a210» и «6fd8a07c».

по сути мне нужно взять эти значения и записать их в переменную «a» и «b».

может еще поподсоветуете чего? :) правда я уже наглею, но не обессудьте, я еще совсем зеленый в этом деле. (а пока сам полез копаться, разбирать каждую строчку, благо тут не много кода).

xandr24
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.