python 反編譯 pyc 一些心得
0x01 , 現在用python的人也多了起來,程式碼安全始終是我們要考慮的問題,比如說我們要將我們的成果釋出出去,py直接釋出肯定是不行的(除非你是開源的),那麼我們就只能考慮釋出pyc檔案了,
0x02,今天討論的就是怎麼反編譯pyc到原始碼的技術,從道理上來講,這個是完全沒問題的,而且反編譯出來的程式碼質量應該相當高才對(參考java class的原理),在百度裡面搜尋的話,資訊量不夠,只有2.2以下版本的反編譯
0x03 ,利用google的話有個短小的討論比較有含金量
http://stackoverflow.com/questions/8189352/decompile-python-2-7-pyc
他提出了幾個開源的反編譯實現,其中比較知名的是uncompyle,經過git查詢我們可以發現uncompyle2這個是一個基於uncompyle的加強版本,所以可以考慮使用這個
0x04 https://github.com/wibiti/uncompyle2
下載,安裝
python setup.py install 沒什麼好說的
0x05 安好後怎麼用呢,這裡要注意,文件寫的不詳細,實際上是去找python目錄下/Scripts/uncompyle2 檔案執行,其實開啟 uncomple2就可以看到這個實際上是個py檔案,具體引數 -h可以看到
0x06 給大家一個我寫的小py可以減少些手動工作
- import os
- import sys
- def displayFile(file):
- unPath= sys.executable
- unPath=unPath[ 0 : unPath.rfind( os.sep ) ]
- newname = file[0:file.rfind('.')] + '.py'
- command = "python -u "+unPath+"\scripts\uncompyle2 " + file + ">" + newname
- try:
-
os.system(command)
- except e:
- print file
- if __name__ == '__main__':
- #print unPath
- print 'init'
- displayFile('E:\\test.pyc')
- print 'finished'
0x07 有經驗的py程式設計師會在釋出程式的時候修改pyc的頭8個位元組,這8個位元組是有特殊含義的
- 四個位元組的magic number
- 四個位元組的timestamp
頭四個是magic number 很多pyc都在這個上面做文章,這修改成不合法的,然後你反編譯就是敗了,一板你可以找你自己編譯成功的pyc頭直接覆蓋掉他的頭8個位元組就可以了, timestamp是檔案的修改時間,主要是當原始碼有改變的時候python 就可以重新生成pyc 檔案.