一个有趣的试验,抹掉全局变量
本帖最后由 baitang36 于 2021-12-22 13:07 编辑做一个tt2.lsp
源码如下:
(defun c:tt2 ()
(setq aaaa 8848)
(princ aaaa)
(princ)
)
加载后,在命令行输入tt2回车,显示8848,正常。
然后加载 syz-wipe-sym.fas,它定义了一个函数syz-wipe-sym,作用是抹掉内存中某个符号的名字。用法:(syz-wipe-sym ‘symbol)
执行:(syz-wipe-sym’aaaa);抹掉符号 aaaa
输入tt2回车,仍然显示 8848
!aaaa,显示nil,说明这个全局变量已经被抹掉了。但不影响c:tt2这个函数的运行。
(setq aaaa 7777)
!aaaa 显示7777
tt2还是显示8848,说明给aaaa赋值不影响c:tt2这个函数。aaaa这个全局变量已经和c:tt2这个函数无关了。
就像是c:tt2中的aaaa成了内部变量了,与外部的变量没有关系。
这是为什么呢?
程序加载到内存后,变量都是用序号来访问的,不管它的名字了。把变量名字抹掉,并不影响函数功能。
外部的变量必须用名字,程序之间的调用只能通过变量名,抹掉后就不能用了。
试验过程如下:
命令: (LOAD "D:/08/tt2.lsp") C:TT2
命令: tt2
8848
命令: (LOAD "D:/08/syz-wipe-sym.fas") nil
命令: (syz-wipe-sym 'aaaa)
命令: !aaaa
nil
命令: tt2
8848
命令: (setq aaaa 7777)
7777
命令: !aaaa
7777
命令: tt2
8848
命令: !aaaa
7777
本帖最后由 tryhi 于 2021-12-23 00:58 编辑
这个作用很大,相当于可以申明一个仅对本程序有效的变量(或函数),感觉有点像python的闭包?申明的全局变量完全不用怕跟别人的重复导致出现冲突了(至少自己的程序不会被别人的全局变量搞到异常),真是一个牛13的函数
比如程序A.lsp
(syz-wipe-sym 'a)
(setq a 1)
(defun c:tt1 ()
(setq a(1+ a))
(princ a)
)
跟程序B.lsp
(syz-wipe-sym 'a)
(setq a 1)
(defun c:tt2 ()
(setq a(1+ a))
(princ a)
)
两个分开两个文件加载,两个命令都用了同一个全局变量a,但是这两个居然完全不冲突,各干各的,太优秀了
(defun c:tt1 ()
(defun test ()
(setq aaa "0123")
)
(test)
(setq bbb nil)
(setq bbb aaa)
(print bbb)
(princ)
)
(syz-wipe-sym 'aaa)
(defun c:tt2 ()
(c:tt1)
(setq ccc nil)
(setq ccc aaa)
(print ccc)
(princ)
)
;一次性依次加载
;tt1 tt2 都能正常执行,可以看出程序全局变量aaa在程序过程中没有被清空,程序完成后才清空的
;先加载 tt1 (syz-wipe-sym 'aaa)
;再单独加载tt2
;tt1不受影响,全局变量aaa被清空
;tt2输出nil,当tt1完成后全局变量aaa就会被清空
(defun c:tt2 ()
(setq aaa "111")
(setq bbb aaa)
(princ bbb)
(princ)
)
(defun c:tt3 ()
(setq aaa "789")
(setq bbb aaa)
(princ bbb)
(princ)
)
(syz-wipe-sym 'aaa)
(defun c:tt4 ()
(setq aaa "000")
(setq bbb aaa)
(princ bbb)
(princ)
)
;一次性依次加载
;tt2 tt3 tt4的aaa全局变量都无效
;先加载 tt2 tt3 (syz-wipe-sym 'aaa)
;再单独加载tt4,tt4不受影响 还没搞懂用途 yanshengjiang 发表于 2021-12-22 20:01
还没搞懂用途
用途是想用来解决注册函数容易被替换的问题的,你把注册函数名抹掉了,你自己还照样可以用,但破解者怎么也用不了。 哦哦 我以为破解只能fas2lsp呢 呵呵 yanshengjiang 发表于 2021-12-22 22:13
哦哦 我以为破解只能fas2lsp呢 呵呵
变成lsp后再去修改,这不叫破解。这是抄袭别人程序来做自己的源码。
破解是直接对fas进行修改,跳过它的检查,让它不用注册就能正常运行。 本帖最后由 crtrccrt 于 2021-12-23 07:37 编辑
日益精进日益精进
日益精进
MAKE 待后研究,,,,,,,,,,,,,,