python模块源码
① 使用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