Skip to content

Commit 7c4ca39

Browse files
committed
Refine cross protection code
1 parent 8a5e145 commit 7c4ca39

File tree

2 files changed

+69
-29
lines changed

2 files changed

+69
-29
lines changed

src/protect_code.pt

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,18 @@ def protect_pytransform():
1515
raise RuntimeError('unexpected obfuscated script')
1616

1717
def check_mod_pytransform():
18-
CO_NAMES = set(['Exception', 'LoadLibrary', 'None', 'PYFUNCTYPE',
19-
'PytransformError', '__file__', 'flags', 'debug',
20-
'_get_error_msg', '_handle', '_load_library',
21-
'_pytransform', 'abspath', 'basename', 'byteorder',
22-
'c_char_p', 'c_int', 'c_void_p', 'calcsize', 'cdll',
23-
'dirname', 'decode', 'encode', 'exists', 'exit',
24-
'format_platname', 'get_error_msg', 'init_pytransform',
25-
'init_runtime', 'int', 'isinstance', 'join', 'lower',
26-
'normpath', 'os', 'path', 'platform', 'print',
27-
'pyarmor_init', 'pythonapi', 'restype', 'set_option',
28-
'str', 'struct', 'sys', 'system', 'version_info'])
29-
30-
colist = []
31-
32-
for name in ('dllmethod', 'init_pytransform', 'init_runtime',
33-
'_load_library', 'pyarmor_init', 'pyarmor_runtime'):
34-
colist.append(getattr(pytransform, name).{code})
35-
36-
for name in ('init_pytransform', 'init_runtime'):
37-
colist.append(getattr(pytransform, name).{closure}[0].cell_contents.{code})
38-
colist.append(pytransform.dllmethod.{code}.co_consts[1])
39-
40-
for co in colist:
41-
if not (set(co.co_names) < CO_NAMES):
18+
def _check_co_key(co, v):
19+
return (len(co.co_names), len(co.co_consts), len(co.co_code)) == v
20+
for k, (v1, v2, v3) in {keylist}:
21+
co = getattr(pytransform, k).{code}
22+
if not _check_co_key(co, v1):
4223
raise RuntimeError('unexpected pytransform.py')
24+
if v2:
25+
if not _check_co_key(co.co_consts[1], v2):
26+
raise RuntimeError('unexpected pytransform.py')
27+
if v3:
28+
if not _check_co_key(co.{closure}[0].cell_contents.{code}, v3):
29+
raise RuntimeError('unexpected pytransform.py')
4330

4431
def check_lib_pytransform():
4532
platname = pytransform.sys.platform
@@ -50,8 +37,6 @@ def protect_pytransform():
5037
filename = pytransform.os.path.join(pytransform.sys._MEIPASS, libname)
5138
else:
5239
filename = pytransform.os.path.join({rpath}, libname)
53-
if not pytransform.os.path.exists(filename):
54-
filename = pytransform.os.path.join({rpath}, 'pytransform', libname)
5540
size = {size}
5641
n = size >> 2
5742
with open(filename, 'rb') as f:

src/utils.py

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,59 @@ def patch_plugins(plugins):
365365
return result
366366

367367

368+
def _build_source_keylist(source, code, closure):
369+
result = []
370+
flist = ('dllmethod', 'init_pytransform', 'init_runtime', '_load_library',
371+
'get_registration_code', 'get_expired_days', 'get_hd_info',
372+
'get_license_info', 'get_license_code', 'format_platname',
373+
'pyarmor_init', 'pyarmor_runtime')
374+
375+
def _make_value(co):
376+
return len(co.co_names), len(co.co_consts), len(co.co_code)
377+
378+
def _make_code_key(co):
379+
v1 = _make_value(co)
380+
v2 = _make_value(co.co_consts[1]) if co.co_name == 'dllmethod'else None
381+
co_closure = getattr(co, closure, None)
382+
v3 = _make_value(getattr(co_closure[0].cell_contents, code)) \
383+
if co_closure else None
384+
return v1, v2, v3
385+
386+
mod_co = compile(source, 'pytransform', 'exec')
387+
result.append((-1, _make_code_key(mod_co)))
388+
mod_consts = mod_co.co_consts
389+
for i in range(len(mod_consts)):
390+
co_const = mod_consts[i]
391+
co = getattr(co_const, code, None)
392+
if co and co.co_name in flist:
393+
result.append((i, _make_code_key(co)))
394+
return result
395+
396+
397+
def _build_pytransform_keylist(mod, code, closure):
398+
result = []
399+
flist = ('dllmethod', 'init_pytransform', 'init_runtime', '_load_library',
400+
'get_registration_code', 'get_expired_days', 'get_hd_info',
401+
'get_license_info', 'get_license_code', 'format_platname',
402+
'pyarmor_init', 'pyarmor_runtime')
403+
404+
def _make_value(co):
405+
return len(co.co_names), len(co.co_consts), len(co.co_code)
406+
407+
def _make_code_key(co):
408+
v1 = _make_value(co)
409+
v2 = _make_value(co.co_consts[1]) if co.co_name == 'dllmethod'else None
410+
co_closure = getattr(co, closure, None)
411+
v3 = _make_value(getattr(co_closure[0].cell_contents, code)) \
412+
if co_closure else None
413+
return v1, v2, v3
414+
415+
for name in flist:
416+
co = getattr(getattr(mod, name), code)
417+
result.append((name, _make_code_key(co)))
418+
return result
419+
420+
368421
def make_protect_pytransform(template=None, filename=None, rpath=None):
369422
if filename is None:
370423
filename = pytransform._pytransform._name
@@ -382,10 +435,12 @@ def make_protect_pytransform(template=None, filename=None, rpath=None):
382435

383436
code = '__code__' if sys.version_info[0] == 3 else 'func_code'
384437
closure = '__closure__' if sys.version_info[0] == 3 else 'func_closure'
385-
rpath = 'pytransform.os.path.dirname(__file__)' if rpath is None \
386-
else repr(rpath)
438+
keylist = _build_pytransform_keylist(pytransform, code, closure)
439+
rpath = 'pytransform.os.path.dirname(pytransform.__file__)' \
440+
if rpath is None else repr(rpath)
387441
return buf.format(code=code, closure=closure, size=size, checksum=cosum,
388-
rpath=rpath, filename=repr(os.path.basename(filename)))
442+
keylist=keylist, rpath=rpath,
443+
filename=repr(os.path.basename(filename)))
389444

390445

391446
def _frozen_modname(filename, filename2):

0 commit comments

Comments
 (0)