为LSP加密的新思路
<p>我的思路是这样的不知是否可行:<br/>加载程序时,检查是否有注册表项AA,<br/> (如果有,用公式对AA求值的结果为XX,用XX与注册表项BB对比,<br/> (如果一致,则加载程序成功)<br/> (如果不一致或没有BB项,则给出用户申请号AA,提示注册<br/> (如果用户输入正确,则写入或履盖注册表BB,并加载程序成功)<br/> (如果不正确,退出)<br/> )<br/> )<br/> <br/>(如果没有,写出一个随机的号到注册表AA,并用以上法进行<br/> )</p><p></p><p>所以注册表AA,在第一次运行时已写入了,以后不用再改了,比如写入系统时间20080101123654367到AA,<br/>上面的XX是作者用自己的公式来计算的,比如AA/4*3+456,公式在程序里,程序已生成VLX,<br/>用户须将AA告诉作者,作者才能给出XX,<br/>所以注册表写入更隐藏的地方,也可将申请号用AA进行另一公式计算,使得用户在注册表里搜不到申请号AA,否则用户将AA的注册表导入其它电脑,用上次作者的注册号进行注册。 <br/>我认为这样的好处是:有的用主板号或其它的来得到上面AA,但主板生产商不一样,很多读取不到。。。</p><p>大家认为这样行吗,看高手能否做到。<br/>仅供学习用,大家也不要认为还要加密这么小器</p> <p>大家看看这个是否可以,这是本人编写的,里面有一些与本注册程序无关的函数,这里不再算数删除; register_lisp<br/>; 2006.11 by emrys<br/> (defun register()<br/> (GRTEXT -2 "请输入授权码......") <br/> (setq Pass_File "C:\\Program Files\\Common Files\\Autodesk Shared\\lisp.ry")<br/> (setq fn(findfile Pass_File)) <br/> (if (= fn nil) ;创建文件<br/> (PROGN <br/> (setq fn Pass_File) <br/> (setq fh(open fn "w"))<br/> (setq str1 "Don't remove these data!!\n")<br/> (princ str1 fh) <br/> (getcode)<br/> (princ mcode fh)<br/> (princ "\n" fh)<br/> (princ sncode fh)<br/> (close fh) <br/> (read_data fn) <br/> (pwd)<br/> ) ;END PROGN<br/> (progn<br/> (read_data fn)<br/> (if (or(= dt3 nil)(/= dt2 dt3))<br/> (pwd)<br/> (progn<br/> (setq passflage 1)<br/> (princ"程序运行条件成熟 ,执行程序......")<br/> )<br/> )<br/> ) ;end progn<br/> ) ;end if</p><p> (princ )<br/> <br/> ) ;end defun</p><p>;df8888888888888888<br/>(defun pwd ()<br/> (setq dcl_id(load_dialog "dcl\\pwd.dcl"))<br/> (if (null (new_dialog "pwd" dcl_id))<br/> (exit) <br/> )<br/> (setq fn Pass_File) <br/> ;(read_data fn) <br/> (set_tile "mcode" dt1) <br/> (if (or(= dt3 nil)(/= dt2 dt3))<br/> (progn <br/> (setq dt3 "你还没有注册!请输入授权号") <br/> (setq passflage 0)<br/> )<br/> )<br/> (set_tile "password" dt3) <br/> (action_tile "password" "(GETDATApwd)(done_dialog 3) ")<br/> (action_tile "accpet" "(done_dialog 3)")<br/> (action_tile "cancel" "(done_dialog 0)")<br/> ;(setq mc(get_tile "mcode"))<br/> ;(princ" mc=")<br/> ; (princ mc)<br/> ;(setq psd(get_tile "password" ))<br/> ;(princ " psd=")<br/> ; (princ psd)<br/> ;(saveok)<br/> ;(getdata)<br/> <br/> (setq what_next(start_dialog))<br/> (cond<br/> ((= what_next 3)(SAVEOK)) <br/> ;((= what_next 1) (princ "\n dfg "))<br/> ((= what_next 0) (princ "取消运行程序 ")) )<br/> <br/> (start_dialog) <br/> (unload_dialog dcl_id) <br/> (princ) <br/>)<br/>(defun getdatapwd()<br/> (setq mc(get_tile "mcode"))<br/> (setq psd(get_tile "password" )) <br/> )<br/>(defun saveok()<br/> ;(setq psd(get_tile "password" )) <br/> (if (= dt2 psd)<br/> (progn<br/> (setq fn Pass_File) <br/> (setq fh(open fn "a"))<br/> (princ "\n" fh)<br/> (princ psd fh)<br/> (alert "注册成功!") <br/> (close fh)<br/> (setq passflage 1)<br/> (princ "注册成功!")<br/> )<br/> (progn<br/> (alert "授权号不正确!请重新输入")<br/> (setq passflage 0)<br/> (pwd)<br/> )<br/> )<br/>) <br/>(defun getcode() <br/> (setq sum(rnd 1 11)) <br/> (princ sum) <br/> (setq STRPWD " dfgg hewa wwhu ijut kops gper jfgr pznd vwek murj" ) <br/> (SETQ sdt1(STRLEN STRPWD))<br/> (SETQ k(/(+ sdt1 1)5))<br/> ;(princ sdt1)<br/> ;(princ STRPWD) <br/> (setq mcode(substr strpwd (+(* sum 5)1) 19))<br/> (setq sncode(substr strpwd (-(*(- k sum) 5)19) 19)) <br/> (PRINC)<br/> )<br/> ;;读取数据<br/> (defun read_data(filename) <br/> (if (setq fp(open filename "r")) <br/> (progn <br/> (setq dt0(read-line fp)) <br/> (setq dt1(read-line fp)) <br/> (setq dt2(read-line fp))<br/> (setq dt3(read-line fp))<br/> (close fp) <br/> ; (setq listmcode dt1) <br/> );end progn<br/> <br/> (princ(strcat"\n failed Open file:"filename "!!!\n "))<br/> ) ;end if <br/> <br/> ) <br/> ;;读取数束 </p><p>;生成随数 <br/> (defun rnd(n1 n2) <br/> (setq ra 66791 rb 17 nn 30)<br/> (setq imin(expt 2 31) imax(1- imin))<br/> (if (> n1 n2)<br/> (setq n3 n1 n1 n2 n2 n3)<br/> )<br/> <br/> (setq rn(atoi(substr(rtos(getvar "cdate")2 7)14)))<br/> (repeat nn<br/> (setq rn(+(* rn ra)rb))<br/> (if (minusp rn)(setq rn(- rn imin))) <br/> ) <br/> ;(setq pwdstr"")<br/> (setq rn(rem rn imax))<br/> (setq rn(/ rn imax 1.0))<br/> (setq rn(+(fix(* rn(1+ (- n2 n1))))n1)) <br/> )</p><p>;888888888888888888888888888</p><p>(defun psaveoldsysarg () ;保存系统变量<br/> <br/> (setq oldcmde (getvar "cmdecho")<br/> oldblip (getvar "blipmode")<br/> oldosmo (getvar "osmode")<br/> oldclay (getvar "clayer")<br/> oldcolo (getvar "cecolor")<br/> oldltyp (getvar "celtype")<br/> oldchec (getvar "limcheck")<br/> oldrege (getvar "regenmode")<br/> oldstyl (getvar "textstyle")<br/> oldtxte (getvar "texteval") <br/> olderr *error*<br/> <br/> )<br/> <br/> ;;在所有的程序中使用<br/> (setq pxl_osmode (getvar "osmode")) </p><p> ;; (if (tblsearch "ucs" "olducs") <br/>;; (command "._ucs" "s" "olducs" "y")<br/>;; (command "._ucs" "s" "olducs")<br/>;; )<br/> <br/> (setvar "cmdecho" 0)<br/> (setvar "blipmode" 0)<br/> (setvar "osmode" 0)<br/> (setvar "limcheck" 0)<br/> (setvar "regenmode" 1)<br/> (setvar "texteval" 1)<br/> ;;(command "handles" "on")<br/> (setq *error* pmterror) <br/> ;(pxl_undo_push)<br/>)</p><p><br/>(defun prestoreoldsysarg () ;恢复系统变量<br/> ;(pxl_undo_pop)<br/> <br/> (if (= (type oldcmde) 'int) (setvar "cmdecho" oldcmde))<br/> (if (= (type oldblip) 'int) (setvar "blipmode" oldblip))<br/> (if (= (type oldosmo) 'int) (setvar "osmode" oldosmo))<br/> (if (= (type oldchec) 'int) (setvar "limcheck" oldchec))<br/> (if (= (type oldrege) 'int) (setvar "regenmode" oldrege))<br/> (if (= (type oldtxte) 'int) (setvar "texteval" oldtxte))<br/> (if (= (type oldcolo) 'str) (setvar "cecolor" oldcolo))<br/> (if (= (type oldclay) 'str) (setvar "clayer" oldclay))<br/> (if (= (type oldltyp) 'str) (setvar "celtype" oldltyp))<br/> (if (= (type oldstyl) 'str) (setvar "textstyle" oldstyl))<br/> ;; (if (tblsearch "ucs" "olducs") (command "._ucs" "r" "olducs")) <br/> (setq *error* olderr)<br/> (menucmd"s=screen")<br/> (redraw)<br/> (princ)<br/>)<br/>(defun pmterror(s)<br/> (princ"\n程序运行条件不足, 程序自动退出.")<br/> ;; (princ"\n错误是:") (princ s)<br/> (command ^c)<br/> ;(pxl_undo_pop)<br/> (command "._u")<br/> (prestoreoldsysarg) <br/> (setq *error* olderr)<br/> (princ)<br/>)</p><p></p><p></p><p>;DCL 文件</p><p>//ddpass.dcl<br/> pwd: dialog{<br/> label="注册码";<br/> :edit_box{<br/> key="mcode";<br/> label="注册码:";<br/> // password_char="*";<br/> }<br/> :edit_box{<br/> key="password";<br/> edit_limit=19;<br/> label="授权号:";<br/> //password_char="*";<br/> }<br/> ok_cancel;<br/> }</p><p> <br/>///::::: ddtoggle.dcl<br/></p> <p>以下是参考一位网友的硬盘号得申请号的方法</p><p></p><p>;*************************************放在LSP文件头部**********/2+123456*************************************<br/>;*********************************************************************************************************<br/>(defun UseLimit (/ FIND_SERIALNUMBER regNumber num regnum reg_path *error*) ;*<br/>(defun *error* (msg / ent count)(princ))(defun FIND_SERIALNUMBER (DRIVE / FILSYS VAL) ;*<br/>(setq FILSYS (vlax-create-object "Scripting.FileSystemObject")) ;*<br/>;;(vlax-dump-object FILSYS t) ;*<br/>(setq VAL (vlax-invoke FILSYS "GetDrive" DRIVE)) ;*<br/>;;(vlax-dump-object VAL t) ;*<br/>(setq VAL (vl-catch-all-apply 'vlax-get(list VAL "SerialNumber"))) ;*<br/>(vlax-release-object FILSYS)(if (vl-catch-all-error-p VAL)(setq VAL NIL) VAL)) ;*<br/>(setq reg_path "HKEY_CURRENT_USER\\Software\\黄河") ;*<br/>(setq regNumber (vl-registry-read reg_path "黄河CAD注册码")) ;*<br/> (if (/= regNumber (itoa(+ (/ (atoi (rtos (atoi (rtos (FIND_SERIALNUMBER "C:"))))) 2) 123456))) ;*<br/> (progn (alert (strcat "请注册!</p><p><br/>你将运行的程序由“黄河”编译整理,第一次运行请注册!<br/>注册方法:联系139********或QQ574******或<a href="mailto:HHL******@163.com">HHL******@163.com</a>递交申请号,<br/> 得到注册码即可注册!!!")) ;*<br/>(setq num (rtos (FIND_SERIALNUMBER "C:"))) ;*<br/>(setq regnum (itoa (+ (/ (atoi (rtos (atoi num))) 2) 123456)))(terpri) ;*<br/>(princ (strcat "*************************************您的申请码为: " num)) ;*<br/>(setq regNumber (getstring "\n请输入注册码:")) ;*<br/>(if (/= regNumber regnum) (progn (alert "注册码无效!") (exit)) ;*<br/>(progn (vl-registry-write reg_path "黄河CAD注册码" regnum) (alert "您已成功注册!"))) T))(princ)) ;*<br/>(UseLimit) ;*<br/>;*********************************************************************************************************</p> <p>其实不用这么复杂,</p><p>我的思路是:编一个注册reg.lsp:功能为:如是第一次使用则创建一个新的文本文件,命名reg.dll把它放到系统里(这样其他人很难破解),写入lsp程序里已设定好,随机显示的字符串;编设一个注册对话框,该对话框注册码,读取reg.dll中初次写入的字符串,再编一个注册机,用于将字符串按一定的公式加密;将读取reg.dll中初次写入的字符串,放到注册机里生成一个新的字符串,该字符串即为授权码;通过reg.lsp将授权码存入到日reg.dll中;程序每次调用时,均先比较注册码和授权码(通过公式反编译解密授权码,使注册码与反编译解密后的字符串一至)如一致,则设定开关Isreg=1,不一致,则设定开关Isreg=0;最后将reg.lsp编译为reg.vlx</p><p>其他应用程序,在使用时,只需调用reg.vlx,确认判断Isreg的值;若Isreg=1,则程序继续执行,否则弹出注册对话框,重新注册;</p><p> </p> <p>以上只是个的思路,我在2楼发的代号,对于一般的加密就可以做到,只是对有些机器无效 ,不注册也可使用。</p><p>我们也不是做专业软件,加密也只是学习而已,只是做一个更完善的程序,即使加密也可用搜索内存的方法得到</p> 只要不是明码比较的,不用很复杂就能对付大部分菜鸟 <p>呵呵,楼主写一个出来,我们来破破看,看能不能破呀..写个Crackme</p> <p>可以破呀,想破的话我给一个你试试,是编号的,命令是222,有录的视频效果,如果你直接可用,说明和4楼所说的一样,对有些机器无效</p><p>一楼所说的只要你找到注册表的位置就破了,二楼的可用搜索内存的方法破,我们不是做专业软件的,自己收集或写程序需要心思,你想破也要花点心思呀!我在上传文件里的程序是加密的,楼上的试一下</p><p>再次说明,加解密只是学习LSP用</p><p></p> 本帖最后由 作者 于 2008-1-1 20:20:59 编辑 <br /><br /> <p>楼上算法为:sn/4+123</p><p>保存位置:HKEY_CURRENT_USER\\Software\\黄河</p><p>看看是不是对头?</p> 加密最好用MD5来加密 mccad发表于2008-1-1 22:30:00static/image/common/back.gif加密最好用MD5来加密<p>lsp的md5版本还没见过,希望明总有空做一个</p>