Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] RFT mode cast errors when importing variables/Class #1513

Closed
lemonbu5h opened this issue Oct 5, 2023 · 4 comments
Closed

[BUG] RFT mode cast errors when importing variables/Class #1513

lemonbu5h opened this issue Oct 5, 2023 · 4 comments
Labels

Comments

@lemonbu5h
Copy link

When using the '-enable-rft' option, I noticed that there is no way to import variables or classes. However, the '--enable-jit' option works well without any errors.

Suppose the project structure is:

project/
├── main.py
├── utils/
    ├── __init__.py
    └── settings.py

settings.py

NUM_INTERVAL = 10

main.py

from utils.settings import NUM_INTERVAL

if __name__ == '__main__':
    print(NUM_INTERVAL)

pyarmor command

$ pyarmor gen -O dist --enable-rft .
INFO     Python 3.8.16
INFO     Pyarmor 8.3.10 (group), 006102, XXXXX
INFO     Platform linux.x86_64
INFO     search inputs ...
INFO     find package at .
INFO     find 1 top resources
INFO     start to generate runtime files
INFO     target platforms {'linux.x86_64'}
INFO     write dist/pyarmor_runtime_006102/pyarmor_runtime.so
INFO     patch runtime file
INFO     generate runtime files OK
INFO     start to obfuscate scripts
INFO     process resource "."
INFO     obfuscating file main.py
INFO     write dist/./main.py
INFO     obfuscating file settings.py
INFO     write dist/./utils/settings.py
INFO     obfuscating file __init__.py
INFO     write dist/./utils/__init__.py
INFO     obfuscate scripts OK

Then run the obfuscated dist/main.py:

$ python3 dist/main.py
Traceback (most recent call last):
  File "<frozen __main__>", line 3, in <module>
  File "<frozen ..main>", line 1, in <module>
ImportError: cannot import name 'NUM_INTERVAL' from 'utils.settings' (/home/dist/utils/settings.py)
@lemonbu5h lemonbu5h added the bug label Oct 5, 2023
@lemonbu5h lemonbu5h changed the title [BUG] RFT mode cast errors when importing variables/Class [BUG] RFT mode cast errors when importing variables/Class Oct 5, 2023
@jondy
Copy link
Contributor

jondy commented Oct 5, 2023

Got it, thanks. It will be fixed in next release.

@jondy
Copy link
Contributor

jondy commented Oct 13, 2023

Fixed in 8.3.11

@Sakura4036
Copy link

加密使用的选项和命令

$ pyarmor gen -O pack_test_py -r pack_test  --enable-jit --obf-code 1 --outer  --mix-str --enable-rft

Suppose the project structure is:

project/
├── main.py
├── a/
    ├── __init__.py
    └── aa.py
├── b/
    ├── __init__.py
    └── bb.py

aa.py:

aaa = "dafagfgasdf" + "⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻"

def say():
    print(aaa)

bb.py:

from a.aa import say, aaa


def sayb():
    print("bbb")
    print("from a.aa import {}".format(aaa))


def merge():
    print('merge', )
    say()
    sayb()

main.py:

from b.bb import merge

if __name__ == '__main__':
    merge()

Error

Traceback (most recent call last):
  File "<frozen __main__>", line 3, in <module>
  File "<frozen pack_test.main>", line 6, in <module>
  File "<frozen b.bb>", line 3, in <module>
  File "<frozen pack_test.b.bb>", line 5, in <module>
ImportError: cannot import name 'aaa' from 'a'

trace log:

trace.co             pack_test.main:1:<module>
trace.co             pack_test.__init__:1:<module>
trace.rft            pack_test.a.aa:5 (aaa->pyarmor__3)
trace.rft            pack_test.a.aa:9 (print->pyarmor__5)
trace.rft            pack_test.a.aa:9 (aaa->pyarmor__3)
trace.mix.str        pack_test.a.aa:5:'dafagfgasdf'
trace.mix.str        pack_test.a.aa:5:'⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻'
trace.co             pack_test.a.aa:1:<module>
trace.co             pack_test.a.aa:8:say
trace.rft            pack_test.b.bb:5 (from a.aa import say, aaa as pyarmor__3)
trace.rft            pack_test.b.bb:8 (sayb->pyarmor__4)
trace.rft            pack_test.b.bb:9 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (aaa->pyarmor__3)
trace.rft            pack_test.b.bb:14 (print->pyarmor__5)
trace.rft            pack_test.b.bb:16 (sayb->pyarmor__4)
trace.mix.str        pack_test.b.bb:10:'from a.aa import {}'
trace.co             pack_test.b.bb:1:<module>
trace.co             pack_test.b.bb:8:pyarmor__4
trace.co             pack_test.b.bb:13:merge

When I import aaa in the __init__.py of the a module:

from .aa import aaa, say

__all__ = [
    'aaa',
    'say'
]

new Error:

Traceback (most recent call last):
  File "<frozen __main__>", line 3, in <module>
  File "<frozen pack_test.main>", line 6, in <module>
  File "<frozen b.bb>", line 3, in <module>
  File "<frozen pack_test.b.bb>", line 5, in <module>
  File "<frozen a>", line 3, in <module>
  File "<frozen pack_test.a>", line 5, in <module>
ImportError: cannot import name 'pyarmor__3' from 'a.aa'

trace log:

trace.co             pack_test.main:1:<module>
trace.co             pack_test.__init__:1:<module>
trace.rft            pack_test.a.aa:9 (print->pyarmor__5)
trace.mix.str        pack_test.a.aa:5:'dafagfgasdf'
trace.mix.str        pack_test.a.aa:5:'⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻'
trace.co             pack_test.a.aa:1:<module>
trace.co             pack_test.a.aa:8:say
trace.co             pack_test.a.__init__:1:<module>
trace.rft            pack_test.b.bb:5 (from a import say, aaa as pyarmor__3)
trace.rft            pack_test.b.bb:8 (sayb->pyarmor__4)
trace.rft            pack_test.b.bb:9 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (aaa->pyarmor__3)
trace.rft            pack_test.b.bb:14 (print->pyarmor__5)
trace.rft            pack_test.b.bb:16 (sayb->pyarmor__4)
trace.mix.str        pack_test.b.bb:10:'from a.aa import {}'
trace.co             pack_test.b.bb:1:<module>
trace.co             pack_test.b.bb:8:pyarmor__4
trace.co             pack_test.b.bb:13:merge

我查看了 深入了解RFT , 不是所有在模块__init__中定义的属性都会被保留,而不是替换吗?不太理解为什么会出现这样的问题

@Sakura4036
Copy link

加密使用的选项和命令

$ pyarmor gen -O pack_test_py -r pack_test  --enable-jit --obf-code 1 --outer  --mix-str --enable-rft

Suppose the project structure is:

project/
├── main.py
├── a/
    ├── __init__.py
    └── aa.py
├── b/
    ├── __init__.py
    └── bb.py

aa.py:

aaa = "dafagfgasdf" + "⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻"

def say():
    print(aaa)

bb.py:

from a.aa import say, aaa


def sayb():
    print("bbb")
    print("from a.aa import {}".format(aaa))


def merge():
    print('merge', )
    say()
    sayb()

main.py:

from b.bb import merge

if __name__ == '__main__':
    merge()

Error

Traceback (most recent call last):
  File "<frozen __main__>", line 3, in <module>
  File "<frozen pack_test.main>", line 6, in <module>
  File "<frozen b.bb>", line 3, in <module>
  File "<frozen pack_test.b.bb>", line 5, in <module>
ImportError: cannot import name 'aaa' from 'a'

trace log:

trace.co             pack_test.main:1:<module>
trace.co             pack_test.__init__:1:<module>
trace.rft            pack_test.a.aa:5 (aaa->pyarmor__3)
trace.rft            pack_test.a.aa:9 (print->pyarmor__5)
trace.rft            pack_test.a.aa:9 (aaa->pyarmor__3)
trace.mix.str        pack_test.a.aa:5:'dafagfgasdf'
trace.mix.str        pack_test.a.aa:5:'⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻'
trace.co             pack_test.a.aa:1:<module>
trace.co             pack_test.a.aa:8:say
trace.rft            pack_test.b.bb:5 (from a.aa import say, aaa as pyarmor__3)
trace.rft            pack_test.b.bb:8 (sayb->pyarmor__4)
trace.rft            pack_test.b.bb:9 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (aaa->pyarmor__3)
trace.rft            pack_test.b.bb:14 (print->pyarmor__5)
trace.rft            pack_test.b.bb:16 (sayb->pyarmor__4)
trace.mix.str        pack_test.b.bb:10:'from a.aa import {}'
trace.co             pack_test.b.bb:1:<module>
trace.co             pack_test.b.bb:8:pyarmor__4
trace.co             pack_test.b.bb:13:merge

When I import aaa in the __init__.py of the a module:

from .aa import aaa, say

__all__ = [
    'aaa',
    'say'
]

new Error:

Traceback (most recent call last):
  File "<frozen __main__>", line 3, in <module>
  File "<frozen pack_test.main>", line 6, in <module>
  File "<frozen b.bb>", line 3, in <module>
  File "<frozen pack_test.b.bb>", line 5, in <module>
  File "<frozen a>", line 3, in <module>
  File "<frozen pack_test.a>", line 5, in <module>
ImportError: cannot import name 'pyarmor__3' from 'a.aa'

trace log:

trace.co             pack_test.main:1:<module>
trace.co             pack_test.__init__:1:<module>
trace.rft            pack_test.a.aa:9 (print->pyarmor__5)
trace.mix.str        pack_test.a.aa:5:'dafagfgasdf'
trace.mix.str        pack_test.a.aa:5:'⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻'
trace.co             pack_test.a.aa:1:<module>
trace.co             pack_test.a.aa:8:say
trace.co             pack_test.a.__init__:1:<module>
trace.rft            pack_test.b.bb:5 (from a import say, aaa as pyarmor__3)
trace.rft            pack_test.b.bb:8 (sayb->pyarmor__4)
trace.rft            pack_test.b.bb:9 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (print->pyarmor__5)
trace.rft            pack_test.b.bb:10 (aaa->pyarmor__3)
trace.rft            pack_test.b.bb:14 (print->pyarmor__5)
trace.rft            pack_test.b.bb:16 (sayb->pyarmor__4)
trace.mix.str        pack_test.b.bb:10:'from a.aa import {}'
trace.co             pack_test.b.bb:1:<module>
trace.co             pack_test.b.bb:8:pyarmor__4
trace.co             pack_test.b.bb:13:merge

我查看了 深入了解RFT , 不是所有在模块__init__中定义的属性都会被保留,而不是替换吗?不太理解为什么会出现这样的问题

pyarmor 8.3.11,
python 3.7.12
windows 10

@jondy jondy closed this as completed Oct 14, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants