簡體   English   中英

如何從內存地址重建Python函數?

[英]How to reconstruct Python function from memory address?

>> def spam():
...   print("top secret function")
... 
>>> print(spam)
<function spam at 0x7feccc97fb78>
>>> spam = "spam"

所以我失去了對spam功能的引用。 我可以從那個內存地址取回它:0x7feccc97fb78?

>>> orig_spam_function = get_orig_func_from_memory_address("0x7feccc97fb78")

編輯回復thefourtheye ):

抱歉這個糟糕的問題,請考慮以下情況:

>>> from collections import defaultdict
>>> d = defaultdict(spam)
>>> d
defaultdict(<function spam at 0x7f597572c270>, {})

所以功能還沒有被收集。 我可以恢復嗎? 當然,在這種情況下,您可以使用default_factory屬性。

>>> d.default_factory
<function spam at 0x7f597572c270>

但想象一下沒有default_factory屬性的defaultdict

當你分配

spam = "spam"

spam功能的最后一次引用消失了,引用計數變為0,稍后將進行垃圾回收。 所以,沒有辦法,我們可以把它拿回來。 我們可以通過這個程序檢查一下

def spam():
    print("top secret function")
import sys
print id(spam), sys.getrefcount(spam)
spam = "spam"
print id(spam), sys.getrefcount(spam)

在我的機器上輸出

140068817052928 2
140068817075440 12

spam的實際地址與我們在賦值語句后看到的地址不同。 所以,它現在指向一個不同的對象。 但是,最初,引用計數為1( getrefcount將始終高於實際計數 )。 當我們重新分配spam ,現在沒有人真正指向該功能。 因此,它將為垃圾收集做好准備。

@thefourtheye提出了關於垃圾收集功能的一個好點。

但是,如果該函數沒有被垃圾收集,您可以在所有現有對象中查找它:

def spam():
    pass

spam2 = spam  # keep a reference
print spam
=> <function spam at 0x56d69b0>

import gc
[ obj for obj in gc.get_objects() if id(obj) == 0x56d69b0 ]
=> [<function __main__.spam>]

這不是一種有效的方法(掃描內存中的所有對象),但這是一種方式。

從取證的角度來看,你可能會在分配操作后直接凍結執行,然后在內存中檢查該位置,(如果你知道如何解析python內存結構)如果你小心你可能能夠爬上你的回到一些操作代碼指令的方法,從那些你可能可以手動重寫函數或類似的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM