精华内容
下载资源
问答
  • I would like to protect my python source code, I know there is no absolute protection possible, but still there should be some means to make it difficult enough to do or quite time-consuming....

    I would like to protect my python source code, I know there is no absolute protection possible, but still there should be some means to make it difficult enough to do or quite time-consuming. I want

    1) to remove all documentation, comments automatically and

    2) to systematically change the names of variables and functions within a module (obfuscation?), so that I can keep an external interface (with meaningful names) while the internal names of variables and functions are impossible to pronounce.

    Perhaps the best solution, which would make 1) and 2) redundant, is the following:

    3) Is there a simple way to compile python modules to .so libraries, with a clear interface and which can be used by other python modules? It would be similar as building C and C++ extensions with distutils, except that the source code is python itself rather than C/C++. The idea is to organize all "secret code" into modules, compile them, and then import them in the rest of the python code which is not considered secret.

    Again, I am aware that everything can be reverse-engineered, I think in pragmatic terms, most of the average developers would not be able to reverse-engineer code and even if they would be able, ethical/legal/timing reasons would make them think twice if they really want to work on this.

    解决方案

    As mgilson mentioned in the comments, Cython is probably your best bet here. Generally speaking, you can use it to convert your pure-python source code into compiled extension modules. While the primary intent of Cython is for enhanced performance, there shouldn"t be any barriers for using it for source-code protection. The extension modules it outputs aren"t limited in any special ways so anything you were able to do from within Python before, you should be able to do from the Cython-generated extension modules. Cython does have a few known limitations in terms of supported features that may need to be worked around but, overall, it looks well suited to serving your purpose.

    展开全文
  • 如何保护服务端 Python 脚本

    千次阅读 2018-11-14 17:47:02
    如何保护运行在服务器端的 Python 代码是一个问题,和发布到客户端的代码可以打包成可执行文件不一样,服务器端的代码一般是以包(Package)的方式在运行,至多被编译成 .pyc 或者 .pyo,或者在放到一个压缩文件里面...

    如何保护运行在服务器端的 Python 代码是一个问题,和发布到客户端的代码可以打包成可执行文件不一样,服务器端的代码一般是以包(Package)的方式在运行,至多被编译成 .pyc 或者 .pyo,或者在放到一个压缩文件里面,但是不管怎么样,最终执行的时候都要解压到磁盘的某一个地方执行。

    这里介绍一种使用包 PyArmor 保护服务端 Python 源代码的方式,[PyArmor] 可以加密 Python 源代码,然后无缝替换原来的文件。一个被 [PyArmor] 加密后的源代码内容如下

    	__pyarmor__(__name__, __file__, b'\x0a\x01\x03\x0b\xf1......\x01\x03')
    

    这完全是一个正常的 Python 脚本,所以可以一对一替换原来的脚本。不仅仅如此,[PyArmor] 还会对每一个函数体进行单独加密,在函数被执行之前,解密函数正常执行。一旦函数执行完成,会重新加密函数体,确保运行时刻 Python 代码也不会被泄露[^1]。

    下面举例来说明,如何使用 [PyArmor] 加密一个服务器端的包 weblogin

    首先安装 [PyArmor]

    pip install pyarmor
    

    然后加密包,假设其位于 /path/to/project/weblogin

    cd /path/to/project
    pyarmor obfuscate -r weblogin/__init__.py
    

    加密脚本存放在 dist 下面,把下面所有的文件拷贝到原来目录,使用加密脚本覆盖原来的文件

    cp -a dist/* weblogin/
    

    最后按照原来的方式发布 weblogin 到服务器就可以了。

    了解 [PyArmor] 的更多功能,请访问 PyArmor 主页PyArmor 代码库


    [^1]PyArmor 加密原理

    展开全文
  • 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:961562169 写作目的: 今天帮朋友一个忙,要爬取一些大众点评上的数据。结果发现大众点评的防爬机制还挺...

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:961562169

    写作目的:

    今天帮朋友一个忙,要爬取一些大众点评上的数据。结果发现大众点评的防爬机制还挺多的,记录一下自己踩的坑。

    爬取目标

    主要是通过分类和地区爬取店铺简介中的名称,地址,人均价格,各种评价分数和评价数
    alt

    大众点评的保护机制

    主要有两点
    1.源码里加入了css反爬机制,主要是字体加密
    2.对IP地址的限制,程序自动爬取大概十几页会断一下,目测应该是大众限制了一段时间内单IP访问量不能突破某一阈值。不过因为是爬取简介页面,所以手动验证一下也可以,没有像爬具体页面那样的封IP,有条件的也可以用IP池换IP访问。

    应对方法

    破解css加密机制参考了Python爬虫如何破解css加密
    根据这篇文章建立字典后,对源码中的加密字符进行替换,然后通过正则匹配得到自己想要的部分

    
    
    	tree=etree.HTML(rep)
        li_list=tree.xpath('//div[@class="content"]/div/ul/li')
        for li in li_list:
            title = li.xpath('.//div[@class="tit"]/a/h4/text()')[0]
            tag = li.xpath('string(.//div[@class="tag-addr"]/a/span)')
            score = li.xpath(
                'string(.//div[@class="star_score score_50  star_score_sml"]/text()|.//div[@class="star_score score_40  star_score_sml"]/text()|.//div[@class="star_score score_45  star_score_sml"]/text())')
            comments = li.xpath('string(.//div[@class="comment"]/a[@class="review-num"]/b)')
            prize = li.xpath('string(.//div[@class="comment"]/a[@class="mean-price"]/b)')
            address = li.xpath('string(.//div[@class="tag-addr"]/a[@data-click-name="shop_tag_region_click"]/span)')
            localaddress = li.xpath('string(.//div[@class="tag-addr"]/span)')
            flavor = li.xpath('string(.//div[@class="txt"]/span[@class="comment-list"]/span[position()=1])')
            environment = li.xpath('string(.//div[@class="txt"]/span[@class="comment-list"]/span[position()=2])')
            service = li.xpath('string(.//div[@class="txt"]/span[@class="comment-list"]/span[position()=3])')
            print(title, tag, score, comments, prize, address, localaddress, flavor, environment, service)
            with open('大众广州日料.csv', 'a', encoding='utf-8-sig', newline='') as f:
                writer = csv.writer(f, dialect='excel')
                writer.writerow([title, tag, score, comments, prize, address, localaddress, flavor, environment, service])
    

    得到的结果

    还存在的问题

    woff 文件里有的文字数据和顺序都一样,但每个字对应的unicode 码不一样,所以用直接建立的字典会有些错误,想办法完善一下再放出完整代码。

    展开全文
  • python文件编译与pyc反编译

    千次阅读 2020-07-10 17:02:41
    当我们发布系统的时候不想让别人看到源代码,就需要将py文件编译生成pyc文件,对外只提供pyc文件。同样,如果拿到一个python程序,只有pyc文件,我们就无法看到源码,希望有办法反编译pyc文件以获得源码。 既然有反...

    pyc是编译py之后生成的二进制文件。当我们发布系统的时候不想让别人看到源代码,就需要将py文件编译生成pyc文件,对外只提供pyc文件。同样,如果拿到一个python程序,只有pyc文件,我们就无法看到源码,希望有办法反编译pyc文件以获得源码。

    既然有反编译的需求,为了保护pyc文件不被反编译,我们又希望找到一个方法来防止pyc文件被反编译。

    本文介绍了如何将py文件编译成pyc和pyo文件,也介绍了如何反编译pyc文件, 又给出了一种字节码混淆方法来防止pyc文件被反编译。

     

    1 编译py文件到pyc和pyo

    pyc是编译py之后生成的二进制文件,由python虚拟机来执行的。当我们发布系统的时候不想让别人看到源代码,就需要将py文件编译生成pyc文件,对外只提供pyc文件。

    同时,在模块被加载时,.pyc文件比.py文件更快

    但是pyc的内容跟python的版本相关,不同的版本编译后的pyc文件不同,2.5编译的pyc文件不能到3.5上执行.

     

     

    发布python软件的过程为:

    1. 生产pyc文件: python -m compileall .

    2. 删除py文件: find . -name “*.py” |xargs rm -rf

    3. 删除pycache目录: find . -name “pycache” |xargs rm -rf

    1.1 Python2 编译

    命令:

    python -m py_compile file.py

    python -m py_compile {file1,file2}.py

    编译完成后,生成的 .pyc文件在当前目录。

     

    可以使用-O或者-OO转换python命令来减少编译模块的大小

        -O转换会帮你去掉assert语句

        -OO转换会帮你去掉assert语句和__doc__文档字符串

    由于一些程序可能依赖于assert语句或文档字符串,应该在确认需要的情况下使用这些选项。

    例如 python –O -m py_compile file.py 会在本目录生成 file.pyo

     

    1.2 python3 编译

    Python3的编译和python2一样,只是在python3之后编译后的文件在pycache目录下,而不是与源文件同一目录。

    那么如何让python3实现生成的pyc与源代码在同一目录呢?可以加上-b参数,例如

    Python3 -m py_compile -b file.py

     

     

    1.3 批量编译

    python -m compileall DIR

    python3 -m compileall –b DIR

    DIR为需要编译的目录

    例如: python -m compileall .

     

    参数说明:

    usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [-i list] [directory|file ...]

     

    arguments: zero or more file and directory names to compile; if no arguments given,

               defaults to the equivalent of -l sys.path

     

    options:

    -l: don't recurse into subdirectories

    -f: force rebuild even if timestamps are up-to-date

    -q: output only error messages

    -d destdir: directory to prepend to file paths for use in compile-time tracebacks and in

                runtime tracebacks in cases where the source file is unavailable

    -x regexp: skip files matching the regular expression regexp; the regexp is searched for

               in the full path of each file considered for compilation

    -i file: add all the files and directories listed in file to the list considered for

             compilation; if "-", names are read from stdin

    1.4 代码实现

    单文件编译:

    import py_compile
    py_compile.compile('path') //path
    是包括.py文件名的路径

    批量编译:

          import compileall

    compileall.compile_dir('$dir')

     

    2反编译pyc

    如果只有pyc文件,我们是无法直接查看内容的,这时,就需要反编译工具将pyc文件反编译成py源程序。 这里介绍uncompyle6反编译工具。Pyc文件能够反编译的前提是文件没有被加密或者代码混淆。

    2.1 Uncompyle6安装

    > git clone https://github.com/rocky/python-uncompyle6.git

    > git checkout python-2.4

    > sudo python setup.py install

    如果没有报错,则安装成功了。

    2.2反编译

    执行命令:

    >uncompyle6 -o . *.pyc

    这时会在当前目录生成.py源文件。

    3 防止反编译pyc文件

    如何防止pyc文件被反编译呢? 这里介绍字节码混淆的方法,此方法能够抵挡低端的反编译手段,例如第2章的方法,但是,要到高手,还是抵挡不住。

    字节码混淆可以非常容易的欺骗通常的反汇编器和反编译器,同时不影响代码的正常执行。下面这个例子展示了如何欺骗Uncompyle6反编译器以及dis反汇编器:

    #一个简单的Python应用 sample1.py

    print 'Hello World'

    对其进行编译:

    python -m py_compile sample1.py

    对编译后的sample1.pyc使用Python内置dis模块反汇编:

          >>> import marshal,dis

    >>> fd = open('sample1.pyc', 'rb')

    >>> fd.seek(8)

    >>> sample1_code_obj = marshal.load(fd)

    >>> fd.close()

    >>> dis.dis(sample1_code_obj)

      1           0 LOAD_CONST               0 ('Hello World')

                  3 PRINT_ITEM

                  4 PRINT_NEWLINE

                  5 LOAD_CONST               1 (None)

                  8 RETURN_VALUE

    >>>

     

    以上的汇编代码笔者肉眼反汇编的结果如下:

    0 LOAD_CONST     0 ('Hello World') #加载co_consts[0]到栈顶,co_consts[0]存储着常量字符串'Hello World'

    3 PRINT_ITEM                       #打印栈顶到sys.stdout,即print 'Hello World'

    4 PRINT_NEWLINE                    #打印新行到sys.stdout,此指令因print语句而由编译器自动生成

    5 LOAD_CONST     1 (None)          #加载co_consts[1]到栈顶,co_consts[1]存储着None

    8 RETURN_VALUE                     #将栈顶返回给调用者,此两条指令为编译器自动生成

     

    现在我们修改sample1.pyc,在程序入口增加一条绝对跳转指令(可以使用UltraEdit 16进制插入功能修改pyc文件,”JUMP_ABSOLUTE 3”在Python 2.7中对应的字节码为 0x71 0x03 0x00。修改code string内容的同时应修改code string的长度,此处增加了一个3字节指令),使用内置dis模块反汇编的结果如下:

      1           0 JUMP_ABSOLUTE            3                 #自行添加

            >>    3 LOAD_CONST               0 ('Hello World')

                  6 PRINT_ITEM

                  7 PRINT_NEWLINE

                  8 LOAD_CONST               1 (None)

                 11 RETURN_VALUE

     

    如果读者对汇编代码有一定认识,就会明白此处的绝对跳转对Python虚拟机执行此程序基本没有影响(除了增加一个指令执行周期),然而这个绝对跳转将成功欺骗反编译器。使用Uncompyle6反编译的结果如下:

    <<< Error: Decompiling stopped due to <class 'uncompyle6.semantics.pysource.ParserError'>

    如果一个pyc文件无法被反编译,初级的破解者可能就会止步于此了,但对于有经验的工程师来说这还远远不够。同样的,我们还要让通常的反汇编器也无法工作才行。按下面的汇编代码继续加工上面的sample1.pyc。

    |   1           0 JUMP_ABSOLUTE        [71 06 00]     6

    |               3 LOAD_CONST           [64 FF FF] 65535 (FAKE!)

    |         >>    6 LOAD_CONST           [64 00 00]     0 (Hello World)

    |               9 PRINT_ITEM           [47 -- --]

    |              10 PRINT_NEWLINE        [48 -- --]

    |              11 LOAD_CONST           [64 01 00]     1 (None)

    |              14 RETURN_VALUE         [53 -- --]

     

    以上第二条指令的意思是加载code object常量表的第65535项到栈顶。在上述sample1.pyc中,常量表的长度为2,下标65535已超出常量表的范围,所以这是条非法指令。但由于第一条绝对跳转的存在,第二条指令永远都不会被执行。通常的反汇编器如dis会尽全力列举有用的信息,但并不能理解实际执行的控制流,当反汇编器尝试反汇编第二条指令时,会试着去读取code object常量表的第65535项并且抛出一个’tuple index out of range’的意外。Python内置dis模块的出错信息如下:

    >>> fd = open('sample1.pyc', 'rb')

    >>> fd.seek(8)

    >>> import marshal,dis

    >>> sample1_code_obj = marshal.load(fd)

    >>> dis.dis(sample1_code_obj)

      1           0 JUMP_ABSOLUTE            6

                  3 LOAD_CONST           65535

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

      File "C:\Python27\lib\dis.py", line 43, in dis

        disassemble(x)

      File "C:\Python27\lib\dis.py", line 96, in disassemble

        print '(' + repr(co.co_consts[oparg]) + ')',

    IndexError: tuple index out of range

    >>>

     

    现在Uncompyle6和dis都被欺骗了,代码得到了有效的保护。

    4 Reference

    https://blog.csdn.net/ir0nf1st/article/details/61650984

    https://www.cnblogs.com/nickchen121/p/10802465.html

    https://www.cnblogs.com/dkblog/archive/2009/04/16/1980757.html

    展开全文
  • 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:101677771 最近发现连续长时间盯着屏幕,眼睛实在是有点遭不住。对于我这种又想保护视力,又不想放下小说...
  • 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:961562169 听说抖音新版本的加密措施保护的很是严格,瞬间想皮一下~ 闲话少bb,直接刚~ 1、用到的工具...
  • 在日常工作中,要保护一下我们的商业机密嘛~ 如果按名单向客户逐一发文件,如果就发几份,那么可以采取用pdf...那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤Q
  • 任务52: VBA编程实现抓取网页源代码 任务53: VBA编程实现获取网页表格写入数据表 第6章: MySQL数据库安装、配置与可视化工具 任务54: 安装MySQL 任务55: 使用CMD登录mysql 任务56: 数据库数据类型 任务57: ...
  • 如何源代码构建(不推荐) 在Visual Studio中克隆此存储库 安装所有必需的软件包并进行构建 Python? 切换到分支(无可执行文件)。 Windows Defender是否检测为恶意软件? 不幸的是,由于.exe未被签名(这为...
  • 开始之前,首先要感谢一下TPYBoard技术交流群(157816561)-云之...同时还有另外一个重要的功能,就是可以很好的保护源代码。比起生成mpy加密文件这种方式来说,显然添加到固件中会更加安全可靠。 搭建micropytho...
  • 无论何种API何种语言,HanLP接口在语义上保持一致,在代码上坚持开源。 轻量级RESTful API 仅数KB,适合敏捷开发、移动APP等场景。服务器算力有限,匿名用户配额较少,建议申请公益API秘钥auth。 Python pip ...
  • 接触过Python语言的人都知道,Python可以编译成.pyc文件,它是一种二进制文件,可以提高程序的加载速度,同时 也是一种保护源代码的有效方法。那么在micropython中,又该如何保护源程序呢? 贴心的micropython创始人...
  • 这是我的个人网站的源代码,托管在。 该网站是使用Github Pages和Jekyll构建的,并且受GPL版本3许可证的保护。 由于此站点现在有两个分支散布在互联网上,因此将来我计划将我的主题设为真正的Jekyll主题,并提供更...
  • PHP加解密软件

    2011-12-24 11:55:32
     经过一段时间的学习,相信大家已经能编出一些像模像样的PHP程序了,但因为PHP是明码的脚本语言,如何保护自己的程序就提到了日程上来。记得我有个非常好的朋友曾经向我大倒苦水,原来他加了半个月的夜班,给别人...
  • CVE-2020-2546,CVE-2020-2915 CVE-2020-2801 CVE-2020-2798 CVE-2020-2883 CVE-2020-2884 CVE-2020-2950 WebLogic T3 payload exploit poc python3|CVE-2020-2883-Weblogic coherence.jar RCE|WebLogic-Shiro-shell...
  • RED HAT LINUX 6大全

    热门讨论 2011-10-21 18:46:06
    9.1.2 自己构造源代码 156 9.2 服务器运行配置的设置 157 9.2.1 编辑httpd.conf文件 158 9.2.2 .htaccess文件和访问限制 160 9.3 虚拟主机 161 9.3.1 基于地址的虚拟主机 161 9.3.2 基于名字的虚拟主机 162 9.4 日志...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    实现:事物是如何工作的特殊细节(如何做) 扩展机制 约 束:允许对模型元素添加新的规则 构造型:基于已有的建模元素引入新的建模元素 标记值:允许为模型元素添加新的特性,是带有相关值得关键字 JAVA开发平台体系...
  • 1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI...
  • 1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI...
  • MYSQL中文手册

    2013-03-11 21:21:34
    1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3....
  • 1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. ...
  • MySQL 5.1参考手册

    2010-04-20 22:02:50
    1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI...
  • 1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI...
  • 7.6.1 建立数据 118 7.6.2 数据的导入 118 第三部分 基础知识 119 第8章 数据库设计概论 120 8.1 参考读物 120 8.2 数据表类型 121 8.2.1 MyISAM数据表 121 8.2.2 InnoDB数据表 122 8.2.3 HEAP数据表 123 ...
  • MySQL 5.1参考手册.chm

    热门讨论 2011-12-07 13:53:37
    1.7. MySQL信息 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

python如何保护源代码

python 订阅