當前位置:首頁 » 編程語言 » python模塊源碼

python模塊源碼

發布時間: 2022-12-14 12:34:33

① 使用python語言如何保密源代碼以防止逆向工程

大家都很忙,誰有時間看你的的爛代碼!

如果真的怕泄露,別用python.

我以前做過這類事情,而且當時更嚴格,需要打包部署到客戶的服務只在有效期內有效,超過有效期必須更新證書才行。

Python代碼用任何方法都沒法保證保密性,這個時候你可以考慮用一個工具「nuitka」,這個工具會把你的python源代碼映射為c++然後編譯為二進制,因此對方是無論如何得不到你的源代碼的。

代價就是nuitka這個工具並不完美,有一些限制並不能100%完美的轉換所有python代碼。

1.用Cython編譯python成 Windows的pyd文件或Linux的so文件,二進制文件相對安全性較高。

2.用源碼混淆器把代碼搞的又臭又長。。。混淆完了再用Cython編譯為二進制。。。這樣靜態反編譯逆向難度也不小。

3.同其他語言程序一樣,可以對調試狀態進行檢測,當處於調試狀態時退出程序或進入混亂代碼耗費逆向工程人員心神。

4.分享一個跨平台反調試手段,檢測函數運行時間,加斷點會導致函數運行時間變長,也可感知正在被調試。

Python是提倡開源的,既然選擇Python還是擁抱開源才好~ 都開源還擔心逆向工程嘛

沒有不能逆的軟體。

只要匯編語言過關,逆向工程都是可以實現的,不要有其它想法。

你唯一可以做的,就是不讓別人用python讀取源代碼而已。那樣實現起來比較簡單。

python 適合開發伺服器程序,或者自己科研使用的程序,如果是 作為用戶程序,安裝到 pc 或手機上,還是 其它 c++ 或java 比較合適

1)可以把需要保護的部分用c語言實現,從而編譯成so等文件,這樣逆向的成本會比較高,可以防止直接打開python文件看到代碼邏輯。

2)so文件通過ida等工具也是可以反匯編的,可以通過對c語言進行代碼混淆,花指令等操作,提高通過ida等反匯編工具的分析難度。

3)不存在絕對無法逆向的技術手段,因此只能是看具體需求,選擇具體的防逆向的技術手段。

有工具類似py2exe轉成可執行程序,隱藏全部源代碼,雖然bytecode還是可以反編譯,但是難度大多了

1. 最穩的就是你改cpython載入代碼的過程,改zip包讀取最穩。

2. 藉助一些加密工具在編譯pyc之前進行一定的混淆,可以防君子,自我安慰一下。

商用一般都是用第一種辦法,小打小鬧用第二種。

可以考慮使用pymod工具,使用pymod pack 將模塊加密打包,發布的時候一個模塊就一個文件。

先睹為快,看看一個項目發布的時候,只有幾個文件,

main.py 項目程序入口

setting.py 項目配置

apps 項目模塊

plusins 項目插件目錄

創建項目 pymod create demo1

cd demo1

創建模塊 pymod add mod1

啟動pycharm 開始編寫功能模塊

一個模塊默認由三個文件組成

__init__.py 、 handlers.py 、param_schemas.py

業務邏輯主要在handlers.py中編寫

__init__.py

from pymod.blueprint import Blueprint api = Blueprint("/mod1") from .handlers import *

param_schemas.py

schema_sfz = { "type": "object", "required": ["sfz", "nl"], "properties": { "sfz": { "type": "string", "minLength": 18, "maxLength": 18, "description": "身份證明號碼" }, "nl": { "type": "integer", "minimum": 0, "maximum": 150, "description": "年齡" } } }

handlers.py

from . import api from pymod.ext import RequestHandler, params_validate,TrueResponse,FalseResponse from .param_schemas import schema_sfz from pymod.plugins import sfz_check @api.add_route('/hello') class Hello(RequestHandler): def get(self): self.write('Hello World') @params_validate(schema_sfz) def post(self): sfz = self.get_json_arg("sfz") nl =self.get_json_arg("nl") # self.write(TrueResponse(sfz=sfz, nl=nl)) if sfz_check.check_sfzmhm(sfz): self.write(TrueResponse(hint="身份證明號碼驗證通過")) else: self.write(FalseResponse(hint="身份證明號碼驗證失敗"))

