[英]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.