1

假设我有 2 个模块 - 一个已被 PyArmor 混淆。另一个导入混淆模块并使用它:

# obfuscated.py
def run_task(conn):
    conn.send_msg("Here you go")
    print(conn.some_val + 55)
    return 0
# Non obfuscated (user) code
import importlib.util


class conn:
    some_val = 5
    
    def send_msg(msg):
        print(msg)

def main():
    # import obfuscated # This works...but I need to dynamically load it:

    # This does not:
    spec = importlib.util.spec_from_file_location("module.name", r'c:\Users\me\obfuscated.py')
    obfuscated = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(swdl)
    ret = obfuscated.run_task(conn)
    print("from main: ", ret)

if __name__ == "__main__":
    main()

import如果我使用它导入混淆文件就可以了。但我需要使用importlib动态导入混淆文件。importlib 不起作用 - 我得到:

AttributeError: module 'module.name' has no attribute 'obfuscated'

这个想法是,用户可以使用其中可用的 API 编写脚本,obfuscated.py但需要从其系统上的任何位置加载模块。

有没有办法做到这一点?

4

2 回答 2

1

我想我有一个基于我在这里读到的方法:https ://pyarmor.readthedocs.io/en/latest/mode.html#restrict-mode

我在用户代码和混淆代码之间使用代理。

  • 用户代码可能会或可能不会被混淆
  • 被混淆的代码显然是被混淆了!
  • 代理不得混淆(为简单起见,我混淆了所有内容,然后将原始内容复制到proxy.py混淆后的内容上)

所以,现在用户代码导入proxy.pyusingimportlib而不是obfuscated.py.

并且代理仅导入obfuscated.py

# proxy.py
import obfuscated
于 2020-09-16T22:26:56.033 回答
0

我设法以这种方式动态导入模块:

    code = open('c:\Users\me\obfuscated.py','r').read()
    spec = importlib.util.spec_from_loader(package_name,loader=None)
    module = importlib.util.module_from_spec(spec)
    module.__file__ = 'c:\Users\me\obfuscated.py'
    globals_dict = {"__file__":module.__file__}
    exec(code, globals_dict)
    for item in [x for x in globals_dict["__builtins__"] if not x.startswith("_")]:
        setattr(module,item,globals_dict["__builtins__"].get(item))

它从文件中读取代码,启动模块,并最终将变量放入字典中。您可以在以下位置找到模块的功能globals_dict["__builtins__"]

于 2021-11-28T08:02:11.563 回答