怎样防止对系统函数的监视
本帖最后由 baitang36 于 2023-6-16 11:16 编辑autolisp可以重定义系统函数,这样可以通过重定义系统函数来进行监视,比如可以通过重定义=函数来监视明码比较的注册码,导致真正的注册码泄露给盗版者。
以下是试验过程:
命令: (defun + (a b) (princ a))
+
命令: (+ 1 2)
11
命令: (load "c:/00/trf_9.fas")
T
命令: (tranf "init:AUTOLISP-package")
T
命令: (init:AUTOLISP-package)
nil
命令: (+ 1 2)
3
命令: (defun c() (princ 3))
C
命令: (c)
33
命令: (init:AUTOLISP-package)
nil
命令: (c)
33
结论:比较注册码之前,调用init:AUTOLISP-package这个保留函数,可以初始化系统函数到原始状态,这样自定义的系统函数失效,也就无法监视系统函数了。
用法:
(load "trf_9.fas") ;加载
(tranf "init:AUTOLISP-package") ;保留函数转成普通函数
(init:AUTOLISP-package) ;调用
盗版的人愿意花这么多时间精力来破解,为啥就不花点功夫去创新 老师没有讲出重点,其实总结下来就是一句话,函数init:AUTOLISP-package的作用是恢复所有系统函数的功能,只要将该函数放到你的程序的首行,即可防止系统函数被修改 小菜123 发表于 2023-6-13 14:51
如果load也被重定义了,就起不了作用
还有个办法,用独立名称空间。空间内用的系统函数都是干净的,只有vlx内部的fas才能起作用 看一下是什么 看看大师又出了什么杰作,太顶了 看不懂 谢谢鹏哥,顶起 我看不错噢 谢谢楼主! 看看是什么 本帖最后由 baitang36 于 2023-6-13 12:38 编辑
有的朋友说,看不懂。举个简单的例子吧
郎大侠的经典注册程序,http://bbs.mjtd.com/forum.php?mo ... hlight=%D7%A2%B2%E1,简洁、小巧,有很多人在用,也有很多人修改后在用。
;;; ==============================================
;;; lsp注册模块
;;; 使用方法,将(jiany0001)插到你的程序中即可使用
;;; ==============================================
(defun jiany0001(/ bb dcl_re f fname fsys jqm n zcm)
(vl-load-com)
(defun jy (jqm) ; 算法:注册码=(机器码+144356842)^0.89取整,可自己修改
(itoa (fix (expt (+ (atoi jqm) 144356842) 0.89))))
(setq fsys (vlax-create-object "Scripting.FileSystemObject"))
(if (/= (vlax-invoke-method fsys "DriveExists" "C") :vlax-false)
(setq jqm (itoa (vlax-get-property (vlax-invoke-method fsys "GetDrive" "C") "SerialNumber"))))
(setq zcm (vl-registry-read "HKEY_CURRENT_USER\\Software\\TH++\\" "Number"))
(if (/= zcm (jy jqm))
(progn
(setq fname (vl-filename-mktemp "zhuc.dcl") f (open fname "w"))
(write-line "zhuc:dialog{ label=\"注册信息\";" f)
(write-line ":edit_box{label=\" 机器码\";key=\"e01\";edit_width=18;}" f)
(write-line ":edit_box{label=\" 授权码\";key=\"e02\";edit_width=18;}" f)
(write-line ":row{:button {label=\"注册\";key=\"e03\";is_default=true;}" f)
(write-line ":button {label=\"取消\";is_cancel=true;}}}" f)
(close f)
(new_dialog "zhuc" (setq dcl_re (load_dialog fname)))
(set_tile "e01" jqm)
(set_tile "e02" "联系QQ:XXXXXX")
(action_tile "e03" "(setq zcm(get_tile \"e02\")) (done_dialog 1)")
(if (= (start_dialog) 1)(vl-registry-write "HKEY_CURRENT_USER\\software\\TH++\\" "Number" zcm))
(unload_dialog dcl_re)
(vl-file-delete fname)
(if (/= zcm (jy jqm))
(progn(alert "注册失败!") (exit))
(alert "注册成功!"))))
(princ)
)
对于这个程序,只要监视系统函数 /=,重定义它,就可以轻松拿到注册码。
用于监视的程序代码很简单,就这两句:
(setq o/= /=)
(DEFUN /=( A B ) (PRINT A ) (PRINT B ) (o/= A B ))
调用(init:AUTOLISP-package)后,监视程序失效, /=这个函数恢复原始状态,注册码就拿不到了。
试验过程:
命令: (LOAD "D:/监视不等于程序.lsp")
命令: (LOAD "D:/jian.lsp")
:vlax-true
:vlax-false
"12345"
"-725518847"
"1234567"
"-725518847" ; 错误: quit / exit abort
在注册框中随便输入"12345",这里的"-725518847" 就是真正的注册码。
学习一下...