终于解密了一份1993年左右的BASIC代码,这么多年一直想看这份代码的内容,现在终于看到了,颇有一些唏嘘之感。
目前网上似乎搜不到中文资料介绍如何解密加密过的BASIC代码,我总结一下放在这里。聪明人可以直接跳到“解密方法二”阅读。
背景:
DOS下的GW-BASIC在保存代码时,可以存成tokenized、纯文本和加密三种格式,分别对应SAVE命令的默认参数、“,a”和“,p”参数。
对于用了,p参数保存的源代码,以后就只能LOAD到内存中执行,而不允许再LIST查看源代码了。本文介绍的就是用于解密查看,p参数保存的源代码的方法。
解密方法一:
参考GW-BASIC tokenised program format。
原理是找到GW-BASIC中标记代码是否是加密的那个内存地址,然后用VAL命令的一个溢出Bug,修改这个内存地址的值。
第一步,运行一下如下的程序,找到加密标记的地址:
FOR I=1000 TO 16000:PRINT I: J=PEEK(I): POKE I,((J=0)AND 255) OR J: POKE I,J:NEXT I
这个程序会导致Illegal function call错误,记下出错前程序打印出来的数字。
第二步,正常用LOAD命令加载要加密的.BAS文件。
第三步,输入下面的程序,并把其中的a%[9]的值”1450″改为第一步中记录下来的数字。
dim a%[14]
a%[0]=0:a%[1]=h2020:a%[2]=h2020:a%[3]=h2097
a%[4]=h4553:a%[5]=h2047:a%[6]=H203A:a%[7]=H2098
a%[8]=H1C20:a%[9]=1450:a%[10]=h112C
a%[11]=h903A:a%[12]=0
b$=””
b$=”123″+chr$(28)+”:::”+chr$(137)+chr$(13)+mki$(varptr(a%[0]))+”:”
print val(b$) 456
完成,现在已经可以用LIST命令正常列出解密后的代码了。
解密方法二:
当我还沉浸在成功解密了BAS文件的喜悦中时,无心的一次搜索让我又找到了更简单的解密方法。
创建一个只有两个字节的UNPROT.BAS文件,这两个字节是0xFF 0x0A。
先LOAD要解密的.BAS,然后再LOAD一下这个UNPROT.BAS,然后就解密成功了。
如果是在DOS下要创建这么个文件还真有点麻烦,比较简单的做法是用DEBUG:
C:debug
-e 0100 ff 1a
-rcx
CX 0000
:0002
-n unprot.bas
-w
Writing 00002 bytes
-q