从外部获取正在运行的Python脚本的源代码 原始问题
我最近写了一个小Python脚本,它的作用类似于服务器,它有+/-200行长,并且没有被分成多个文件。原始文件已被删除,没有备份,但进程本身仍在运行 我知道下面的代码将读取当前脚本的源代码,但是假设文件仍然存在(并且该代码必须在包含脚本的脚本中) 我想知道的是,是否有可能在没有原始文件的情况下获得无限运行脚本的源代码。我目前正在使用一个基于Ubuntu Linux的服务器,但希望能有一个跨平台的解决方案。多谢各位从外部获取正在运行的Python脚本的源代码 原始问题,python,Python,我最近写了一个小Python脚本,它的作用类似于服务器,它有+/-200行长,并且没有被分成多个文件。原始文件已被删除,没有备份,但进程本身仍在运行 我知道下面的代码将读取当前脚本的源代码,但是假设文件仍然存在(并且该代码必须在包含脚本的脚本中) 我想知道的是,是否有可能在没有原始文件的情况下获得无限运行脚本的源代码。我目前正在使用一个基于Ubuntu Linux的服务器,但希望能有一个跨平台的解决方案。多谢各位 编辑 到目前为止,我只能读取脚本的反汇编字节码,或者直接读取变量。我需要该脚本的
编辑 到目前为止,我只能读取脚本的反汇编字节码,或者直接读取变量。我需要该脚本的主要原因是,在删除脚本时丢失数据库密码后,要将其取回 要做到这一点,我必须安装使用。 下面是我用来为Ubuntu安装所有必需库的命令列表:
# Installing GDB and the libraries I had to use
root@hostname:~# apt-get install glibc-source
root@hostname:~# apt-get install libc6-dbg
root@hostname:~# apt-get install gdb
# Installing pyrasite
root@hostname:~# pip install pyrasite
root@hostname:~# echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
一旦我安装了所有东西,我就使用pyrasite将一个Python空闲shell注入到正在运行的进程中,这样我就可以与代码交互
# Injecting a python IDLE shell into our process and retrieving variable values
root@hostname:~# ps aux | grep python
root 7589 0.0 1.3 230544 13296 pts/1 S 12:16 0:00 python main.py
root 7610 0.0 0.1 11284 1088 pts/0 S+ 12:19 0:00 grep --color=auto python
root@hostname:~# pyrasite-shell 7589
Pyrasite Shell 2.0
Connected to 'python main.py'
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(DistantInteractiveConsole)
>>>
因为我需要回我的数据库凭据,所以我只需将它们写入shell即可将其回显:
# There we go
>>> DB_USER
'root'
>>> DB_PASS
'********'
>>> DB_NAME
'SomeDatabase'
>>> DB_HOST
'127.0.0.1'
虽然脚本的源代码已经不存在了,但我们仍然可以使用dis
反编译内存中的对象,并将我们想要的方法传递给它。我还尝试使用inspect
模块,但尝试调用inspect.getsourcelines()
只会导致IOError
>>> import dis
>>> dis.dis(foo)
Disassembly of foo:
7 0 LOAD_CONST 1 ('Hello world')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
如果你想要返回的方法中有任何文本,你可以在那里找到它。我无法将此代码转换回可用的python,但我设法获得了所需的内容。您有权访问正在运行进程的服务器吗 那也许你可以试试 (免责声明:我本人从未使用过)
HTH,您有权访问正在运行进程的服务器吗 那也许你可以试试 (免责声明:我本人从未使用过)
HTH,吡咯石可能是您最好的选择,但这里有一个完全不可能的办法:尝试检查目录
/proc//fd/
中的文件,其中pid是您正在运行的脚本的进程id。如果您非常幸运,您可以恢复一个pyc
,然后可以对其进行反编译。吡咯石可能是您最好的选择,但这里有一个总的解决方案:尝试检查目录/proc//fd/
中的文件,其中pid是正在运行的脚本的进程id。如果你很幸运,你可以恢复一个pyc
,然后进行反编译。另外,如果你使用的是cpython,它将是内存中的字节码(.pyc),据我所知,原始源代码已经消失了。下面是wim的建议:尝试将进程内存转储到磁盘,在转储中找到字节码并在其上运行pycdc?只是大声想一想……另外,如果您使用的是cpython,它的副本将是内存中的字节码(.pyc),据我所知,原始源代码已经消失了。按照wim的建议:尝试将进程内存转储到磁盘,在转储中找到字节码并在其上运行pycdc?我可以完全访问服务器(根级别),谢谢,我会检查的。我认为这是个好主意。一旦获得了一个pyrasite外壳,您就可以沿着dir(sys.modules[\uuuu name\uuuu])
的思路运行一些东西,以获取作用域中定义的函数和变量,并反编译前者的代码,但是如何获得模块作用域代码的句柄呢?我可以完全访问服务器(根级别),谢谢,我会查的我觉得这是个好主意。一旦获得了一个吡咯石外壳,您就可以沿着dir(sys.modules[\uuuu name\uuuu])
的路线运行一些东西,以获得范围中定义的函数和变量,并反编译前者的代码,但是如何获得模块作用域代码的句柄呢?Python不保持源代码或字节码文件的打开状态。Python不保持源代码或字节码文件的打开状态。
>>> import dis
>>> dis.dis(foo)
Disassembly of foo:
7 0 LOAD_CONST 1 ('Hello world')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE