Ejemplo n.º 1
0
def main():
    if len(sys.argv) != 2:
        print("[ pyrasite memory viewer ]\n")
        print("Usage: %s <pid> <objects.json>" % sys.argv[0])
        print("\n    pid - the running process id")
        print("")
        sys.exit(1)

    pid = int(sys.argv[1])
    payload = abspath(join(dirname(__file__), '..',
            'payloads', 'dump_memory.py'))
    pyrasite.inject(pid, payload)

    filename = '/tmp/pyrasite-%d-objects.json' % pid
    
    # Work around bug caused by meliae dumping unicode strings:
    # https://bugs.launchpad.net/meliae/+bug/876810
    with open(filename) as sample_file, open(filename + '.tmp', 'w') as output_file:
        pattern = re.compile(r"(?<!\\)\\u([dD][0-9a-fA-F]{3,3})")
        for line in sample_file:
            output_file.write(pattern.sub("#S\g<1>", line))
    os.rename(filename + '.tmp', filename)

    objects = loader.load(filename)
    objects.compute_referrers()

    PyrasiteMemoryViewer(pid=pid, objects=objects).main()
Ejemplo n.º 2
0
 def test_injecting_into_all_interpreters(self):
     program = generate_program()
     try:
         for exe in interpreters():
             print("sys.executable = %s" % sys.executable)
             print("injecting into %s" % exe)
             p = run_program(program, exe=exe)
             pyrasite.inject(p.pid,
                     'pyrasite/payloads/helloworld.py', verbose=True)
             stop_program(p)
             stdout, stderr = p.communicate()
             self.assert_output_contains(stdout, stderr, 'Hello World!')
     finally:
         os.unlink(program)
Ejemplo n.º 3
0
def main():
    ptrace_check()

    parser = argparse.ArgumentParser(
            description='pyrasite - inject code into a running python process',
            epilog="For updates, visit https://github.com/lmacken/pyrasite")

    parser.add_argument('pid', nargs='?',
                        help="The ID of the process to inject code into")
    parser.add_argument('payload', nargs='?', default='',
                        help="The Python script to be executed inside the"
                             " running process.  Can be one of the standard"
                             " payloads (see --list-payloads) or a filename.")
    parser.add_argument('-l', '--list-payloads', help='List standard payloads',
                        default=False, action='store_const', const=True)
    parser.add_argument('--gdb-prefix', dest='gdb_prefix',
                        help='GDB prefix (if specified during installation)',
                        default="")
    parser.add_argument('--verbose', dest='verbose', help='Verbose mode',
                        default=False, action='store_const', const=True)

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(1)

    args = parser.parse_args()

    if args.list_payloads:
        print("Available payloads:")
        for payload in list_payloads():
            print("  %s" % payload)
        sys.exit()

    try:
        pid = int(args.pid)
    except ValueError:
        print("Error: The first argument must be a pid")
        sys.exit(2)

    filename = expand_payload(args.payload)
    if filename:
        if not os.path.exists(filename):
            print("Error: Invalid path or file doesn't exist")
            sys.exit(3)
    else:
        print("Error: The second argument must be a filename or a payload name")
        sys.exit(4)

    pyrasite.inject(pid, filename, verbose=args.verbose,
                    gdb_prefix=args.gdb_prefix)
