1. 程式人生 > >python 反編譯 pyc 一些心得

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可以減少些手動工作

Java程式碼  收藏程式碼
  1. import os  
  2. import sys  
  3. def displayFile(file):  
  4.     unPath= sys.executable  
  5.     unPath=unPath[ 0 : unPath.rfind( os.sep ) ]  
  6.     newname = file[0:file.rfind('.')] + '.py'  
  7.     command = "python -u "+unPath+"\scripts\uncompyle2 " + file + ">" + newname  
  8.     try:  
  9.         os.system(command)  
  10.     except e:  
  11.         print file  
  12. if __name__ == '__main__':  
  13.     #print unPath  
  14.     print 'init'  
  15.     displayFile('E:\\test.pyc')  
  16.     print 'finished'  
 

0x07 有經驗的py程式設計師會在釋出程式的時候修改pyc的頭8個位元組,這8個位元組是有特殊含義的

  1. 四個位元組的magic number
  2. 四個位元組的timestamp

頭四個是magic number 很多pyc都在這個上面做文章,這修改成不合法的,然後你反編譯就是敗了,一板你可以找你自己編譯成功的pyc頭直接覆蓋掉他的頭8個位元組就可以了, timestamp是檔案的修改時間,主要是當原始碼有改變的時候python 就可以重新生成pyc 檔案.