#1、前言 最近在學習Python逆向相關,涉及到python字節碼的閱讀,編譯及反彙編一些問題。通過長時間的學習有了一些眉目,爲了方便你們交流,特意將學習過程整理,造成了這篇專題。專題對python逆向的基礎知識進行了簡潔有效的解讀,暫不涉及python編譯過程當中的代碼混淆。文章中若有不恰當的地方敬請指正,我在學習過程當中也會對章節內容持續補充修正。html
#2、什麼是Pythonpython
Python 是一種解釋型、面向對象、動態數據類型的高級程序設計語言。 #3、解釋型語言和編譯型語言的區別編程
咱們編程都是用的高級語言,計算機不能直接理解高級語言,只能理解和運行機器語言,因此必需要把高級語言翻譯成機器語言,計算機才能運行高級語言所編寫的程序。翻譯的方式有兩種,一個是編譯,一個是解釋。編程語言
用編譯型語言寫的程序執行以前,須要一個專門的編譯過程,經過編譯系統(不單單只是經過編譯器,編譯器只是編譯系統的一部分)把高級語言翻譯成機器語言(具體翻譯過程能夠參看下圖),把源高級程序編譯成爲機器語言文件。學習
解釋型語言沒有嚴格編譯彙編過程,由解釋器將代碼塊按須要變運行邊翻譯給機器執行。所以解釋型語言一度存在運行效率底,重複解釋的問題。可是經過對解釋器的優化!能夠提升解釋型語言的運行效率。Python就屬於這一種編程語言。 #4、Python運行原理概述 Python是解釋型語言,沒有嚴格意義上的編譯和彙編過程。可是通常能夠認爲編寫好的python源文件,由python解釋器翻譯成以.pyc爲結尾的字節碼文件。pyc文件是二進制文件,能夠由python虛擬機直接運行。優化
注:有的朋友可能會問,爲何我運行python,有時候生成pyc文件,有時候沒有呢?Python在執行import語句時,將會到已設定的path中尋找對應的模塊。而且把對應的模塊編譯成相應的PyCodeObject(python中的一個類)中間結果,而後建立pyc文件,並將中間結果寫入該文件。而後,Python會import這個pyc文件,實際上也就是將pyc文件中的PyCodeObject從新複製到內存中。而被直接運行的python代碼通常不會生成pyc文件。翻譯
加載模塊時,若是同時存在.py和.pyc,Python會嘗試使用.pyc,若是.pyc的編譯時間早於.py的修改時間,則從新編譯.py並更新.pyc。 #5、綜述 經過上面的描述,咱們知道python在整個運行過程當中主要涉及源碼xxx.py,編譯好的文件xxx.pyc兩類文件。其中xxx.pyc是能夠由虛擬機直接執行的,是python將目標源碼編譯成字節碼之後再磁盤上的文件形式。設計