三、項目部署

程序調試 修改setting.py

# 開發模式下 運行的模塊名稱必須填寫

moles = ["mod1"] moles_config ={ "mod1": { "deny_ip": "", "allow_ip": "*" } }

啟動程序 python main.py

調試沒有問題,進入發布模式

在項目目錄下

pymod pack mod1

在target目錄下生成mod1.mod文件,將其復制到apps目錄中

修改setting.py

# 開發模式下 運行的模塊名稱必須填寫

moles = []

再次運行 python main.py 測試

一切OK,系統就可以發布了。

說不能保密的,是沒有研究過python的機制的。我做個一個項目,所有源代碼自定義加密,運行時解密。

② #抬抬小手學Python# 用別人代碼完成我的工作,愉快摸魚「附源碼」

模塊是一個概念,它包含 1~N 個文件,如果文件是 Python 代碼文件(就是.py 結尾的文件),那每個文件中可以包含函數,類等內容。

在公司工作,很多項目都是協作開發來完成,一個項目後面可能存在很多工程師,為了開發方便,每個人負責的功能函數或者類都盡量封裝在一個 模塊 中,模塊英文請記住 mole ,有的地方叫做 庫 ,也有的地方叫做 包(package) ,對於現階段的你來說,當成一樣的內容就好。

互聯網上存在大量的開源模塊,這些模塊最大的優勢就是免費,很多時候使用這些模塊能極大的提高編碼效率,這也是很多人喜歡 Python 的原因之一。

模塊學習的過程,不能按照語法結構來學習,它是一種抽象的知識,是一種代碼的設計方式。例如將寫好的函授放到模塊中。

接下來就將上面的函數整合到一個模塊中去,建立一個新的文件 stir_fry.py 然後將兩個函數復制到新的文件中。

stir_fry.py 文件包含那兩個函數

好了,完成任務,一個模塊創建完畢了,這個 stir_fry.py 文件就是一個模塊。

你現在腦中肯定出現黑人問號臉了,What?這就完了。是的,完了,一個低配模塊完成。

下面就可以拿著這個模塊給別人使用去了。會寫模塊成為大佬之後,就可以給新入行的菜鳥指點江山,寫模塊了。

在另一個文件中,可以通過 import 模塊名 導入一個模塊,例如導入剛才創建的 stir_fry 模塊。

注意要新建一個文件,文件名隨意但是不要與模塊同名。

如果想要使用模塊中的函數,只需要參考下述語法格式即可。

通過 stir_fry 調用模塊中的函數。

當通過 import stir_fry 導入模塊之後,該模塊內的所有函數都一次性導入到新文件中了。

如果不想導入模塊的所有函數,而只導入某個函數,使用一下語法可以解決該問題。

修改上一節案例:

直接導入模塊中的函數,使用時不需要通過 模塊名. 的方式調用,直接書寫函數名即可。

導入模塊中多個函數

語法格式如下:

導入模塊所有函數

語法格式如下:

剛才通過模塊導入函數你應該發現一個潛在的問題,就是函數名稱太長怎麼辦,除了名稱太長,還存在一種情況,模塊中的函數名稱與當前文件中函數的名稱,存在重名的風險。此時可以學習一個新的內容,通過 as 給模塊導入進來的函數起個別名,然後在該文件都使用別名進行編碼。

語法格式如下:

上述內容應用到案例中如下述代碼:

as 別名也可直接作用於模塊,語法格式如下:

隨著程序設計變的越來越復雜,只把函數放到模塊中已經不能滿足要求了,需要將更高級的內容放到模塊中,也就是類。

首先在 dog_mole.py 文件中定義一個類。

此時的 dog_mole 就是模塊的名稱,而在該模塊中只有一個類 Dog ,也可以在該模塊中多創建幾個類,例如:

與導入模塊的函數部分知識一樣,如果希望導入一個模塊中的類,可以直接通過下述語法格式實現:

使用模塊中的類,語法格式如下:

具體代碼不在演示,自行完成吧。

導入模塊的類和導入模塊的的函數用法是一致的。

新建一個 demo.py 文件,在該文件導入 dog_mole 模塊中的類。

從模塊中導入多個類

該方式與函數的導入也一致,語法格式如下:

導入模塊中所有類

學到這里,你應該已經發現導入模塊中的函數與導入模塊中的類,從代碼編寫的角度幾乎看不出區別,對比著學習即可。

導入類的時候也可以應用別名,同樣使用 as 語法。

學習到這里你對模塊是什麼,模塊怎麼用已經有了一個基本認知,接下來先不用自己寫一個特別牛的模塊,我們先把一些常見的模塊應用起來。

通過隨機數模塊可以獲取到一個數字,它的使用場景非常廣,例如 游戲 相關開發、驗證碼相關、抽獎相關,學習了隨機數之後可以完成一些非常不錯的小案例。

randint 方法

導入隨機數模塊之後,可以通過 randint 方法隨機生成一個整數,例如下述代碼:

反復運行代碼會得到一個 1~10 之間的數字,由此可以 randint 方法中的參數含義。

choice 方法

通過 choice 方法可以配合列表實現一些效果,choice 可以隨機返回列表中的一個元素。

如果你想知道 choice 方法的具體用法,還記得怎麼查詢嗎?

shuffle 方法

該方法可以將一個列表的順序打亂。

簡單挑選了 random 模塊中的三個方法做為說明,對於模塊的學習,後面將為每個模塊單開一篇文章書寫。

時間模塊是 Python 中非常重要的一個內置模塊,很多場景都離不開它,內置模塊就是 Python 安裝好之後自帶的模塊。

time 方法
time 模塊主要用於操作時間,該方法中存在一個 time 對象,使用 time 方法之後,可以獲取從 1970年1月1日 00:00:00 到現在的秒數,很多地方會稱作時間戳。

輸出內容:

sleep 方法
該方法可以讓程序暫停,該方法的參數是的單位是

使用語法格式為:

asctime 與 localtime 方法

以上兩個方法都可以返回當前系統時間,只是展示的形式不同。

time 模塊涉及的方法先只涉及這么多,後續滾雪球學習過程中在繼續補充。

Python 還內置了很多模塊,例如 sys 模塊、os 模塊、json 模塊、pickle 模塊、shelve 模塊、xml 模塊、re 模塊、logging 模塊等等內容,後續都將逐步學習到,有可能需要分開專題給大家講解。

Python 模塊,快速編碼的一種途徑,很多時候第三方模塊可以幫你解決大多數常見編碼場景,讓你在編碼的道路上飛奔。

③ 如何研究Python的源碼

安裝目錄就可以看到源碼,都是一個模塊一個py文件。

④ 我現在想把自己寫的python模塊源代碼封裝成dll,然後在別的python腳本里調用,可以嗎

可以的,只要把python模塊轉換成dll模塊,利用Python自帶的ctypes模塊載入調用就行。

ctypes 是Python的外部函數庫。它提供了與 C語言兼容的數據類型,並允許調用 DLL 或共享庫中的函數。可使用該模塊以純 Python 形式對這些庫進行封裝。

ctypes導出了cdll對象,在 Windows 系統中還導出了windll和oledll對象用於載入動態鏈接庫。通過操作這些對象的屬性,你可以載入外部的動態鏈接庫。cdll載入按標準的cdecl調用協議導出的函數,而windll導入的庫按stdcall調用協議調用其中的函數。

(4)python模塊源碼擴展閱讀:

載入調用DLL的相關方法:

1、載入DLL

載入的時候要根據你將要調用的函數是符合什麼調用約定的。

stdcall調用約定:兩種載入方式

Objdll = ctypes.windll.LoadLibrary("dllpath")

Objdll = ctypes.WinDLL("dllpath")

cdecl調用約定:也有兩種載入方式

Objdll = ctypes.cdll.LoadLibrary("dllpath")

Objdll = ctypes.CDLL("dllpath")

其實windll和cdll分別是WinDLL類和CDll類的對象。

