使用importlib导入pyarmor混淆代码

问题描述

假设我有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'

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

反正有实现这一目标的方法吗?

解决方法

我认为我有一种基于此处的内容的方法:https://pyarmor.readthedocs.io/en/latest/mode.html#restrict-mode

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

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

因此,现在用户代码使用proxy.py而不是importlib来导入obfuscated.py

并且代理仅导入obfuscated.py

# proxy.py
import obfuscated