2013-10-27 50 views
1
import imp 
s = '' 
if imp.get_magic() != 'm\xf2\r\n': 
    raise RuntimeError, s 


try: 
    import zlib 
except: 
    raise RuntimeError, '' 

import marshal 
import sys 
import os 
for p in filter(os.path.exists, map(lambda p: os.path.join(p, 'ind.pyz'), sys.path)): 
    f = open(p, 'rb') 
    exec marshal.loads(zlib.decompress(f.read(905))) 
    boot('ind', f, 64608) 
    break 
import inca 

我在ind.pyc文件中有此代碼。現在我想知道:Python zlib解壓縮,元帥加載和啓動

這是什麼代碼?我可以看到用zlib首先905字節解壓縮ind.pyz? 然後啓動ind.pyz(第一個64608字節?)。我明白了,不是嗎?

「ind.pyz」這應該是什麼?一個可執行文件或編譯好的pyc,python文件? 我試圖反編譯.pyz文件,但我不能。並且是否有這些文件的反編譯軟件?

我真的被卡住了,這裏是ind.pyz文件(64kb)如何壓縮這個文件? https://mega.co.nz/#!hIkH3RSI!f3UDHGI9omXXN7jXHJKYTCpMCU0y8N3npop6a3tfmcw

回答

1

首先,marshal是內部系列化UTIL,其輸出取決於版本,所以你的代碼檢查它是否是正確的python版本編譯:

if imp.get_magic() != 'm\xf2\r\n': 
    raise RuntimeError, s 

然後它看起來通過sys.path的IND .pyz文件,並且當發現,讀取905個字節

f.read(905) 

那些905個叮咬consideres成爲ZLIB壓縮字符串,所以被解壓縮

zlib.decompress(f.read(905)) 

並導致串解組以一個python對象:

marshal.loads(zlib.decompress(f.read(905))) 

該目的反過來is executed。我想取消編組對象是一個Python代碼,但不會檢查它自己,我從不受信任來源不是解組代碼;)

在下一行,

boot('ind', f, 64608) 

boot不是內置python函數,所以它必須由exec語句定義。

+0

是否有可能從加載了marshal.loads()'''的字符串獲取源代碼?是「是」,怎麼樣? – alexandernst

+0

@alexandernst這是一個完全獨立的問題,我不知道簡單的答案;即使術語「源代碼」不清楚,爲了您的利益,我建議您開始一個新的線程,因爲更多的人會意識到這一點,並且問題可以得到更好的回答。 – alko

+0

我已經開始在這裏:http://stackoverflow.com/questions/20045395/marshal-loading-and-exec-ing'''源代碼'''是一個非常簡單明瞭的概念。獲取寫入的源代碼。 – alexandernst