2、調用dll中的方法

載入dll的時候會返回一個DLL對象(假設名字叫Objdll),利用該對象就可以調用dll中的方法。 e.g.如果dll中有個方法名字叫Add(注意如果經過stdcall聲明的方法,如果不是用def文件聲明的導出函數或者extern 「C」 聲明的話,編譯器會對函數名進行修改,這個要注意。)

調用:nRet = Objdll.Add(12, 15) 即完成一次調用。

⑤ 如何查看python源代碼

眾所周知,Python內建了許多函數模塊,並且我們可能還會安裝許多第三方模塊等等。

下面以getpass為例查看其源代碼。

1.help(getpass)

輸入該命令找到file路徑,並且可以查看其其提供的功能。

2.利用getpass.__file__查看位置

最後找到該文件,用記事本或其他編輯器打開即可。

3.PyCharm編輯器

在該類或方法上按住「ctr+滑鼠左鍵」可以快速查看源代碼。

4.dir(對象名)

該方法可以快速查看有哪些方法。

想要查看每個功能的解釋,用help(type(對象名))

python學習網,大量的免費python視頻教程,歡迎在線學習!

⑥ python源代碼

python在python shell中可以使用help(模塊名)來查看模塊的源碼和其提供的功能;如果使用PyCharm的話,查看模塊、類、方法的源碼只需要名稱上按住「ctr+滑鼠左鍵」可以快速查看源代碼。

⑦ python--怎麼查看模塊OS里listdir()函數的源代碼,也就是怎麼定義istdir()的代碼

去 python 官網下載 Gzipped source tar ball, 解壓縮後, 你會發現 Lib/os.py 文件這行代碼

from posix import *

可是沒有文件叫 posix.py 啊, 到底在那 ? 其實 posix mole 是 builtin 的其中一分子,如下所示範:

>>> import sys
>>> print sys.builtin_mole_names
(*__builtin__*, *__main__*, *_ast*, *_codecs*, *_sre*, *_symtable*, *_warnings*, *_weakref*, *errno*, *exceptions*, *gc*, *imp*, *marshal*, *posix*, *pwd*, *signal*, *sys*, *thread*, *zipimport*)
>>>

所以要去 Moles 目錄查找 c 代碼, 你會看見 posixmole.c, 打開它看見這行代碼:

{"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},

再尋找上面所得到的 posix_listdir method, 可以找到 listdir 源代碼:

static PyObject *
posix_listdir(PyObject *self, PyObject *args)
{
/* XXX Should redo this putting the (now four) versions of opendir
in separate files instead of having them all here... */
#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)

PyObject *d, *v;
HANDLE hFindFile;
BOOL result;
.... 省略
來自puthon吧

⑧ 在python中,怎麼查看numpy模塊中的exp函數源代碼

pipinstallipython
ipython

$pipenv--three
$python3.6-c"frompathlibimportPath;fn='Pipfile';Path(fn).write_text(Path(fn).read_text().replace('pypi.org','mirrors.aliyun.com/pypi'))"
$pipenvshell
$pipenvinstallnumpy
$pipenvopennumpy

⑨ python源代碼程序文件擴展名

python源代碼程序文件擴展名就是:

.py

熱點內容
網易郵箱賬號和密碼哪裡查看 發布:2025-01-23 10:09:37 瀏覽:306
java資料庫下載 發布:2025-01-23 10:04:33 瀏覽:247
基岩版伺服器改地址 發布:2025-01-23 09:59:33 瀏覽:506
android獲取sim卡 發布:2025-01-23 09:48:49 瀏覽:178
快捷指令自動清理緩存 發布:2025-01-23 09:45:41 瀏覽:77
數據結構演算法實現及解析 發布:2025-01-23 09:33:22 瀏覽:153
4k視頻存儲卡 發布:2025-01-23 09:22:13 瀏覽:843
怎麼看筆記本配置好壞怎麼對比 發布:2025-01-23 08:50:00 瀏覽:514
安卓q用起來怎麼樣 發布:2025-01-23 08:49:14 瀏覽:294
foreach資料庫 發布:2025-01-23 08:49:05 瀏覽:741