mohammadreza Posted May 2 Posted May 2 hi all is there a way that lisp can edit itself?!! maybe it's a strange question, bcz im a beginner Quote
fuccaro Posted May 2 Posted May 2 Yes, a Lisp program can edit its own source code. But here we are talking about AutoLisp and that is missing this feature . Quote
Steven P Posted May 3 Posted May 3 You could append a modified routine to the end of an existing file, the file will have multiple routines in it. Later routines will supersede the ones earlier in the file. Save this to a file as an example, (defun c:test ( / ) (princ "First test") ) (defun c:test ( / ) (princ "second test") ) Since the LISP file is just really a text file you can edit it as if it was. Quote
mohammadreza Posted May 4 Author Posted May 4 22 hours ago, Steven P said: You could append a modified routine to the end of an existing file, the file will have multiple routines in it. Later routines will supersede the ones earlier in the file. Save this to a file as an example, (defun c:test ( / ) (princ "First test") ) (defun c:test ( / ) (princ "second test") ) Since the LISP file is just really a text file you can edit it as if it was. ? i mean for example i have a code like below, i want this program ask user pass code until he enter correct number but after enter the true , dont ask again next times (for next run)! (defun c:gaz () (setq pass (getint "enter password")) (if (= pass 140) (princ "all ok") (progn (alert "Incorrect serial number please contact \" ****** \" for correct number" ) (EXIT) ) ) (princ) ) Quote
Steven P Posted May 4 Posted May 4 Yes, you could do that, append a small LISP to the end of the file to return "Pass OK" or something like that, however if the user then sends the LISP file to someone else then it has all ready got that "Pass OK" routine in it. A different method would be to write to the computers registry the password has been recorded in the registry and not the LISP file - which is a slightly better way to do things. You'll need to compile your code above, gaz, otherwise it is very simple to read the password or even modify the code to take out the password requirement all together. Not sure if that will work with Mac computers though. What are you trying to password protect and who are you protecting it from? that might define what method you use to protect the routine. There are a lot of posts about on the various merits of different protection methods. For my routines, it is another thing to consider and usually not worth it - the routines are for myself of within the company - developed on company time and so open to all other empoyees. Quote
mohammadreza Posted May 4 Author Posted May 4 (edited) actually my way is give some one a lisp code that can show HD Serial number and then he give me back that serial , so i change my code according to the his computer HD Serial and give him main lisp as (fas type). in this way i protect my lisp and its a unique. but i looking for a briefly way ! that customer be independent!. could i explain clearly??? Edited May 4 by mohammadreza Quote
mohammadreza Posted May 4 Author Posted May 4 3 hours ago, Steven P said: Yes, you could do that, append a small LISP to the end of the file to return "Pass OK" or something like that, however if the user then sends the LISP file to someone else then it has all ready got that "Pass OK" routine in it. A different method would be to write to the computers registry the password has been recorded in the registry and not the LISP file - which is a slightly better way to do things. You'll need to compile your code above, gaz, otherwise it is very simple to read the password or even modify the code to take out the password requirement all together. Not sure if that will work with Mac computers though. What are you trying to password protect and who are you protecting it from? that might define what method you use to protect the routine. There are a lot of posts about on the various merits of different protection methods. For my routines, it is another thing to consider and usually not worth it - the routines are for myself of within the company - developed on company time and so open to all other empoyees. actually my way is give some one a lisp code that can show HD Serial number and then he give me back that serial , so i change my code according to the his computer HD Serial and give him main lisp as (fas type). in this way i protect my lisp and its a unique. but i looking for a briefly way ! that customer be independent!. could i explain clearly??? Quote
Steven P Posted May 4 Posted May 4 I would struggle with de-compiling the code you send out, without sending out any password protection details, I might be wrong, there are others out there who are better at that than me. The way I'd see this having to work is: They receive the code and run it. The code checks if there is a LISP, lets call it check-pass, if there is no LISP called this then create at and ask for the serial numbers Decompile the compiled code Edit the LISP text file and append to the end of it a new function "check-pass" Compile the file again. Problems might be where the user saves the files, you have no control over that - for example, mine are in files on the one-drive, away from trusted locations (I can log onto any company computer and get my LISPs that way), and also decompile a compiled file without any password being available to view. Might be easier to generate a new text file after a successful check of serial numbers , saved in the AutoCAD directory, or trusted locations so that you know the file paths to save to and edit. You can then compile that a lot easier, and the source code for your main LISP is still protected. Tricky but I don't think LISP was designed with any password protection thoughts Quote
BIGAL Posted May 5 Posted May 5 (edited) Been adding a security check to code for years since "Protect" existed like 30 years ago, like others can use "_PKSER" returns Cad serial number, also yes I know it does work stopped an install by some one not wanting to pay. For us oldies using a DOS command ie CMD in windows you can copy a security lisp to every lisp program that you want then run another lisp that makes all of them into FAS, just done for like 30 lisps for a client. Protecting his investment not mine. The DOS command is as next you need a bat file to do it for all the files COPY D:\mylisps\securty.lsp+D:\mylisps\mylisp1.lsp D:\newfolder\mylisp1.lsp repeat for all lisps Compile 2 examples (defun comp ( ) (if (null vlisp-compile) (c:vlide T)) (setq fname (getfiled "Pick lisp to be compiled" "D:\\alan\\lisp" "lsp" 8)) (setq len (strlen fname)) (setq diff (- len (+ 15 3))) (setq fnameout (substr fname 15 diff)) (vlisp-compile 'st fname (strcat "d:\\alan\\compiled\\" fnameout ".fas")) ) (comp) ; part 2 ; must have vlide open to work (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "Vlide ") (setq loads (list ; make a list of all lsp files. "mylisp1" "mylisp2" )) (setq loc1 "C:\\CAD-TOOLS") ;;change dirs to where ever you want them found (setq loc2 "C:\\CAD-TOOLS\\") ;;change dirs to where ever you want them saved (foreach lisp loads (vlisp-compile 'st (strcat loc1 lisp ".lsp") (strcat loc2 lisp ".fas")) ) For BRICSCAD users just change to BLADE and DES. So as mentioned some security checks Hard disk id Cad serial number Set & Getenv registry check Network card IP address Ping remote server and check in a file User name Edited May 5 by BIGAL 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.