Ejemplo n.º 4
0
def main():
    ptrace_check()

    parser = argparse.ArgumentParser(
            description='pyrasite - inject code into a running python process',
            epilog="For updates, visit https://github.com/lmacken/pyrasite")

    parser.add_argument('pid', nargs='?',
                        help="The ID of the process to inject code into")
    parser.add_argument('payload', nargs='?', default='',
                        help="The Python script to be executed inside the"
                             " running process.  Can be one of the standard"
                             " payloads (see --list-payloads) or a filname.")
    parser.add_argument('-l', '--list-payloads', help='List standard payloads',
                        default=False, action='store_const', const=True)
    parser.add_argument('--gdb-prefix', dest='gdb_prefix',
                        help='GDB prefix (if specified during installation)',
                        default="")
    parser.add_argument('--verbose', dest='verbose', help='Verbose mode',
                        default=False, action='store_const', const=True)

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(1)

    args = parser.parse_args()

    if args.list_payloads:
        print("Available payloads:")
        for payload in list_payloads():
            print("  %s" % payload)
        sys.exit()

    try:
        pid = int(args.pid)
    except ValueError:
        print("Error: The first argument must be a pid")
        sys.exit(2)

    filename = expand_payload(args.payload)
    if filename:
        if not os.path.exists(filename):
            print("Error: Invalid path or file doesn't exist")
            sys.exit(3)
    else:
        print("Error: The second argument must be a filename or a payload name")
        sys.exit(4)

    pyrasite.inject(pid, filename, verbose=args.verbose,
                    gdb_prefix=args.gdb_prefix)
Ejemplo n.º 5
0
 def test_many_payloads_into_program_with_many_threads(self):
     program = generate_program(threads=25)
     num_payloads = 25
     try:
         for exe in interpreters():
             p = run_program(program, exe=exe)
             for i in range(num_payloads):
                 pyrasite.inject(p.pid,
                         'pyrasite/payloads/helloworld.py', verbose=True)
             stop_program(p)
             stdout, stderr = p.communicate()
             count = 0
             for line in stdout.decode('utf-8').split('\n'):
                 if line.strip() == 'Hello World!':
                     count += 1
             assert count == num_payloads, "Read %d hello worlds" % count
     finally:
         os.unlink(program)
Ejemplo n.º 6
0
def main():
    if len(sys.argv) != 2:
        print("[ pyrasite memory viewer ]\n")
        print("Usage: %s <pid> <objects.json>" % sys.argv[0])
        print("\n    pid - the running process id")
        print("")
        sys.exit(1)

    pid = int(sys.argv[1])
    payload = abspath(join(dirname(__file__), '..',
            'payloads', 'dump_memory.py'))
    pyrasite.inject(pid, payload)

    filename = '/tmp/pyrasite-%d-objects.json' % pid
    objects = loader.load(filename)
    objects.compute_referrers()

    PyrasiteMemoryViewer(pid=pid, objects=objects).main()
Ejemplo n.º 7
0
def main():
    if len(sys.argv) != 2:
        print("[ pyrasite memory viewer ]\n")
        print("Usage: %s <pid> <objects.json>" % sys.argv[0])
        print("\n    pid - the running process id")
        print("")
        sys.exit(1)

    pid = int(sys.argv[1])
    payload = abspath(
        join(dirname(__file__), '..', 'payloads', 'dump_memory.py'))
    pyrasite.inject(pid, payload)

    filename = '/tmp/pyrasite-%d-objects.json' % pid
    objects = loader.load(filename)
    objects.compute_referrers()

    PyrasiteMemoryViewer(pid=pid, objects=objects).main()
Ejemplo n.º 8
0
def main():
    ptrace_check()

    parser = argparse.ArgumentParser(
            description='pyrasite - inject code into a running python process',
            epilog="For updates, visit https://github.com/lmacken/pyrasite")
    parser.add_argument('pid',
                        help="The ID of the process to inject code into")
    parser.add_argument('filename',
                        help="The Python script to be executed inside the"
                             " running process, also referred to as 'payload'")
    parser.add_argument('--gdb-prefix', dest='gdb_prefix',
                        help='GDB prefix (if specified during installation)',
                        default="")
    parser.add_argument('--verbose', dest='verbose', help='Verbose mode',
                        default=False, action='store_const', const=True)

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(1)

    args = parser.parse_args()

    try:
        pid = int(args.pid)
    except ValueError:
        print("Error: The first argument must be a pid")
        sys.exit(2)

    filename = args.filename
    if filename:
        if not os.path.exists(filename):
            print("Error: Invalid path or file doesn't exist")
            sys.exit(3)
    else:
        print("Error: The second argument must be a filename")
        sys.exit(4)

    pyrasite.inject(pid, filename, verbose=args.verbose,
                    gdb_prefix=args.gdb_prefix)
