python的保护——删除/修改内置函数、限制调用

June 11, 2020 · 分享 · 58次阅读

Q:为什么要对python脚本保护?
A:虽然自己代码写的菜,但是确实不想暴露源代码。

方案一 删除内置函数

dir可以用来查看参数的属性、方法列表,即使你用pyinstaller打包了脚本,但其他人依然可以在import后用它查看你的函数方法等。
如果把这个函数删除则可以避免这个问题。

脚本1:

import builtins
delattr(builtins, "dir")
class T:
    def a(self):
        print("is a.")

脚本2:

from script1 import T
t = T()
t.a()
print(dir(t))

脚本2输出:

is a.
Traceback (most recent call last):
  File "script1.py", line 10, in <module>
    print(dir(t))
NameError: name 'dir' is not defined

方案二 判断调用来源函数名

主要用到inspect这个库

脚本1:

from inspect import getouterframes, currentframe

class T:
    def a(self):
        callname = getouterframes(currentframe(), 2)[1][3]
        if callname != "callreal":
            print("You are idiot!")
        else:
            print("is a.")

脚本2:

from script1 import T

t = T()

def calltest():
    t.a()

def callreal():
    t.a()

if __name__ == "__main__":
    calltest()
    callreal()

脚本2输出:

You are idiot!
is a.

方案三 修改内置函数

继承——修改——覆盖

oldList = list
class NewList(list):
    def __len__(self):
        raise AttributeError("禁止使用!")
list = NewList
q = list()
print(q.__len__())

输出:

Traceback (most recent call last):
  File "script2.py", line 13, in <module>
    print(q.__len__())
  File "script2.py", line 10, in __len__
    raise AttributeError("禁止使用!")
AttributeError: 禁止使用!

方案四 对类中的函数重写为自己的逻辑

示例:

class B(type):
    def __getattribute__(self, name):
        if name == "__dict__" or name == "__bases__":
            return {"禁偷窥":""}
        return super().__getattribute__(name)

class A(metaclass=B):
    def a(self):
        print("a")

    def b(self):
        print("b")

t = A()
t.a()
t.b()

print(dir(A))
print("a" in dir(A))
print("b" in dir(A))

输出:

a
b
['禁偷窥']
False
False

ENJOY 0

none

最后编辑于1年前

添加新评论

avatar

未末

118

文章数

260

评论数

7

分类

新鲜出炉の评论

获取CSDN学院m3u8解密的key
路人甲
路人甲2021-10-05

请问这个方法失效了么?获取到的是空串

获取CSDN学院m3u8解密的key
DK爱梦游
DK爱梦游2021-09-29

大佬求教,51cto的KEY怎么获取?

XstreamDL-CLI BUG修复记录
poohboy
poohboy2021-09-25

大佬,我想问一下,iqiyi的m3u8是不是没法获取?我只找到了一个dash链接,然后手动下载了里面的m4s,但用nilaoda的那个解密工具解不了,老提示获取kid失败

XstreamDL-CLI BUG修复记录
Andist
Andist2021-09-17

en……实在不好意思,代理我知道怎么启用了。我只勾选了自定义代理,但没有填写proxy参数,我太愚钝了对不起!!!

XstreamDL-CLI BUG修复记录
Andist
Andist2021-09-17

感谢您开发的这款软件,对于第一次下载mpd的小白而言很友好! 这段时间用下来就是有时候下载直连的海外视频流时可能因为网络状况不佳,会有下载不完整的问题,下载完进度没到100%,但是也合并解密了,不知道能否增加下载不完整在最后输出报错信息的功能呢? 以及我想请教一下如何让下载器使用小飞机的代理呢?我尝试在“使用自定义代理”的选项上勾选,但是好像命令行中没有变化? (另外我猜您图中的样本是在下载CP+上的用九柑仔店是吗?我也很喜欢这部剧,是我心目中排名第一的台剧哈哈)