PyArmor is a command line tool used to obfuscate python scripts

Overview

PyArmor

PyArmor is a command line tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts. It protects Python scripts by the following ways:

  • Obfuscate code object to protect constants and literal strings.
  • Obfuscate co_code of each function (code object) in runtime.
  • Clear f_locals of frame as soon as code object completed execution.
  • Verify the license file of obfuscated scripts while running it.

Also refer to The Security of PyArmor

Support Platforms

  • Python 2.7 and Python3
  • Prebuilt Platform: win32, win_amd64, linux_i386, linux_x86_64, macosx_x86_64
  • Embedded Platform: Raspberry Pi, Banana Pi, Orange Pi, TS-4600 / TS-7600 and more

Refer to support platforms

Quick Start

Installation

pip install pyarmor

Obfuscate scripts

pyarmor obfuscate foo.py

Run obfuscated scripts

python dist/foo.py

Pack obfuscated scripts into one bundle

pip install pyinstaller
pyarmor pack foo.py

Obfuscate scripts with an expired license

pyarmor licenses --expired 2018-12-31 r001
pyarmor obfuscate --with-license licenses/r001/license.lic foo.py

There is also a web-ui package pyarmor-webui

pip install pyarmor-webui

Start webui, open web page in browser (snapshots)

pyarmor-webui

More usage, refer to

License & Purchase

PyArmor is published as shareware, free trial version never expires, but there are some limitations:

  • The trial version could not obfuscate the big scripts
  • The trial version uses same public capsule other than private capsule
  • The trial version could not download the latest dynamic library of extra platforms

For details, refer to PyArmor License.

Change Logs

It describes the fixed issues, new features, incompatible issues in different versions.

It's recommended to read this carefully before upgrading pyarmor.

Report issuses

If there is any question, first check these questions and solutions, it may help you solve the problem quickly.

If there is no solution, for technical issue, click here to report an issue according to the issue template, for business and security issue send email to [email protected].

Comments
  • Access to raw code objects

    Access to raw code objects

    I obfuscated the following Python script.

    examples/test/mymod.py:

    from __future__ import division, absolute_import, print_function, unicode_literals
    
    def func2():
        print('func2')
    
    def func3():
        print(err)
    

    Build pyarmor:

    python pyarmor.py init --src=examples/test --entry=mymod.py projects/test
    
    python pyarmor.py config --disable-restrict-mode=1 projects/test
    
    cd projects/test
    ./pyarmor build
    

    In Python shell:

    >>> import mymod, dis
    >>> dis.dis(mymod)
    Disassembly of func2:
      4     >>    0 LOAD_GLOBAL              0 (print)
                  3 LOAD_CONST               1 (u'func2')
                  6 CALL_FUNCTION            1
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE        
                 14 NOP                 
                 15 NOP                 
                 16 NOP                 
                 17 NOP                 
                 18 NOP                 
                 19 NOP                 
                 20 NOP                 
                 21 NOP                 
                 22 NOP                 
                 23 NOP                 
                 24 JUMP_ABSOLUTE            0
    
    Disassembly of func3:
      7     >>    0 LOAD_GLOBAL              0 (print)
                  3 LOAD_GLOBAL              1 (err)
                  6 CALL_FUNCTION            1
                  9 POP_TOP             
                 10 LOAD_CONST               0 (None)
                 13 RETURN_VALUE        
                 14 NOP                 
                 15 NOP                 
                 16 NOP                 
                 17 NOP                 
                 18 NOP                 
                 19 NOP                 
                 20 NOP                 
                 21 NOP                 
                 22 NOP                 
                 23 NOP                 
                 24 JUMP_ABSOLUTE            0
    

    Is it the correct behaviour that you have access to the raw code objects of a module? So, what is the advantage of using pyarmor? Thanks.

    opened by joonis 118
  • Pyarmor是否可以对第三方工具supervisor的py源码程序加密?

    Pyarmor是否可以对第三方工具supervisor的py源码程序加密?

    您好!Pyarmor是否可以对第三方工具supervisor的py源码程序加密?我对supervisor的py源码程序进行加密,suservisorctl.py 执行完后报堆栈溢出错误。以下我的报错信息!

    *** Error in `python': corrupted double-linked list: 0x0000000001ee32f0 *** ======= Backtrace: ========= /lib64/libc.so.6(+0x7f3e4)[0x7f0b7fc0b3e4] /lib64/libc.so.6(+0x8132d)[0x7f0b7fc0d32d] /lib64/libpython2.7.so.1.0(+0x817d8)[0x7f0b809007d8] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x59c7b)[0x7f0b808d8c7b] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x9e254)[0x7f0b8091d254] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x817bf)[0x7f0b809007bf] /lib64/libpython2.7.so.1.0(+0x9e254)[0x7f0b8091d254] /lib64/libpython2.7.so.1.0(+0x808df)[0x7f0b808ff8df] /lib64/libpython2.7.so.1.0(+0x822a0)[0x7f0b809012a0] /lib64/libpython2.7.so.1.0(_PyModule_Clear+0x16c)[0x7f0b80905dac] /lib64/libpython2.7.so.1.0(PyImport_Cleanup+0x27f)[0x7f0b80975d3f] /lib64/libpython2.7.so.1.0(Py_Finalize+0xfe)[0x7f0b809817ee] /lib64/libpython2.7.so.1.0(Py_Main+0x6a5)[0x7f0b80992ba5] /lib64/libc.so.6(__libc_start_main+0xf5)[0x7f0b7fbae555] python[0x40068e] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:08 756171 /usr/bin/python2.7 00600000-00601000 r--p 00000000 08:08 756171 /usr/bin/python2.7 00601000-00602000 rw-p 00001000 08:08 756171 /usr/bin/python2.7 01a69000-01fc3000 rw-p 00000000 00:00 0 [heap] 7f0b6c000000-7f0b6c021000 rw-p 00000000 00:00 0 7f0b6c021000-7f0b70000000 ---p 00000000 00:00 0 7f0b72ce8000-7f0b72cfd000 r-xp 00000000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72cfd000-7f0b72efc000 ---p 00015000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72efc000-7f0b72efd000 r--p 00014000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72efd000-7f0b72efe000 rw-p 00015000 08:08 757853 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 7f0b72efe000-7f0b72f0a000 r-xp 00000000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b72f0a000-7f0b73109000 ---p 0000c000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b73109000-7f0b7310a000 r--p 0000b000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b7310a000-7f0b7310b000 rw-p 0000c000 08:08 758866 /usr/lib64/libnss_files-2.17.so 7f0b7310b000-7f0b731d1000 rw-p 00000000 00:00 0 7f0b731d1000-7f0b731d3000 r-xp 00000000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b731d3000-7f0b733d2000 ---p 00002000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b733d2000-7f0b733d3000 r--p 00001000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b733d3000-7f0b733d4000 rw-p 00002000 08:08 804984 /usr/lib64/python2.7/lib-dynload/syslog.so 7f0b733d4000-7f0b733d6000 r-xp 00000000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b733d6000-7f0b735d5000 ---p 00002000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b735d5000-7f0b735d6000 r--p 00001000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b735d6000-7f0b735d7000 rw-p 00002000 08:08 804903 /usr/lib64/python2.7/lib-dynload/resource.so 7f0b735d7000-7f0b735dc000 r-xp 00000000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b735dc000-7f0b737db000 ---p 00005000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b737db000-7f0b737dc000 r--p 00004000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b737dc000-7f0b737de000 rw-p 00005000 08:08 804904 /usr/lib64/python2.7/lib-dynload/selectmodule.so 7f0b737de000-7f0b73b5e000 rw-p 00000000 00:00 0 7f0b73b5e000-7f0b73b62000 r-xp 00000000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73b62000-7f0b73d61000 ---p 00004000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73d61000-7f0b73d62000 r--p 00003000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73d62000-7f0b73d63000 rw-p 00004000 08:08 804535 /usr/lib64/python2.7/lib-dynload/_localemodule.so 7f0b73d63000-7f0b73e23000 rw-p 00000000 00:00 0 7f0b73e23000-7f0b73e25000 r-xp 00000000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b73e25000-7f0b74024000 ---p 00002000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b74024000-7f0b74025000 r--p 00001000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b74025000-7f0b74026000 rw-p 00002000 08:08 804664 /usr/lib64/python2.7/lib-dynload/grpmodule.so 7f0b74026000-7f0b74066000 rw-p 00000000 00:00 0 7f0b74066000-7f0b7408d000 r-xp 00000000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b7408d000-7f0b7428d000 ---p 00027000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b7428d000-7f0b7428f000 r--p 00027000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b7428f000-7f0b74290000 rw-p 00029000 08:08 754673 /usr/lib64/libexpat.so.1.6.0 7f0b74290000-7f0b7429b000 r-xp 00000000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7429b000-7f0b7449a000 ---p 0000b000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7449a000-7f0b7449b000 r--p 0000a000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7449b000-7f0b7449d000 rw-p 0000b000 08:08 803410 /usr/lib64/python2.7/lib-dynload/pyexpat.so 7f0b7449d000-7f0b744ae000 r-xp 00000000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b744ae000-7f0b746ad000 ---p 00011000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b746ad000-7f0b746ae000 r--p 00010000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b746ae000-7f0b746b2000 rw-p 00011000 08:08 804584 /usr/lib64/python2.7/lib-dynload/datetime.so 7f0b746b2000-7f0b746b6000 r-xp 00000000 08:08 805277 /usr/lib64/python2.7/lib-dynload/zlibmodule.so 7f0b746b6000-7f0b748b5000 ---p 00004000 08:08 805277 /usr/lib64/python2.7/lib-dynload/zlibmodule.so 7f0b748b5000-7f0b748b6000 r--p 00003000 08:08 805277 /usr/lib64/python2.7/lib-dynload/zlibmodule.so

    opened by yq1320 62
  • Restrict Mode Examples?

    Restrict Mode Examples?

    Hi @jondy,

    I know your pretty busy resolving the issues that came about with 6.3.0, I was just wondering if i could get some clear proper examples of how to use the restrict modes..

    What im trying to do

    if i have a dir

    __init__.py
    packer.py
    

    I want __init__.py to be import-able with restrict 1, but how do i then also have packer.py restrict 3 so it cant be imported outside of the __init__.py?

    You doc doesn't cover proper examples things like this, it just doesn't make it clear enough , sorry

    opened by VeNoMouS 56
  • Issue with the pytransform and NameError:  '__pyarmor__'

    Issue with the pytransform and NameError: '__pyarmor__'

    Hello,

    Firstly, I should appreciate the work that you have put in here. It's pretty cool. It works great, however, I have some concerns for this package to use in some usual cases.

    1. This package works pretty good, If you want to secure a single python file, which again is not a usual case out in the production or in normal cases.
    2. If I tend to try the obfuscation on the python executables in a folder, one among all the files present in the folder work well, but the others throw NameError: name '__pyarmor__' is not defined, as they miss bootstrap-code. This is concerning.
    3. If I use pyarmor obfuscation on the python libraries as well as the executable, It turns out with the error : exception: _pytransform can not be loaded twice. Usually, It is equally important to secure both the libraries and its executable in python. Libraries are the place where you have most of the important info is present.
    4. So, It is likely impossible to completely secure the complete python package, such as below:
    packagename
     |- src/
        |- packagename/
          |- __init__.py
          |- yourfiles.py
     |- scripts/
        |- non-exported python files
    
    1. Moreover, the files that get generated when you obfuscate the code, _pytransform.so license.lic pytransform.key pytransform.py. These files are pretty much similar in most of the case, irrespective of the file you use to obfuscate, so why not to have them in a library, so that you don't need to have a huge duplication in the case of the packages with the libraries as above.

    Let me know your view on this, Thank you.

    opened by saikishor 51
  • Can't build a working exe when using super mode

    Can't build a working exe when using super mode

    • Happens only when we use super mode to obfuscate the project, when built with advanced 0 the obfuscated and packaged code works without any issue.
    • Packaged with pyinstaller (not pyarmor pack), spec file is changed to include different pytransform generated by super mode Datas = [('pytransform.pyd','.')...]

    Not sure how I can get more info that would be useful to find the issue, any ideas ?

    {
      "version": "2.0",
      "name": "Prod super mode build",
      "title": "Prod super mode build",
      "src": ".",
      "is_package": null,
      "manifest": "global-include *.py",
      "entry": "main.py",
      "output": "dist",
      "runtime_path": null,
      "restrict_mode": 2,
      "obf_code": 2,
      "obf_mod": 1,
      "wrap_mode": 1,
      "advanced_mode": 2,
      "bootstrap_code": 1,
      "cross_protection": 0,
      "plugins": null,
      "platform": "windows.x86_64.11.py37",
      "package_runtime": 1,
      "enable_suffix": 0,
      "license_file": null,
      "build_time": 1595425907.0985913
    }
    

    Debug

    Microsoft Windows [Version 10.0.18362.959]
    (c) 2019 Microsoft Corporation. Alle rechten voorbehouden.
    
    C:\Users\user\Desktop\O Prod super mode build\dist\dist>"C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe"
    [21812] PyInstaller Bootloader 3.x
    [21812] LOADER: executable is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [21812] LOADER: homepath is C:\Users\user\Desktop\O Prod super mode build\dist\dist
    [21812] LOADER: _MEIPASS2 is NULL
    [21812] LOADER: archivename is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [21812] LOADER: Extracting binaries
    [21812] LOADER: Executing self as child
    [21812] LOADER: set _MEIPASS2 to C:\Users\user\AppData\Local\Temp\_MEI218122
    [21812] LOADER: Setting up to run child
    [21812] LOADER: Creating child process
    [21812] LOADER: Waiting for child process to finish...
    [26280] PyInstaller Bootloader 3.x
    [26280] LOADER: executable is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [26280] LOADER: homepath is C:\Users\user\Desktop\O Prod super mode build\dist\dist
    [26280] LOADER: _MEIPASS2 is C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: archivename is C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    [26280] LOADER: SetDllDirectory(C:\Users\user\AppData\Local\Temp\_MEI218122)
    [26280] LOADER: Already in the child - running user's code.
    [26280] LOADER: manifestpath: C:\Users\user\AppData\Local\Temp\_MEI218122\OAIO V1.1.2.exe.manifest
    [26280] LOADER: Error activating the context: ActivateActCtx:
    An attempt to set the default context for activating a process failed because it has already been set.
    
    [26280] LOADER: Python library: C:\Users\user\AppData\Local\Temp\_MEI218122\python37.dll
    [26280] LOADER: Loaded functions from Python library.
    [26280] LOADER: Manipulating environment (sys.path, sys.prefix)
    [26280] LOADER: sys.prefix is C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: Pre-init sys.path is C:\Users\user\AppData\Local\Temp\_MEI218122\base_library.zip;C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: Setting runtime options
    [26280] LOADER: Bootloader option: pyi-windows-manifest-filename OAIO V1.1.2.exe.manifest
    [26280] LOADER: Initializing python
    [26280] LOADER: Overriding Python's sys.path
    [26280] LOADER: Post-init sys.path is C:\Users\user\AppData\Local\Temp\_MEI218122\base_library.zip;C:\Users\user\AppData\Local\Temp\_MEI218122
    [26280] LOADER: Setting sys.argv
    [26280] LOADER: setting sys._MEIPASS
    [26280] LOADER: importing modules from CArchive
    [26280] LOADER: extracted struct
    [26280] LOADER: callfunction returned...
    [26280] LOADER: extracted pyimod01_os_path
    [26280] LOADER: callfunction returned...
    [26280] LOADER: extracted pyimod02_archive
    [26280] LOADER: callfunction returned...
    [26280] LOADER: extracted pyimod03_importers
    [26280] LOADER: callfunction returned...
    [26280] LOADER: Installing PYZ archive with Python modules.
    [26280] LOADER: PYZ archive: PYZ-00.pyz
    [26280] LOADER: Running pyiboot01_bootstrap.py
    [26280] LOADER: Running pyi_rth_multiprocessing.py
    [26280] LOADER: Running pyi_rth__tkinter.py
    [26280] LOADER: Running pyi_rth_pkgres.py
    [26280] LOADER: Running pyi_rth_pyqt5webengine.py
    [26280] LOADER: Running pyi_rth_pyqt5.py
    [26280] LOADER: Running pyi_rth_certifi.py
    [26280] LOADER: Running pyi_rth_win32comgenpy.py
    [26280] LOADER: Running Main.py
    [21812] LOADER: Back to parent (RC: -1073741571)
    [21812] LOADER: Doing cleanup
    [21812] LOADER: Freeing archive status for C:\Users\user\Desktop\O Prod super mode build\dist\dist\OAIO V1.1.2.exe
    
    opened by martyur 45
  •  Pack command, causes unknown behaviour of the app

    Pack command, causes unknown behaviour of the app

    Using the following commands to pack our applciation. pyarmor init --entry "MRT.py,MRTFiles/attack_controller.py,MRTFiles/attack_dict.py,MRTFiles/cleanup.py,MRTFiles/play.py,MRTFiles/player.py,MRTFiles/vcspam.py,MRTFiles/ServerSmasher/serversmasher.py,MRTFiles/ServerSmasher/serversmasherGUI.py,MRTFiles/ServerSmasher/smconfig.py,plugins/Ghost Ping.py,plugins/helper.py,plugins/Additional/ghostpingmenu.py"

    pyarmor pack -e " --clean -F -p MRTFiles -p plugins --noupx --onefile" .

    Note, that in MRT.py, there are calls, that will start a python file located in the MRTFiles folder(subprocess.popen(executeable, "./MRTFiles/attack_controller", ...)

    The main app does start but once I start a feature it will just start the main application again.

    opened by sla-te 45
  • Is there any difference in obfuscation between trial version and license registration?

    Is there any difference in obfuscation between trial version and license registration?

    Hello :)

    I am using pyarmor 6.8.1 version.

    After obfuscation in the TRIAL version, the service starts normally when applied to uwsgi, but if you register a license and proceed with obfuscation, the uwsgi service will not start normally.

    The same is true if you delete the licensed pyarmor directory and re-register the license as described in the guide.

    Is there a part that needs to be set differently from the trial version when registering a license?

    For your information, no additional error message is captured in the log.

    question 
    opened by JangKyumin 39
  • Advanced mode 1 Failing with Pyenv environment on Pyarmor(6.2.1)

    Advanced mode 1 Failing with Pyenv environment on Pyarmor(6.2.1)

    Hi Again,

    Environment

    Python - 3.6.9 OS - Ubuntu 20.04 Pyarmor - 6.2.0

    Project structure

    mypkg ├── bar.py ├── foo.py └── init.py

    Configuration files

    I am using the child project structure to demonstrate a use-case for a large package. Here we are just obfuscating everything else with restrict mode 4 and using restrict mode 1 for __init__.py. As is recommended for a package.

    # Content .pyarmor_config
    { 
      "version": "2.0",
      "name": "mypkg",
      "title": "mypkg",
      "src": ".",
      "is_package": 1,
      "manifest": "include __init__.py",
      "entry": "__init__.py",
      "output": "dist",
      "runtime_path": null,
      "restrict_mode": 1,
      "obf_code": 2,
      "obf_mod": 1,
      "wrap_mode": 1,
      "advanced_mode": 0,
      "bootstrap_code": 1,
      "cross_protection": 1,
      "plugins": null,
      "platform": null,
      "package_runtime": 1,
      "enable_suffix": 0,
      "license_file": null,
      "build_time": 1589994512.6738808
    }
    
    # Content .pyarmor_config_pkg
    {
      "version": "2.0",
      "name": "mypkg",
      "title": "mypkg",
      "src": ".",
      "is_package": 1,
      "manifest": "global-include *.py, exclude __init__.py",
      "entry": "",
      "output": "dist",
      "runtime_path": null,
      "restrict_mode": 4,
      "obf_code": 2,
      "obf_mod": 1,
      "wrap_mode": 1,
      "advanced_mode": 0,
      "bootstrap_code": 1,
      "cross_protection": 1,
      "plugins": null,
      "platform": null,
      "package_runtime": 1,
      "enable_suffix": 0,
      "license_file": null,
      "build_time": 1589994515.6668053
    }
    

    Command :

    pyarmor build -B
    pyarmor build --no-runtime -B .pyarmor_config_pkg
    

    The build completes successfully.

    Behaviour/Expectation

    If we try to import the obfuscated mykg then we get the following error

    Python 3.6.9 (default, May 20 2020, 20:21:06) 
    [GCC 9.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import mypkg
    XXX lineno: 8, opcode: 228
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "</media/e0lithic/D/GameX/pyarmor_test/mypkg/dist/mypkg/__init__.py>", line 3, in <module>
      File "<frozen mypkg>", line 8, in <module>
    SystemError: unknown opcode
    

    If we just turn advanced_mode 0 in both configuration files and rerun the build. I am able to import the package.

    I read the documentation but the python 3.6 limitation was only mentioned for advanced_mode 2 / a.k.a super mode. Is the support for advanced mode 1 on python 3.6 also depreciated? Kindly let me know if I am missing something.

    Thanks

    opened by e0lithic 34
  • [Query/Bug] Getting failures in project when using restrict mode 3

    [Query/Bug] Getting failures in project when using restrict mode 3

    HI,

    First of all I would like to thank you for the brilliant work you have done. Kudos!

    Configuration

    INFO     PyArmor Version 5.9.6
    INFO     Project  information
                   version: 2.0
                      name: encrypted_backend
                     title: encrypted_backend
                       src: ../backend
                is_package: None
                  manifest: global-include *.py
                     entry: manage.py
                    output: .
              runtime_path: None
             restrict_mode: 3
                  obf_code: 1
                   obf_mod: 1
                 wrap_mode: 1
             advanced_mode: 1
            bootstrap_code: 1
          cross_protection: 1
                   plugins: None
                  platform: None
           package_runtime: 1
             enable_suffix: 0
              license_file: None
                build_time: Mon Apr 13 14:24:03 2020
    

    Expectation

    • The project has multiple packages and sub packages. However intent is to obfuscate all under one umbrella, hence using a single recursive build.
    • The project being a django backend, has an entry script manage.py, which is only supposed to be executed and not imported anywhere. As such restrict mode 3 seemed to be an ideal fit.

    Error

    • The project obfuscates successfully, however, I get random failures when i try to execute it. Errors like the following - Pytransform Error: This function could not be called from the plain script when running < frozen x.y.z >

    My understanding is that since all the functions are being called from obfuscated files, the error should not pop up. I did some hit and trials in the x.y.z file path and it appears that commenting code like the following makes the error go away (doesn't make sense!).

    if not os.path.exists(root):
            os.makedirs(root)
    if not os.path.exists(dir_path):
            os.makedirs(dir_path)
    

    But then it pops up somewhere in other file. Considering the sheer size of the project and not knowing the underlying code for pyarmor, I am unable to create a directed reproducible example for you unfortunately. Please let me know if I am missing something, or any heads up so that I can provide you with a better reproducible example.

    PS - I am able to successfully run the project with restrict mode 1 and 2.

    Thanks.

    opened by e0lithic 34
  • Target platform string ['linux.x86_64.11.py37'] being read as a list of characters

    Target platform string ['linux.x86_64.11.py37'] being read as a list of characters

    I am using this method https://pyarmor.readthedocs.io/en/latest/advanced.html#distributing-obfuscated-package-with-pip

    My script for obsfucation, run from project/shell directory:

    #!/usr/bin/env bash
    # Prepare the obsfucation, run from shell directory
    rm -rf ../obsfucated
    mkdir -p ../obsfucated
    pyarmor  runtime -O obsfucated --enable-suffix 1 --advanced 2
    pyarmor obfuscate  -r --with-runtime @obsfucated  --exclude package.py,setu*.py,test,test_data,dist,build ../
    

    I am having this issue with the approach

    l$ /bin/bash /home/david/projects/product/shell/obsfucate.sh
    INFO     PyArmor Version 6.5.5
    INFO     Update target platforms to: ['linux.x86_64.11.py37']
    INFO     Generating super runtime library to obsfucated
    INFO     Extract pytransform.key
    INFO     Generate default license file
    INFO     Copying /home/david/.pyarmor/platforms/linux/x86_64/11/py37/pytransform.cpython-37m-x86_64-linux-gnu.so
    INFO     Rename extension to pytransform_vax_000925.cpython-37m-x86_64-linux-gnu.so
    INFO     Patch extension obsfucated/pytransform_vax_000925.cpython-37m-x86_64-linux-gnu.so
    INFO     Patch library file OK
    INFO     Generate runtime files OK
    INFO     Generating protection script ...
    INFO     Generating bootstrap script ...
    INFO     Generating bootstrap script obsfucated/pytransform_bootstrap.py OK
    INFO     PyArmor Version 6.5.5
    INFO     Got settings from --runtime: obsfucated
    INFO         Platforms: linux.x86_64.11.py37
    INFO         Advanced: 2
    INFO         Suffix: _vax_000925
    INFO         License: embedded
    INFO     Target platforms: ['l', 'i', 'n', 'u', 'x', '.', 'x', '8', '6', '_', '6', '4', '.', '1', '1', '.', 'p', 'y', '3', '7']
    ERROR    No available dynamic library for l with features ['11']
    

    Why is it detecting my Target platform and reading it as an array rather than a string?

    opened by davidwynter 33
  • Super-Mode and Threading

    Super-Mode and Threading

    If you thread with 2 or more children under super-mode (advanced 2) it causes python to segfault, I had users complaining so I tested

    • unencrypted - fine
    • advanced mode 1 (default) - fine
    • advanced mode 2 (super-mode) - segfault

    This appears to happen on windows, linux and osx under python 3.7 and 3.8

    right before the segfault you can see it trying to open pytransform...

    30072 stat("/tmp/QQ/dist/helheim/pytransform.cpython-37m-x86_64-linux-gnu.so", {st_dev=makedev(0x8, 0x1), st_ino=4316040, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=1400, st_size=711888, st_atime=1592127252 /* 2020-06-14T21:34:12.009638613+1200 */, st_atime_nsec=9638613, st_mtim
    e=1592123947 /* 2020-06-14T20:39:07+1200 */, st_mtime_nsec=0, st_ctime=1592127203 /* 2020-06-14T21:33:23.342523653+1200 */, st_ctime_nsec=342523653}) = 0
    30072 openat(AT_FDCWD, "/tmp/QQ/dist/helheim/pytransform.cpython-37m-x86_64-linux-gnu.so", O_RDONLY|O_CLOEXEC) = 4
    30072 read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\356\0\0\0\0\0\0@\0\0\0\0\0\0\0\20\326\n\0\0\0\0\0\0\0\0\0@\08\0\7\0@\0\33\0\32\0\1\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\254\204\n\0\0\0\0\0\254\204\n\0\0\0\0\0\0\0 \0\0\0\0\0\1\0\0\0\6\0\0\0(\216\n\0\0\0\0\0(\216*\0\0\0\0\0(\2
    16*\0\0\0\0\0\310F\0\0\0\0\0\0h\216\0\0\0\0\0\0\0\0 \0\0\0\0\0\2\0\0\0\6\0\0\0\350\233\n\0\0\0\0\0\350\233*\0\0\0\0\0\350\233*\0\0\0\0\0\320\1\0\0\0\0\0\0\320\1\0\0\0\0\0\0\10\0\0\0\0\0\0\0\4\0\0\0\4\0\0\0\310\1\0\0\0\0\0\0\310\1\0\0\0\0\0\0\310\1\0\0\0\0\0\0$\0\0\0\0\0\0\0$\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0P\345td\4\0\
    0\0\374\336\t\0\0\0\0\0\374\336\t\0\0\0\0\0\374\336\t\0\0\0\0\0t\25\0\0\0\0\0\0t\25\0\0\0\0\0\0\4\0\0\0\0\0\0\0Q\345td\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\0\0\0\0R\345td\4\0\0\0(\216\n\0\0\0\0\0(\216*\0\0\0\0\0(\216*\0\0\0\0\0\330\21\0\0\0\0\0\0\330\21\0\0
    \0\0\0\0\1\0\0\0\0\0\0\0\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\207w`\266\231Jn\\\342\304\270u\0?/1P\256!w\0\0\0\0\7\1\0\0\7\1\0\0 \0\0\0\v\0\0\0\201\f\0\202\20@\222\260\21\200$\1T!\4\10!\10\250\0@#\200>8\244\211\354\200x\304\25&\0\4J\30D\255\n\f\26\1!\30\0c\0,\4D\201P\30\\\374]\305\4\1H\314S\0\221\260 \24O@\240D \3\2$ !$\24
    2\10QE\201\201\201J\10\211\10\5\2`\302P\343(B\4\22Q\t\24\220A\200\4|\240\272\212%-\6@\225\203\210\250\236\4\1\0\252\210\4\2,\360\246<\252h4\222\244@@\10\r\t\311\310 \1Q\340\234A&\2616\200\0\200A`.\202\200\24\0\220\0\30\6\2\22\30\21\20\0\1\1\2(\20\0\1 \200$\2\263\2055\\\2\20\7\322\36\221D\0\10\2\10\2\200\200\n\0\1\30
    0\0100\242X\1\3h\320\262\310!D\220\204)P\342\304\243E\5\20\20\16\0\200`\235\202\0100\"\31 \301\312\2\2\2\5\0\24 \0\210\210\240\1h@\4\7\1\0\0\10\1\0\0\t\1\0\0\n\1\0\0\20\1\0\0\0\0\0\0\0\0\0\0\21\1\0\0\23\1\0\0\0\0\0\0\25\1\0\0\27\1\0\0\0\0\0\0\32\1\0\0\34\1\0\0\0\0\0\0", 832) = 832
    30072 fstat(4, {st_dev=makedev(0x8, 0x1), st_ino=4316040, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=1400, st_size=711888, st_atime=1592127252 /* 2020-06-14T21:34:12.009638613+1200 */, st_atime_nsec=9638613, st_mtime=1592123947 /* 2020-06-14T20:39:07+1200 */, st_mtime_nsec=0, st
    _ctime=1592127203 /* 2020-06-14T21:33:23.342523653+1200 */, st_ctime_nsec=342523653}) = 0
    30072 mmap(NULL, 2825360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7fa4de808000
    30072 mprotect(0x7fa4de8b1000, 2093056, PROT_NONE) = 0
    30072 mmap(0x7fa4deab0000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0xa8000) = 0x7fa4deab0000
    30072 mmap(0x7fa4deab6000, 15504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa4deab6000
    30072 close(4)                          = 0
    30072 mprotect(0x7fa4deab0000, 8192, PROT_READ) = 0
    30072 prctl(PR_SET_DUMPABLE, SUID_DUMP_DISABLE) = 0
    30072 openat(AT_FDCWD, "/proc/self/status", O_RDONLY) = 4
    30072 fstat(4, {st_dev=makedev(0, 0x4), st_ino=54465736, st_mode=S_IFREG|0444, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=0, st_size=0, st_atime=1592127306 /* 2020-06-14T21:35:06.536646597+1200 */, st_atime_nsec=536646597, st_mtime=1592127306 /* 2020-06-14T21:35:06.536646597+1200 */, st_mtime_nsec=53
    6646597, st_ctime=1592127306 /* 2020-06-14T21:35:06.536646597+1200 */, st_ctime_nsec=536646597}) = 0
    30072 read(4, "Name:\tpython3.7\nUmask:\t0022\nState:\tR (running)\nTgid:\t30072\nNgid:\t0\nPid:\t30072\nPPid:\t30069\nTracerPid:\t30069\nUid:\t0\t0\t0\t0\nGid:\t0\t0\t0\t0\nFDSize:\t64\nGroups:\t0 29 115 \nNStgid:\t30072\nNSpid:\t30072\nNSpgid:\t30069\nNSsid:\t24028\nVmPeak:\t  105600 kB\nVmSize:\t  105600 kB\nVmLc
    k:\t       0 kB\nVmPin:\t       0 kB\nVmHWM:\t   54080 kB\nVmRSS:\t   54080 kB\nRssAnon:\t   35980 kB\nRssFile:\t   18100 kB\nRssShmem:\t       0 kB\nVmData:\t   36708 kB\nVmStk:\t     132 kB\nVmExe:\t    2388 kB\nVmLib:\t   19004 kB\nVmPTE:\t     232 kB\nVmSwap:\t       0 kB\nHugetlbPages:\t       0 kB\nCoreDumpin
    
    opened by VeNoMouS 33
  • [BUG] Bug while packing with --mix-str

    [BUG] Bug while packing with --mix-str

    After packing with the following command

    pyarmor pack --with-license licenses\new\license.lic -x " --mix-str --advanced 1 --plugin check_ntp_time" -e " --onefile --icon icon.ico" Script.py

    After packing successfully. I encounter the following error when running the obfuscated script Note The problem will stay the same even if I waited for the script to be packed using pyinstaller.

    File "Script.py", line 4, in <module>
      File "<frozen Script>", line 202, in <module>
      File "<frozen Script>", line -1, in NTPException
    NameError: name 'utf' is not defined
    

    Note that: If I removed the --mix-str option the code will run with no problems at all after packing.

    I have implemented these lines at the beginning of my code

    # -*- coding: utf-8 -*-
    # {PyArmor Plugins}
    # PyArmor Plugin: check_ntp_time()
    

    Any help?

    bug 
    opened by kr1tx 0
  • [Question] pyarmor : ERROR Check license failed, Invalid input packet.

    [Question] pyarmor : ERROR Check license failed, Invalid input packet.

    Hi ,

    I have purchased pyarmor commercial version I was able to obfuscate above scipt using trial version earlier

    I am trying to install above setup in new gcp ubuntu server I am trying to obfuscate single hello.py file which only prints "hello world"

    below setup:

    python = 3.7.16 pyarmor = 7.7.4

    I have followed following steps

    pyarmor register pyarmor-regfile-XXXX.txt INFO PyArmor Trial Version 7.7.4 INFO Python 3.7.16 INFO Read registration code file: pyarmor-regcode-XXXX.txt INFO Start to activate this code INFO Got keyfile of this code, this code is activated INFO Start to register keyfile: pyarmor-regfile-XXXX.zip INFO Create path: /home/ubuntu/.pyarmor INFO Save registration data to: /home/ubuntu/.pyarmor INFO Extracting license.lic INFO Extracting .pyarmor_capsule.zip INFO This keyfile has been registered successfully. INFO Run "pyarmor register" to check registration information.

    pyarmor register

    _INFO PyArmor Version 7.7.4 INFO Python 3.7.16 PyArmor Version 7.7.4 Registration Code: pyarmor-vax-XXXXXX This code is authorized to

    Note: the registration name and email got from remote server is shown here only, they will not be used anywhere else. But the code "pyarmor-vax-XXXXXX" will be distributed with obfusated scripts.

    Please send request to "[email protected]" from the registration email if you would like to change the typos of registration information._

    pyarmor obfuscate --with-license /home/ubuntu/.pyarmor/license.lic hello.py _INFO PyArmor Version 7.7.4 INFO Python 3.7.16 INFO Target platforms: Native INFO Source path is "/home/ubuntu" INFO Entry scripts are ['hello.py'] INFO Use cached capsule /home/ubuntu/.pyarmor/.pyarmor_capsule.zip INFO Search scripts mode: Normal INFO Save obfuscated scripts to "dist" INFO Read product key from capsule INFO Obfuscate module mode is 2 INFO Obfuscate code mode is 1 INFO Obfuscate string value is False INFO Wrap mode is 1 INFO Restrict mode is 1 INFO Advanced value is 0 INFO Super mode is False INFO Super plus mode is not enabled INFO Generating runtime files to dist/pytransform INFO Extract pytransform.key INFO Generate license file from .pyarmor/license.lic INFO Copying /home/ubuntu/vi_prod/lib/python3.7/site-packages/pyarmor/platforms/linux/x86_64/_pytransform.so INFO Patch library dist/pytransform/pytransform.so INFO Patch library file OK INFO Copying /home/ubuntu/vi_prod/lib/python3.7/site-packages/pyarmor/pytransform.py INFO Rename it to pytransform/init.py INFO Generate runtime files OK INFO Start obfuscating the scripts... INFO hello.py -> dist/hello.py INFO Insert bootstrap code to entry script dist/hello.py INFO Obfuscate 1 scripts OK.

    cd dist/ python3 hello.py Check license failed, Invalid input packet.

    ALSO TRIED following things but didn't work change pyarmor version to 6.8.1 ,7.0.1, 7.6.0 used --platform linux.x86_64 used --advanced 2 removed /home/ubuntu/.pyarmor folder removed orignal hello.py file

    Please help me to solve this issue

    question 
    opened by rahulpp891994 1
  • [BUG] Bug in obfuscating Numpy 1.22.4

    [BUG] Bug in obfuscating Numpy 1.22.4

    After packing with the following command,

    pyarmor pack -e "--hidden-import lxml._elementpath --onefile --clean --upx-dir C:\Users\bram\Projects -y --key XXX --icon myicon.ico" app.py
    

    the following error is thrown when obfuscating Numpy 1.22.4 (it seems):

    INFO            env\Lib\site-packages\numpy\core\tests\test_protocols.py -> dist\obf\env\Lib\site-packages\numpy\core\tests\test_protocols.py
    INFO            env\Lib\site-packages\numpy\core\tests\test_records.py -> dist\obf\env\Lib\site-packages\numpy\core\tests\test_records.py
    INFO            env\Lib\site-packages\numpy\core\tests\test_regression.py -> dist\obf\env\Lib\site-packages\numpy\core\tests\test_regression.py
    ERROR    invalid character '©' (U+00A9) (<frozen env.Lib.site-packages.numpy.core.tests.test_regression>, line 2527)
    ERROR    Run command failed
    

    I'm using the following environment:

    # Name                    Version                   Build  Channel
    altgraph                  0.17.3          py310haa95532_0
    atomicwrites              1.4.0                      py_0
    attrs                     22.1.0          py310haa95532_0
    blas                      1.0                         mkl
    bottleneck                1.3.5           py310h9128911_0
    brotlipy                  0.7.0           py310h2bbff1b_1002
    bzip2                     1.0.8                he774522_0
    ca-certificates           2022.12.7            h5b45459_0    conda-forge
    certifi                   2022.12.7          pyhd8ed1ab_0    conda-forge
    cffi                      1.15.1          py310h2bbff1b_3
    charset-normalizer        2.0.4              pyhd3eb1b0_0
    colorama                  0.4.5           py310haa95532_0
    conda                     22.11.1         py310h5588dad_1    conda-forge
    conda-package-handling    1.9.0           py310h8cc25b3_1
    coverage                  6.3.2           py310h2bbff1b_0
    cryptography              38.0.1          py310h21b164f_0
    future                    0.18.2          py310haa95532_1
    idna                      3.4             py310haa95532_0
    iniconfig                 1.1.1              pyhd3eb1b0_0
    intel-openmp              2021.4.0          haa95532_3556
    libblas                   3.9.0           1_h8933c1f_netlib    conda-forge
    libcblas                  3.9.0           5_hd5c7e75_netlib    conda-forge
    libffi                    3.4.2                hd77b12b_6
    libiconv                  1.16                 h2bbff1b_2
    liblapack                 3.9.0           5_hd5c7e75_netlib    conda-forge
    libxml2                   2.9.14               h0ad7f3c_0
    libxslt                   1.1.35               h2bbff1b_0
    lxml                      4.9.1           py310h1985fb9_0
    m2w64-gcc-libgfortran     5.3.0                         6    conda-forge
    m2w64-gcc-libs            5.3.0                         7    conda-forge
    m2w64-gcc-libs-core       5.3.0                         7    conda-forge
    m2w64-gmp                 6.1.0                         2    conda-forge
    m2w64-libwinpthread-git   5.0.0.4634.697f757               2    conda-forge
    macholib                  1.16.2          py310haa95532_0
    menuinst                  1.4.19          py310h59b6b97_0
    msys2-conda-epoch         20160418                      1    conda-forge
    munch                     2.5.0                      py_0    conda-forge
    nomkl                     1.0                  h5ca1d4c_0    conda-forge
    numexpr                   2.8.3           py310h32c9954_100    conda-forge
    numpy                     1.22.4          py310hed7ac4c_0    conda-forge
    openssl                   1.1.1s               h2bbff1b_0
    packaging                 22.0            py310haa95532_0
    pandas                    1.4.4           py310hd77b12b_0
    pefile                    2022.5.30       py310haa95532_0
    pip                       22.2.2          py310haa95532_0
    pluggy                    1.0.0           py310haa95532_1
    py                        1.11.0             pyhd3eb1b0_0
    pyarmor                   7.7.4                    pypi_0    pypi
    pycosat                   0.6.4           py310h2bbff1b_0
    pycparser                 2.21               pyhd3eb1b0_0
    pycryptodome              3.15.0          py310h2bbff1b_0
    pyinstaller               4.8             py310h8cc25b3_0
    pyopenssl                 22.0.0             pyhd3eb1b0_0
    pysocks                   1.7.1           py310haa95532_0
    pytest                    7.1.2           py310haa95532_0
    pytest-check              1.0.10                   pypi_0    pypi
    pytest-cov                3.0.0              pyhd3eb1b0_0
    python                    3.10.6               hbb2ffb3_0
    python-dateutil           2.8.2              pyhd3eb1b0_0
    python_abi                3.10                    2_cp310    conda-forge
    pytz                      2022.7          py310haa95532_0
    pywin32                   305             py310h2bbff1b_0
    pywin32-ctypes            0.2.0           py310haa95532_1000
    pyyaml                    6.0             py310he2412df_4    conda-forge
    requests                  2.28.1          py310haa95532_0
    ruamel.yaml               0.17.21         py310h2bbff1b_0
    ruamel.yaml.clib          0.2.6           py310h2bbff1b_1
    setuptools                65.5.0          py310haa95532_0
    six                       1.16.0             pyhd3eb1b0_1
    sqlite                    3.40.0               h2bbff1b_0
    tinyaes                   1.0.4                    pypi_0    pypi
    tk                        8.6.12               h2bbff1b_0
    toml                      0.10.2             pyhd3eb1b0_0
    tomli                     2.0.1           py310haa95532_0
    toolz                     0.12.0          py310haa95532_0
    tqdm                      4.64.1          py310haa95532_0
    tzdata                    2022g                h04d1e81_0
    urllib3                   1.26.13         py310haa95532_0
    vc                        14.2                 h21ff451_1
    vs2015_runtime            14.27.29016          h5e58377_2
    wheel                     0.37.1             pyhd3eb1b0_0
    win_inet_pton             1.1.0           py310haa95532_0
    wincertstore              0.2             py310haa95532_2
    xz                        5.2.8                h8cc25b3_0
    yaml                      0.2.5                he774522_0
    my_own_packacge               0.0.1                     dev_0    <develop>
    zlib                      1.2.13               h8cc25b3_0
    

    Any ideas?

    bug 
    opened by bramth 1
  • [BUG] pyarmor register failing: urlopen error [Errno -2] Name or service not known

    [BUG] pyarmor register failing: urlopen error [Errno -2] Name or service not known

    I'm attempting to build a very simple docker image with PyArmor installed for use in a CI/CD job. The docker build is able to install PyArmor with pip, but fails during the pyarmor register step. Per the docs i've tried adding a host for pyarmor.dashingsoft.com:119.23.58.77 using the Docker --add-host command, but it made no difference.

    Dockerfile:

    FROM python:3.9
    
    RUN python3 -m pip install build
    
    ADD pyarmor-regcode-3423.txt .
    RUN python3 -m pip install pyarmor
    RUN pyarmor -d register pyarmor-regcode-3423.txt
    
    ENTRYPOINT [ "pyarmor", "--version"]
    

    Command run: docker build --add-host=pyarmor.dashingsoft.com:119.23.58.77 -t build_image:0.1 .

    Output:

    ...
     => ERROR [5/6] RUN pyarmor -d register pyarmor-regcode-3423.txt                                                                                                                                                                   1.3s
    ------                                                                                                                                                                                                                                  
     > [5/6] RUN pyarmor -d register pyarmor-regcode-3423.txt:
    #8 0.365 INFO     PyArmor Trial Version 7.7.4
    #8 0.365 INFO     Python 3.9.16
    #8 0.365 INFO     Read registration code file: pyarmor-regcode-3423.txt
    #8 0.366 DEBUG    Got registration code: xxxxxxxxxxxxxxxxxxxx
    #8 0.367 INFO     Start to activate this code
    #8 1.213 Traceback (most recent call last):
    #8 1.213   File "/usr/local/lib/python3.9/urllib/request.py", line 1346, in do_open
    #8 1.213     h.request(req.get_method(), req.selector, req.data, headers,
    #8 1.213   File "/usr/local/lib/python3.9/http/client.py", line 1285, in request
    #8 1.214     self._send_request(method, url, body, headers, encode_chunked)
    #8 1.214   File "/usr/local/lib/python3.9/http/client.py", line 1331, in _send_request
    #8 1.215     self.endheaders(body, encode_chunked=encode_chunked)
    #8 1.215   File "/usr/local/lib/python3.9/http/client.py", line 1280, in endheaders
    #8 1.216     self._send_output(message_body, encode_chunked=encode_chunked)
    #8 1.216   File "/usr/local/lib/python3.9/http/client.py", line 1040, in _send_output
    #8 1.216     self.send(msg)
    #8 1.216   File "/usr/local/lib/python3.9/http/client.py", line 980, in send
    #8 1.217     self.connect()
    #8 1.217   File "/usr/local/lib/python3.9/http/client.py", line 1454, in connect
    #8 1.217     self.sock = self._context.wrap_socket(self.sock,
    #8 1.217   File "/usr/local/lib/python3.9/ssl.py", line 501, in wrap_socket
    #8 1.218     return self.sslsocket_class._create(
    #8 1.218   File "/usr/local/lib/python3.9/ssl.py", line 1041, in _create
    #8 1.218     self.do_handshake()
    #8 1.218   File "/usr/local/lib/python3.9/ssl.py", line 1310, in do_handshake
    #8 1.219     self._sslobj.do_handshake()
    #8 1.219 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)
    #8 1.219 
    #8 1.219 During handling of the above exception, another exception occurred:
    #8 1.219 
    #8 1.219 Traceback (most recent call last):
    #8 1.219   File "/usr/local/lib/python3.9/site-packages/pyarmor/utils.py", line 1685, in _urlopen
    #8 1.220     return urlopen(*args, **kwargs)
    #8 1.220   File "/usr/local/lib/python3.9/urllib/request.py", line 214, in urlopen
    #8 1.220     return opener.open(url, data, timeout)
    #8 1.220   File "/usr/local/lib/python3.9/urllib/request.py", line 517, in open
    #8 1.220     response = self._open(req, data)
    #8 1.220   File "/usr/local/lib/python3.9/urllib/request.py", line 534, in _open
    #8 1.221     result = self._call_chain(self.handle_open, protocol, protocol +
    #8 1.221   File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
    #8 1.221     result = func(*args)
    #8 1.222   File "/usr/local/lib/python3.9/urllib/request.py", line 1389, in https_open
    #8 1.222     return self.do_open(http.client.HTTPSConnection, req,
    #8 1.222   File "/usr/local/lib/python3.9/urllib/request.py", line 1349, in do_open
    #8 1.223     raise URLError(err)
    #8 1.223 urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>
    #8 1.223 
    #8 1.223 During handling of the above exception, another exception occurred:
    #8 1.223 
    #8 1.223 Traceback (most recent call last):
    #8 1.223   File "/usr/local/lib/python3.9/urllib/request.py", line 1346, in do_open
    #8 1.223     h.request(req.get_method(), req.selector, req.data, headers,
    #8 1.223   File "/usr/local/lib/python3.9/http/client.py", line 1285, in request
    #8 1.224     self._send_request(method, url, body, headers, encode_chunked)
    #8 1.224   File "/usr/local/lib/python3.9/http/client.py", line 1331, in _send_request
    #8 1.224     self.endheaders(body, encode_chunked=encode_chunked)
    #8 1.224   File "/usr/local/lib/python3.9/http/client.py", line 1280, in endheaders
    #8 1.225     self._send_output(message_body, encode_chunked=encode_chunked)
    #8 1.225   File "/usr/local/lib/python3.9/http/client.py", line 1040, in _send_output
    #8 1.225     self.send(msg)
    #8 1.225   File "/usr/local/lib/python3.9/http/client.py", line 980, in send
    #8 1.225     self.connect()
    #8 1.225   File "/usr/local/lib/python3.9/http/client.py", line 1447, in connect
    #8 1.226     super().connect()
    #8 1.226   File "/usr/local/lib/python3.9/http/client.py", line 946, in connect
    #8 1.226     self.sock = self._create_connection(
    #8 1.226   File "/usr/local/lib/python3.9/socket.py", line 823, in create_connection
    #8 1.227     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
    #8 1.227   File "/usr/local/lib/python3.9/socket.py", line 954, in getaddrinfo
    #8 1.227     for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    #8 1.227 socket.gaierror: [Errno -2] Name or service not known
    #8 1.227 
    #8 1.227 During handling of the above exception, another exception occurred:
    #8 1.227 
    #8 1.227 Traceback (most recent call last):
    #8 1.227   File "/usr/local/bin/pyarmor", line 8, in <module>
    #8 1.227     sys.exit(main_entry())
    #8 1.227   File "/usr/local/lib/python3.9/site-packages/pyarmor/pyarmor.py", line 1612, in main_entry
    #8 1.227     main(sys.argv[1:])
    #8 1.227   File "/usr/local/lib/python3.9/site-packages/pyarmor/pyarmor.py", line 1604, in main
    #8 1.228     args.func(args)
    #8 1.228   File "/usr/local/lib/python3.9/site-packages/pyarmor/pyarmor.py", line 866, in _register
    #8 1.228     filename = activate_regcode(ucode)
    #8 1.228   File "/usr/local/lib/python3.9/site-packages/pyarmor/register.py", line 74, in activate_regcode
    #8 1.228     res = _urlopen(reg_url % ucode, timeout=6.0)
    #8 1.228   File "/usr/local/lib/python3.9/site-packages/pyarmor/utils.py", line 1689, in _urlopen
    #8 1.229     return urlopen(*args, **kwargs)
    #8 1.229   File "/usr/local/lib/python3.9/urllib/request.py", line 214, in urlopen
    #8 1.229     return opener.open(url, data, timeout)
    #8 1.229   File "/usr/local/lib/python3.9/urllib/request.py", line 523, in open
    #8 1.229     response = meth(req, response)
    #8 1.229   File "/usr/local/lib/python3.9/urllib/request.py", line 632, in http_response
    #8 1.230     response = self.parent.error(
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 555, in error
    #8 1.230     result = self._call_chain(*args)
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
    #8 1.230     result = func(*args)
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 747, in http_error_302
    #8 1.230     return self.parent.open(new, timeout=req.timeout)
    #8 1.230   File "/usr/local/lib/python3.9/urllib/request.py", line 517, in open
    #8 1.231     response = self._open(req, data)
    #8 1.231   File "/usr/local/lib/python3.9/urllib/request.py", line 534, in _open
    #8 1.231     result = self._call_chain(self.handle_open, protocol, protocol +
    #8 1.231   File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
    #8 1.231     result = func(*args)
    #8 1.231   File "/usr/local/lib/python3.9/urllib/request.py", line 1389, in https_open
    #8 1.232     return self.do_open(http.client.HTTPSConnection, req,
    #8 1.232   File "/usr/local/lib/python3.9/urllib/request.py", line 1349, in do_open
    #8 1.233     raise URLError(err)
    #8 1.233 urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>
    ------
    executor failed running [/bin/sh -c pyarmor -d register pyarmor-regcode-3423.txt]: exit code: 1
    
    bug 
    opened by jeffcarlsonfico 1
  • [BUG]  _PyEval_EvalFrameDefault returned NULL

    [BUG] _PyEval_EvalFrameDefault returned NULL

    when running my program (obfuscation) i get an error - SystemError: _PyEval_EvalFrameDefault returned NULL without setting an error

    but at the same time, I don't have any errors on my machine and the software runs normally.

    Virtual machine characteristics: Ubuntu 22.04

    My pc specs: Windows 11

    bug 
    opened by frymex 0
  • [BUG]使用约束模式 1和约束模式 4 的加密方式时在Linux.aarch64平台上报错

    [BUG]使用约束模式 1和约束模式 4 的加密方式时在Linux.aarch64平台上报错

    跨平台使用约束模式1和约束模式4进行加密时,在Linux.aarch64平台上编译完成后,运行报错,但编译后的代码在windows.x86_64 和 linux.x86_64平台上可以正常运行。

    以下时加密步骤: 执行加密命令1: pyarmor obfuscate -O waterFlow_proj/waterFlow --platform windows.x86_64 --platform linux.x86_64 --platform linux.aarch64 --advanced 1 --restrict 1 --exact init.py

    INFO PyArmor Version 7.7.0 INFO Python 3.8.10 WARNING "--advanced 1" is deprecated for Python 3.8, use "--advanced 2" instead INFO Target platforms: ['windows.x86_64', 'linux.x86_64', 'linux.aarch64'] INFO Update target platforms to: ['windows.x86_64.7', 'linux.x86_64.7', 'linux.aarch64.3'] INFO Source path is "/mnt/hdisk/opt/watersystem/waterFlow_src" INFO Entry scripts are ['init.py'] INFO Use cached capsule /home/khadas/.pyarmor/.pyarmor_capsule.zip INFO Search scripts mode: Exact INFO Save obfuscated scripts to "waterFlow_proj/waterFlow" INFO Read product key from capsule INFO Obfuscate module mode is 2 INFO Obfuscate code mode is 1 INFO Obfuscate string value is False INFO Wrap mode is 1 INFO Restrict mode is 1 INFO Advanced value is 1 INFO Super mode is False INFO Super plus mode is not enabled INFO Generating runtime files to waterFlow_proj/waterFlow/pytransform INFO Extract pytransform.key INFO Read default license from capsule INFO Create library path to support multiple platforms: waterFlow_proj/waterFlow/pytransform/platforms INFO Copying /home/khadas/.pyarmor/platforms/windows/x86_64/7/_pytransform.dll INFO To waterFlow_proj/waterFlow/pytransform/platforms/windows/x86_64 INFO Patch library waterFlow_proj/waterFlow/pytransform/platforms/windows/x86_64/_pytransform.dll INFO Patch library file OK INFO Copying /home/khadas/.pyarmor/platforms/linux/x86_64/7/_pytransform.so INFO To waterFlow_proj/waterFlow/pytransform/platforms/linux/x86_64 INFO Patch library waterFlow_proj/waterFlow/pytransform/platforms/linux/x86_64/_pytransform.so INFO Patch library file OK INFO Copying /home/khadas/.pyarmor/platforms/linux/aarch64/3/_pytransform.so INFO To waterFlow_proj/waterFlow/pytransform/platforms/linux/aarch64 INFO Patch library waterFlow_proj/waterFlow/pytransform/platforms/linux/aarch64/_pytransform.so INFO Patch library file OK INFO Copying /home/khadas/.local/lib/python3.8/site-packages/pyarmor/pytransform.py INFO Rename it to pytransform/init.py INFO Generate runtime files OK INFO Start obfuscating the scripts... INFO /mnt/hdisk/opt/watersystem/waterFlow_src/init.py -> waterFlow_proj/waterFlow/init.py INFO Insert bootstrap code to entry script waterFlow_proj/waterFlow/init.py INFO Obfuscate 1 scripts OK.

    执行加密命令2: pyarmor obfuscate -O waterFlow_proj/waterFlow --platform windows.x86_64 --platform linux.x86_64 --platform linux.aarch64 --advanced 1 --restrict 4 -recursive --exclude init.py .

    INFO PyArmor Version 7.7.0 INFO Python 3.8.10 WARNING "--advanced 1" is deprecated for Python 3.8, use "--advanced 2" instead INFO Target platforms: ['windows.x86_64', 'linux.x86_64', 'linux.aarch64'] INFO Update target platforms to: ['windows.x86_64.7', 'linux.x86_64.7', 'linux.aarch64.3'] WARNING Option --entry has been deprecated INFO Source path is "/mnt/hdisk/opt/watersystem/waterFlow_src" INFO Entry scripts are ['cursive'] INFO Use cached capsule /home/khadas/.pyarmor/.pyarmor_capsule.zip INFO Search scripts mode: Recursive INFO Exclude pattern "init.py" INFO Auto exclude output path "waterFlow_proj/waterFlow" INFO Save obfuscated scripts to "waterFlow_proj/waterFlow" INFO Read product key from capsule INFO Obfuscate module mode is 2 INFO Obfuscate code mode is 1 INFO Obfuscate string value is False INFO Wrap mode is 1 INFO Restrict mode is 4 INFO Advanced value is 1 INFO Super mode is False INFO Super plus mode is not enabled INFO Generating runtime files to waterFlow_proj/waterFlow/pytransform INFO Extract pytransform.key INFO Read default license from capsule INFO Create library path to support multiple platforms: waterFlow_proj/waterFlow/pytransform/platforms INFO Copying /home/khadas/.pyarmor/platforms/windows/x86_64/7/_pytransform.dll INFO To waterFlow_proj/waterFlow/pytransform/platforms/windows/x86_64 INFO Patch library waterFlow_proj/waterFlow/pytransform/platforms/windows/x86_64/_pytransform.dll INFO Patch library file OK INFO Copying /home/khadas/.pyarmor/platforms/linux/x86_64/7/_pytransform.so INFO To waterFlow_proj/waterFlow/pytransform/platforms/linux/x86_64 INFO Patch library waterFlow_proj/waterFlow/pytransform/platforms/linux/x86_64/_pytransform.so INFO Patch library file OK INFO Copying /home/khadas/.pyarmor/platforms/linux/aarch64/3/_pytransform.so INFO To waterFlow_proj/waterFlow/pytransform/platforms/linux/aarch64 INFO Patch library waterFlow_proj/waterFlow/pytransform/platforms/linux/aarch64/_pytransform.so INFO Patch library file OK INFO Copying /home/khadas/.local/lib/python3.8/site-packages/pyarmor/pytransform.py INFO Rename it to pytransform/init.py INFO Generate runtime files OK INFO Start obfuscating the scripts... INFO json2py_Key.py -> waterFlow_proj/waterFlow/json2py_Key.py INFO json2token.py -> waterFlow_proj/waterFlow/json2token.py INFO main.py -> waterFlow_proj/waterFlow/main.py INFO qua_monitor.py -> waterFlow_proj/waterFlow/qua_monitor.py INFO utils.py -> waterFlow_proj/waterFlow/utils.py INFO vel_monitor.py -> waterFlow_proj/waterFlow/vel_monitor.py INFO wl_monitor.py -> waterFlow_proj/waterFlow/wl_monitor.py INFO xjjj.py -> waterFlow_proj/waterFlow/xjjj.py INFO Obfuscate 8 scripts OK.

    加密完成后在linux.aarch64平台上,cd xxx/waterFlow_proj,执行python -c "import waterFlow" 报错: XXX lineno: 3, opcode: 228 Traceback (most recent call last): File "", line 1, in File "</mnt/hdisk/opt/watersystem/waterFlow_src/waterFlow_proj/waterFlow/init.py>", line 3, in File "", line 3, in SystemError: unknown opcode

    运行环境 python3.8.13 pyarmor 7.7.0

    期盼得到您的答复!!

    opened by LVguomin 2
Releases(v7.7.4)
  • v7.7.4(Dec 11, 2022)

    • Fix bug: pyinstaller option --upx-dir doesn't work in the command pack
    • Fix bug (#884): "insert one redundant line" doesn't work in Python 3.10 for super mode
    Source code(tar.gz)
    Source code(zip)
  • v7.7.3(Nov 20, 2022)

  • v7.7.2(Nov 20, 2022)

  • v7.7.1(Nov 18, 2022)

    • Fix bug(#853): pack command fails when passing the --upx-dir flag to PyInstaller
    • Fix bug(#860): --exact flag doesn't work in the option -x of pack command
    • Fix bug(#878): For pyinstaller 5.6.2, pack command fails with error win32ctypes.pywin32.pywintypes.error: (2, 'LoadLibraryEx', 'The system cannot find the file specified')
    Source code(tar.gz)
    Source code(zip)
  • v7.7.0(Sep 28, 2022)

    • Fix bug(#814): --mix-str results in from __future__ import xxx error
    • Change core version to r52.6
    • Remove duplicated mac addresses when printing all mac addresses
    • Fix super mode crash bug in aarch64 platform
    • Change spp build library version to r4
    • Fix spp mode bug: RuntimeError: Init spp mode failed when function name starts with lambda_
    • Fix spp mode crash bugs
    Source code(tar.gz)
    Source code(zip)
  • v7.6.1(Aug 12, 2022)

  • v7.6.0(Jul 28, 2022)

    • For command obfuscate add option --mix-str to obfuscate the string value
    • For command config add option --mixin, only avaliable mixin is str now
    • Project add new attribute mixins to support option --mixin
    • Change core version to r51.5
    • Change spp build library version to r2
    • Fix spp mode crash bugs because of the same list/dict/set constants conflicts
    • Fix spp mode crash bugs because cellvars and freevars are freed even they are still used by other lambda/functions.
    Source code(tar.gz)
    Source code(zip)
  • v7.5.1(Jun 28, 2022)

    • Fix spp mode bug (#758): from __future__ imports must occur at the beginning of the file
    • Fix spp mode bug (#760): 'Set' object has no attribute 'ctx'
    • Fix spp mode bug (#760): redefinition of _listcomp_326_1
    • Fix spp mode bug: Can not import XXX from MMM
    • Fix spp mode bug: using PYTHONOPTIMIZE may results in sppmode fails.
    • Fix spp mode bugs regarding to with/lambda/comprehension
    Source code(tar.gz)
    Source code(zip)
  • v7.5.0(Jun 6, 2022)

    • Fix command pack issue: if using --src in the option --xoptions, pyarmor raises excpetion no entry script found
    • Change core version and spp library version to r50.4
    • Support sppmode for Python3.7~3.10 in platforms: darwin.aarch64, linux.aarch64
    • Support sppmode for Python 3.10 in platforms: windows.x86_64, linux.x86_64, darwin.x86_64, darwin.aarch64, linux.aarch64
    • Fix sppmode bug: the result of inplace op for attribute is not right. For example, after self.a += 1, self.a isn't increased in old version.
    • Fix sppmode bug: AnnAssign is ignored. For example, after x: int = 3, x still is undefined in old version.
    Source code(tar.gz)
    Source code(zip)
  • v7.4.3(Apr 30, 2022)

  • v7.4.2(Apr 18, 2022)

  • v7.4.1(Mar 12, 2022)

  • v7.4.0(Mar 2, 2022)

    • Change core version to r49.3
    • Fix centos6 issue: GLIBC 2.14 not found
    • Fix python3.10 super mode crash issue (#686)
    • Support new platform musl.aarch64
    • Add new super mode darwin.aarch64 for Python 3.10
    Source code(tar.gz)
    Source code(zip)
  • v7.3.6(Feb 7, 2022)

    • Refine register function.
    • In Darwin support option --platform darwin.aarch64,darwin.x86_64 to create universal runtime binary when obfuscationg the scripts.
    Source code(tar.gz)
    Source code(zip)
  • v7.3.3(Jan 29, 2022)

    • Fix issue: pyarmor register doesn't show register information for Python3
    • In Darwin codesign the runtime binary file to avoid the obfuscated scripts killed by Apple M1
    Source code(tar.gz)
    Source code(zip)
  • v7.3.1(Jan 25, 2022)

    • Fix issue (#663): the merge script raises exception too many runtime files if the runtime files are generated by command runtime
    • Add new option --no-runtime for merge script helper.merge
    • Add new platform linux.x86.11.py310 to support super mode for Python 3.10
    • Do not load core library _pytransform for command register and download
    Source code(tar.gz)
    Source code(zip)
  • v7.3.0(Jan 2, 2022)

    • Change core version to r48.2
    • Fix Apple Silcon crash issue: use darwin.aarch64.0 as default library
    • Add 2 super mode libraries: darwin.aarch64.8.py38, darwin.aarch64.8.py39
    Source code(tar.gz)
    Source code(zip)
  • v7.2.4(Dec 27, 2021)

  • v7.2.3(Dec 15, 2021)

  • v7.2.0(Dec 10, 2021)

  • v7.1.0(Dec 1, 2021)

    • Check the conflicts of option --restrict 0 and --with-license
    • Fix issue (#628): super plus mode crashes if any function is patched
    • Fix link errors in documentation
    • Change core version to r47.1
    • Support Python 3.10. For super mode, now only 3 platforms: windows.x86_64, linux.x86_64, darwin.x86_64
    Source code(tar.gz)
    Source code(zip)
  • v7.0.2(Nov 2, 2021)

  • v7.0.1(Oct 31, 2021)

    A big feature Super Plus Mode is introduced in this version, and the format of license file for obfuscated scripts is changed.

    Because the trial version uses the old core libraries, so it doesn't work with new license. When running the scripts which are obfuscated by trial version with option --platform or --advanced, it will raise exception: Check license failed, Invalid input packet.

    • Fix issue (#584): failed to run pyarmor in Cygwin
    • Fix issue (#586): In linux combining options both --enable-suffix and --advanced 1 doesn't work
    • Increase core version to r46.20
    • Add sppmode, refer to Super Plus Mode
    • Change the format of license file for obfuscated scripts and the old core libraries (before r46.20) doesn't work with new licenses.
    Source code(tar.gz)
    Source code(zip)
  • v6.8.1(Oct 1, 2021)

  • v6.8.0(Sep 1, 2021)

    • Fix issue (#557): Invalid platform name for VM mode
    • Change core version to r45.19
    • In Linux support to get the serial number of mmc/sd card
    • In Linux refine the code of getting default harddisk
    • Supprot to run obfuscated scripts by multiple Python versions, refer to https://pyarmor.readthedocs.io/en/latest/advanced.html#run-obfuscated-scripts-by-different-python-versions
    • Fix Apple Silicon doesn't work issue
    Source code(tar.gz)
    Source code(zip)
  • v6.7.4(Aug 1, 2021)

    • Fix issue (#547): in MacOS the repack script fails if the executable is signed.
    • Add option --code-identity for repack script
    • Fix issue (#549): refine repack script to wait for the termination of objcopy
    • Change core version to r44.18
    • Fix issue: in super mode object.__del__ raises exception NameError: name '__armor_wrap__' is not defined
    • Fix issue (#530): in non-super mode object.__del__ raises exception NameError: name '__armor_enter__' is not defined. Note that for Python 3.7 and later, this issue still exists in non-super mode. Use super mode for these Python versions to solve this issue.
    • Add restrict mode 100+, refer to Restrict Mode
    • Check sys.PYARMOR_LICENSE for outer license, and refine outer license search policy. Refer to :ref:How to use outer license file
    • Fix issue (#539): runtime command generates wrong protection code for super mode
    • Fix issue (#550): memory leak of builtin function locals in super mode
    Source code(tar.gz)
    Source code(zip)
  • v6.7.3(Jul 2, 2021)

  • v6.7.2(Jun 7, 2021)

    • Fix issue (#518): remove platform part from extension name for super mode, now the final name is always pytransform.so or pytransform.pyd
    • Change core version to r43.17
    • Fix issue: the platform "android.aarch64" always raises exception Check license failed, Invalid input packet
    Source code(tar.gz)
    Source code(zip)
  • v6.7.1(May 20, 2021)

    • Support environment variable PYARMOR_TIMEOUT to set the timeout of any network connection.
    • Fix issue (#503): repack complains of too many pytransform
    • Support platform isilon onefs, alias of freebsd
    • Print the version of Python in the console when running pyarmor sub-command
    Source code(tar.gz)
    Source code(zip)
  • v6.7.0(Apr 28, 2021)

    There is a big change in this version is that the trial version could not download the latest extra core libraries. Except the core libraries distributed with soure package, for trial version all the other core libraries will always use the ones same as v6.6.2 (tag: r41.15).

    • Remove platform data file index.json from source package
    • The trial version could not download the latest platform libraries, it always uses core version r41.15
    • Fix super mode for Python39-32 in Windows issue(#489): Dll load failed (The specified procedure could not be found)

    Only fixed in purchased version

    • Improve the security of check_armored for super mode
    • Fix memory leak issue for core dynamic libraries
    Source code(tar.gz)
    Source code(zip)
Owner
Dashingsoft
Focus on how to obfuscate python scripts for more than ten years, Pyarmor has been a powerful tool in the field of protecting and distributing python scripts.
Dashingsoft
Easily turn single threaded command line applications into a fast, multi-threaded application with CIDR and glob support.

Easily turn single threaded command line applications into a fast, multi-threaded application with CIDR and glob support.

Michael Skelton 1k Jan 07, 2023
A python script that enables a raspberry pi sd card through the CLI and automates the process of configuring network details and ssh.

This project is one script (wpa_helper.py) written in python that will allow for the user to automate the proccess of setting up a new boot disk and configuring ssh and network settings for the pi

Theo Kirby 6 Jun 24, 2021
Python library and command line tool for interacting with Bugzilla

python-bugzilla This package provides two bits: bugzilla python module for talking to a Bugzilla instance over XMLRPC or REST /usr/bin/bugzilla comman

Python Bugzilla Project 112 Nov 05, 2022
A Hikari command handler for people who love ducks.

A Hikari command handler for people who love ducks.

Jeremiah 2 Oct 09, 2022
A CLI based task manager tool which helps you track your daily task and activity.

CLI based task manager tool This is the simple CLI tool can be helpful in increasing your productivity. More like your todolist. It uses Postgresql as

ritik 1 Jan 19, 2022
Sink is a CLI tool that allows users to synchronize their local folders to their Google Drives. It is similar to the Git CLI and allows fast and reliable syncs with the drive.

Sink is a CLI synchronisation tool that enables a user to synchronise local system files and folders with their Google Drives. It follows a git C

Yash Thakre 16 May 29, 2022
Navigate torrents in CLI with Mariner.

Navigate torrents in CLI with Mariner. It offers a simple interface for streamlined experience. No more annoying ads and pop-up windows.

2 Oct 20, 2021
Python command line tool and python engine to label table fields and fields in data files.

Python command line tool and python engine to label table fields and fields in data files. It could help to find meaningful data in your tables and data files or to find Personal identifable informat

APICrafter 22 Dec 05, 2022
A VIM-inspired filemanager for the console

ranger 1.9.3 ranger is a console file manager with VI key bindings. It provides a minimalistic and nice curses interface with a view on the directory

12.6k Dec 30, 2022
🪛 A simple pydantic to Form FastAPI model converter.

pyfa-converter Makes it pretty easy to create a model based on Field [pydantic] and use the model for www-form-data. How to install? pip install pyfa_

20 Dec 22, 2022
🐍The nx-python plugin allows users to create a basic python application using nx commands.

🐍 NxPy: Nx Python plugin This project was generated using Nx. The nx-python plugin allows users to create a basic python application using nx command

StandUP Communications 74 Aug 31, 2022
A simple terminal-based localhost chat application written in python

Chat House A simple terminal-based localhost chat application written in python How to Use? Clone the repo git clone https://github.com/heksadecimal/c

Heks 10 Nov 09, 2021
Jupyter notebook client in neovim

🪐 Jupyter-Nvim Read jupyter notebooks in neovim Note: The plugin is still in alpha stage 👾 Usage Just open any *.ipynb file and voila! ✨ Contributin

Ahmed Khalf 85 Dec 29, 2022
A simple CLI tool for tracking Pikud Ha'oref alarms.

Pikud Ha'oref Alarm Tracking A simple CLI tool for tracking Pikud Ha'oref alarms. Polls the unofficial API endpoint every second for incoming alarms.

Yuval Adam 24 Oct 10, 2022
Customisable pharmacokinetic model accessible via bash CLI allowing for variable dose calculations as well as intravenous and subcutaneous administration calculations

Pharmacokinetic Modelling Group Project A PharmacoKinetic (PK) modelling function for analysis of injected solute dynamics over time, developed by Gro

1 Oct 24, 2021
A dilligent command line tool to publish ads on ebay-kleinanzeigen.de

kleinanzeigen-bot Feedback and high-quality pull requests are highly welcome! About Installation Usage Development Notes License About kleinanzeigen-b

83 Dec 26, 2022
A very simple OpenContest command line client written in Python

OpenContest Client A very simple OpenContest command line client written in Python. The only dependency is the requests library. Tested with Linux onl

Ladue Computer Science 1 May 25, 2022
A Yahtzee-solving python package and command line tool.

yahtzee A Yahtzee-solving python package and command line tool. The algorithm is mathematically guaranteed to have the best strategy. That is, it maxi

David Merrell 0 Aug 19, 2022
Another (unofficial) Qt CLI Installer on multi-platforms

Another Qt installer(aqt) Release: Documentation: Test status: and Coverage: This is a utility alternative to the official graphical Qt installer, for

Hiroshi Miura 528 Jan 02, 2023
YouCompleteMe: a code-completion engine for Vim

YouCompleteMe: a code-completion engine for Vim Help, Advice, Support Looking for help, advice or support? Having problems getting YCM to work? First

24.5k Jan 06, 2023