Ejemplo n.º 9
0
 def inject(self):
     """Inject the payload into the process."""
     filename = self.create_payload()
     pyrasite.inject(self.pid, filename)
     os.unlink(filename)
Ejemplo n.º 10
0
'''
inject variables into the running simulations, so that they finish off quicker
works only with python2
'''
import time
import os
import subprocess
import pyrasite

process = subprocess.Popen(
    "pgrep -f no_dist_model.py",
    shell=True,
    stdout=subprocess.PIPE,
)
stdout = process.communicate()[0]
stdout_list = stdout.split('\n')

for pid in stdout_list:
    print("##Injecting: ", pid)
    pyrasite.inject(int(pid), "inject.py", verbose=True)
Ejemplo n.º 11
0
 def inject(self):
     """Inject the payload into the process."""
     filename = self.create_payload()
     pyrasite.inject(self.pid, filename)
     os.unlink(filename)
Ejemplo n.º 12
0
def main():
    ptrace_check()

    parser = argparse.ArgumentParser(
            description='pyrasite - inject code into a running python process',
            epilog="For updates, visit https://github.com/lmacken/pyrasite")

    parser.add_argument('pid', nargs='?',
                        help="The ID of the process to inject code into")
    parser.add_argument('payload', nargs='?', default='',
                        help="The Python script to be executed inside the"
                             " running process.  Can be one of the standard"
                             " payloads (see --list-payloads) or a filname.")
    parser.add_argument('-l', '--list-payloads', help='List standard payloads',
                        default=False, action='store_const', const=True)
    parser.add_argument('--gdb-prefix', dest='gdb_prefix',
                        help='GDB prefix (if specified during installation)',
                        default="")
    parser.add_argument('--verbose', dest='verbose', help='Verbose mode',
                        default=False, action='store_const', const=True)
    parser.add_argument('--output', dest='output_type', default='procstreams',
                        action='store',
                        help="Set where output is to be printed. 'procstreams'" 
                             " prints output in stdout/stderr of running process"
                             " and 'localterm' prints output in local terminal.")
    parser.add_argument('--ipc-timeout', dest='ipc_timeout', default=5,
                        action='store', type=int,
                        help="The number of seconds to wait for the injected"
                             " code to reply over IPC before giving up.")

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(1)

    args = parser.parse_args()

    if args.list_payloads:
        print("Available payloads:")
        for payload in list_payloads():
            print("  %s" % payload)
        sys.exit()

    # Make sure the output type is valid (procstreams || localterm)
    if args.output_type != 'procstreams' and args.output_type != 'localterm':
        print("Error: --output arg must be 'procstreams' or 'localterm'")
        sys.exit(5)

    try:
        pid = int(args.pid)
    except ValueError:
        print("Error: The first argument must be a pid")
        sys.exit(2)

    filename = expand_payload(args.payload)
    if filename:
        if not os.path.exists(filename):
            print("Error: Invalid path or file doesn't exist")
            sys.exit(3)
    else:
        print("Error: The second argument must be a filename or a payload name")
        sys.exit(4)

        
    
    if args.output_type == 'localterm':
        # Create new IPC connection to the process.
        ipc = pyrasite.PyrasiteIPC(pid, 'ReversePythonConnection',
                                   timeout=ipc_timeout)
        ipc.connect()
        print("Pyrasite Shell %s" % pyrasite.__version__)
        print("Connected to '%s'" % ipc.title)

        # Read in the payload
        fd = open(filename)
        payload = fd.read()
        fd.close

        # Run the payload, print output, close ipc connection
        print(ipc.cmd(payload))
        ipc.close()
    else:
        pyrasite.inject(pid, filename, verbose=args.verbose,
                        gdb_prefix=args.gdb_prefix)