BBS: Inland Empire Archive Date: 06-28-92 (14:34) Number: 1656 From: RICK PEDLEY Refer#: NONE To: AL LAWRENCE Recvd: NO Subj: Self modifying code Conf: (2) Quik_Bas
On 06-26-92 Al Lawrence wrote to All...
AL> Does anyone have any code that would allow a program to
AL> modify a numeric or string variable each time the program
AL> is run, and maintain the modified variable from run to
AL> run.
AL>
AL> Thanks in advance...
In your program, define a string something like this:
Count$ = ">>>#$#$#$"
The alternating #$ characters ensure that when you compile, the compiler
won't pack the string -- you want it to remain exactly as it is in the
source. Also the >>> is easy to spot/find with a hex editor.
DEFINT A-Z
Marker$ = ">>>"
Num& = -1 ' in this case means 'outta luck'.
B$ = SPACE$(3) ' 3 chars, we're looking for Marker$.
OPEN PROG.EXE FOR BINARY AS #1 ' open file in binary mode.
FileLen& = LOF(1) ' get file length.
FOR x& = 1 TO FileLen& - 9 ' file length minus (LEN(Marker$) + 6).
SEEK #1, x& ' move file pointer to position x&.
GET #1,,B$ ' get 3 bytes (binary mode, so no
IF B$ = Marker$ THEN ' record number).
Num$ = SPACE$(6) ' 6 spaces to hold the number string.
NumStart& = x& + 3 ' move file pointer to start of Num$
SEEK #1, NumStart& ' and keep this value for later.
GET #1,,Num$ ' get 6 bytes.
Num& = VAL(Num$) ' convert to a long integer.
EXIT FOR
END IF
NEXT x&
IF Num& = -1 THEN
CLOSE
PRINT "Couldn't find ";Marker$
END
ELSE
Num& = Num& + 1 ' increment usage counter.
IF Num& > 25 THEN
PRINT "NEENER NEENER DEADBEAT, TRIAL PERIOD HAS EXPIRED!"
END ' or SHELL "ECHO y | DEL
*.*" if you prefer.
ELSE
Num$ = LEFT$("000000", 6 - LEN(STR$(Num&))) + STR$(Num&)
SEEK #1, NumStart& ' write incremented counter to file.
PUT #1,,Num$
CLOSE
END IF
END IF
There are faster ways to find Marker$, like GET a 32K string and use
INSTR to find the ">>>", but the fastest way is once you have the
program finished, hardcode NumStart& as NumStart$ in your program
(i.e. use a hex editor to find exactly where Num$ begins and add 1
to it, as all hex editors count from zero), then SEEK that position
directly; SEEKing through the file byte by byte is slow. Also, the
user could easily install a fresh copy of the program or set the
read only attribute to defeat this method.
Caveat: I typed this in an editor without testing so be careful and
please excuse minor errors.
... OFFLINE 1.37
--- Maximus 2.01wb
* Origin: The BULLpen BBS * Intel 14.4EX (613)549-5168 (1:249/140)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET