当前位置:   article > 正文

python0-常规操作_pyarmor能够被反编译吗

pyarmor能够被反编译吗

1,固定小数点后的位数

'''字符串格式化输出'''
'%.3f'%(10.1111111111)
'{:.3f}'.format(10.3333333333)
  • 1
  • 2
  • 3
'''浮点数四舍五入'''
>>> a = 0.123456789
>>> for i in range(9):
...     round(a, i)
  • 1
  • 2
  • 3
  • 4

2,文件校验器

import hashlib
res = hashlib.sha256()
i = 0
with open('pycharm-community-2021.1.1.exe', 'rb') as f:
    for line in f:
        print(line)
        res.update(line)
        i+=1
print(res.hexdigest())
print(i)

source = input('原始编码:')
print(str(res.hexdigest()) == source)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3,进制转换

3.1,

3.2,十进制转为固定长度的二进制
‘{:032b}’.format()

4,运行脚本后进入交互模式

python -i 脚本

5,虚拟环境设置

https://www.cnblogs.com/dcpeng/p/12251291.html (python virtualenv)
https://www.cnblogs.com/dcpeng/p/12257331.html (pycharm,创建直接用pycharm也可以)
如果你加了参数: --no-site-packages出现了错误virtualenv: error: unrecognized arguments: --no-site-packages,那可以去掉了。因为virtualenv早就默认这个参数了

virtualenv ~
  • 1

或者使用 --system-site-packages,但会将真实环境所有的库都复制过来

virtualenv --system-site-packages ~
  • 1

6,控制台输出带颜色的文字方法

https://www.cnblogs.com/Eva-J/p/8330517.html
如果要在cmd中显示颜色,需要加上

from colorama import init
init(autoreset=True)
  • 1
  • 2

7,python源码打包及加密(PyInstaller、Nuitka;cython、jmpy3、docker;PyArmor-收费;法律约束条款;靠服务收费而非产品收费;BeeWare)

  • 一、桌面图形程序(PyQt5、Tkinter、WxPython 等框架编写的图形程序)加密
    • 使用 PyInstaller: pyinstaller -F ***.py 进行打包,生成平台的二进制运行文件,比如 Windows 下的 exe 文件。但是使用 PyInstaller 编译打包出来的程序,很容易被反编译回去;比如,使用pyinstxtractor这个工具,就能把 PyInstallers 编译出来的 exe 还原回去;之后,再对还原出来的 pyc 文件进行反编译即可。
    • Nuitka 会将 Python 程序转化为 C 语言程序,然后再进行编译打包为二进制文件。众所周知,反编译 C 程序的难度是巨大的。以此,我们就极高地保障了图形界面程序的源码安全性。
  • 二 、Web 应用程序
    • 将 Python 代码文件编译为 C 文件,然后再将 C 文件编译为操作系统的动态链接库文件(Linux 下的 .so 文件和 Windows 下的 .pyd 文件)。以上步骤需要使用第三方库 cython,然后编写一个setup.py文件用来指定需要处理的 Python 文件,例如:
    from distutils.core import setupfromCython.Buildimport cythonizesetup(ext_modules = cythonize(["zmister.py"]))
    
    • 1
    • 有一个第三方库 jmpy3 对上述流程进行了优化,支持单个文件和整个项目进行编译,使用起来更加友好
    • 需要注意的是,使用这种方式加密后的文件需要使用生成时的 Python 版本,这也算是一个小缺点。但是这个缺点可以通过打包为 Docker 镜像的方式解决掉。
  • 三、通用加密
    • PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等 硬件设备。它的保障机制主要包括:
      • 加密编译后的代码块,保护模块中的字符串和常量
      • 在脚本运行时候动态加密和解密每一个函数(代码块)的二进制代码
      • 代码块执行完成之后清空堆栈局部变量
      • 通过授权文件限制加密后脚本的有效期和设备环境
    • 除了对 Python 代码进行加密,PyArmor 还能设置 Python 程序的许可方式,比如设置程序的使用期限、设置允许运行的设备、扩展其他认证方式等
    • 需要注意的是,pyarmor 是一个共享软件,安装之后处于试用模式,在试用模式下有一些限制,如果购买的话需298
    pip install pyarmor
    pyarmor obfuscate foo.py  #使用obfuscate选项对代码进行加密
    pyarmor licenses \--expired "2018-12-31" \--bind-disk "100304PBN2081SF3NJ5T" \--bind-mac "70:f1:a1:23:f0:94" \--bind-ipv4 "202.10.2.52" \        r001  #使用licenses      选项生成许可文件
    pyarmor obfuscate --with-license licenses/r001/license.lic foo.py  #使用--with-license参数指定许可文件
    pyarmor pack foo.py  #使用pack选项打包脚本
    
    • 1
    • 2
    • 3
    • 4
    • 5

https://mp.weixin.qq.com/s/qsLoVIB1tC8cVRMp2jmSUw

8,反射(由字符串获取与之同名的对象的值,getattr,globals())

  • getattr(object, name[, default]): 用于返回一个对象属性值,获取对象属性后返回值可直接使用。
>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')        # 获取属性 bar 值
1
>>> getattr(a, 'bar2')       # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3)    # 属性 bar2 不存在,但设置了默认值
3
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 对于当前全局变量进行反射有两种方法: getattr, globals()
'''方法1'''
>>> a = 1
>>> getattr(sys.modules['__main__'], 'a')
1
'''方法2'''
>>> globals()['a']
1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • globals()还可以用于使用字符串生成变量名
>>> globals()['cccc']=1
>>> cccc
1
  • 1
  • 2
  • 3

9,Python图像库PIL的类Image及其方法

https://blog.csdn.net/leemboy/article/details/83792729

10,Python与C混编

Cython入门教程 : https://www.jianshu.com/p/cfcc2c04a6f5
用Cython加速Python到“起飞”:https://www.jb51.net/article/166720.htm
Python/C API Reference Manual: https://docs.python.org/3/c-api/index.html

11,cupy-一个由 CUDA 加速的 NumPy 兼容数组库

  • 安装
# For CUDA 8.0
pip install cupy-cuda80
 
# For CUDA 9.0
pip install cupy-cuda90
 
# For CUDA 9.1
pip install cupy-cuda91
 
# For CUDA 9.2
pip install cupy-cuda92
 
# For CUDA 10.0
pip install cupy-cuda100
 
# For CUDA 10.1
pip install cupy-cuda101
 
# Install CuPy from source
pip install cupy
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 应用
    https://docs.cupy.dev/en/stable/

12,样板代码合集网站

https://www.programcreek.com/python/

13,安装python后cmd输入python和pip无效

将***\python以及***\python\Scripts配置到环境变量中

14,pip配置国内镜像源

https://blog.csdn.net/weixin_42151880/article/details/108084264
pycharm中也可以设置

15,dll注入

  • dll(dynamic lick library,动态链接库;与静态链接库相对),是windows系统中实现共享函数库概念的一种方法,这些库函数的扩展名是’.dll’,’.ocx’(包含activex控制的库),’.drv’(旧式的系统驱动)。
  • dll注入:可以利用dll机制实现进程通信或控制其他进程的应用程序。dll注入是让进程A前行加载程序B给定的a.dll,并执行程序B给定的a.dll中的代码。进程A不会主动加载B给定的a.dll,需要程序B通过某种手段让A加载,此时a.dll进入进程A的地址空间,并对进程A产生影响。
  • 正常需要dll注入的情况:
    • 为目标进程添加新的实用功能;
    • 需要一些手段辅助调试被注入dll的进程;
    • 为目标进程安装钩子程序(API Hook,可以截获数据流中的数据,对数据进行修改后发送给指定的进程/或者直接丢弃,pytorch中也有类似的概念)。
  • dll注入的方法:
    • 修改注册表
    • 使用CreateRemoteThread函数对运行中的进程注入dll
    • 使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll(杀毒软件常用钩子进行处理)
    • 替换应用程序一定会使用的dll
    • 将dll作为调试器注入
    • 用CreateProcess对子程序注入dll
    • 修改被注入进程的exe的导入地址表
  • 利用python调用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll
    • ctypes是python外部函数库,从python2.5开始引入,提供了c兼容的数据类型,并且允许调用动态链接库/共享库中的函数,它可以将这些库包装起来给python使用。
    • ctypes.windll.user32
  • 消息钩子:Windows操作系统为用户提供了GUI(Graphic User Interface,图形用户界面),以事件驱动方式工作。在操作系统中借助键盘、鼠标、选择菜单、按钮、移动鼠标、改变窗口大小时,操作系统会将事先定义好的消息发送给相应的应用程序,应用程序分析收到的消息并进行执行。也就是说,敲击键盘时,消息会从操作系统移动到应用程序,消息钩子则可在此期间提取这些信息。

16,字典根据value得到key:

'''方法1'''
def get_key(value):
    for k,v in dict.items():
        if value == v:
            return k
'''方法2:反转字典'''
new_dict = {v:k for k,v in dict.items()}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

17,多重条件排序

sorted中的key函数返回元组,会先按照元组第一个元素排序;如果第一个元素相同,按照元组第二个元素排序。

  • 按照元组的第一个从小到大排序
  • 如果第一个相同 则按照元组第2个从大到小 排序
a = [[2,3],[4,1],(2,8),(2,1),(3,4)]
b = sorted(a,key=lambda x: (x[0], -x[1]))
print b
  • 1
  • 2
  • 3
musicBase = {'a': 5, 'b': 4, 'c': -2, 'd': -1, 'e': -1, 'f': 4}
musicSorted = sorted(musicBase.items(), key=lambda x: (x[1], -ord(x[0][-1])), reverse=True)
  • 1
  • 2

笔记

笔记1-python3中sort函数key如何对两个参数做对比
笔记2-装饰器模板
笔记3-递归
笔记4-抽象类
笔记5-新式类广度优先多继承的继承顺序
笔记6-网络编程
笔记7-类的装饰器(property, classmethod, staticmethod)
笔记8-多进程
笔记9-多线程
笔记10-协程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/500363
推荐阅读
相关标签
  

闽ICP备14008679号