baitang36
发表于 2018-9-8 14:47:35
yxp 发表于 2018-9-7 01:10
按 baitang36 的思路,我试了一下用 lisp 也可以解密 fas,不用汇编程序,降低研究门槛。有兴 ...
很好的试验,解码成功的标志应该是解码后的fas能够加载正常运行,结果正确。
yxp
发表于 2018-9-8 15:20:50
本帖最后由 yxp 于 2018-9-8 15:22 编辑
baitang36 发表于 2018-9-8 14:47
很好的试验,解码成功的标志应该是解码后的fas能够加载正常运行,结果正确。
你的fas解密后可以运行? 我试了一下我解出来的不能运行。
解密程序下载:
运行后解密出来的fas和你的一样,除了随机key不一样。如下
但是运行时出现错误: Xsubr(L) 指令 (偏移代码) 错误:0 193
我再看看.
baitang36
发表于 2018-9-8 15:40:13
本帖最后由 baitang36 于 2018-9-8 15:52 编辑
现在开始研究字符串在fas文件中的存放
先看小程序:
(princ "555555555555")
(princ "333333333333")
(princ "222222222222")
(princ "11111111111")
这小程序没有定义函数,只是显示几个字符串。
先用到的字符串放到后面,后用到的在前面。
可能大家会感到奇怪,为什么没有“44444444”?
是给princ留着,第四个字符串就是princ,命令也是字符串。
看看编译解码后的fas,是这样的:
Offset 0 1 2 3 4 5 6 7 8 9 AB C D E F
00000000 0D 0A 20 46 41 53 34 2D46 49 4C 45 20 3B 20 44 FAS4-FILE ; D
00000010 6F 20 6E 6F 74 20 63 6861 6E 67 65 20 69 74 21 o not change it!
00000020 0D 0A 31 0D 0A 31 20 2420 24 0D 0A 31 35 32 20 11 $ $152
00000030 37 20 24 14 01 01 01 0032 00 32 2D 2A 39 01 00 7 $ 2 2-*9
00000040 55 03 00 0B 00 31 31 3131 31 31 31 31 31 31 31 U 11111111111
00000050 0C 00 32 32 32 32 32 3232 32 32 32 32 32 0C 00 222222222222
00000060 33 33 33 33 33 33 33 3333 33 33 33 5B 50 52 49 333333333333[PRI
00000070 4E 43 00 00 55 01 00 0C00 35 35 35 35 35 35 35 NCU 5555555
00000080 35 35 35 35 35 01 01 4300 00 07 00 0A 01 5C 00 55555C \
00000090 00 43 00 00 01 00 0A 0143 07 00 00 00 1C 14 01 C C
000000A0 00 00 00 09 06 00 0A 0905 00 35 01 04 00 03 0A 5
000000B0 09 03 00 35 01 04 00 030A 09 02 00 35 01 04 00 5 5
000000C0 03 0A 09 01 00 35 01 0400 03 16 18 00 94 F7 8D 5 旝
000000D0 32 53 23 E3 E9 0A 3B 6661 73 34 20 63 72 75 6E 2S#汩 ;fas4 crun
000000E0 63 68 0A 3B 24 3B 41 392F 38 2F 31 38 ch ;$;A9/8/18
确实按我们设想的顺序排列了,这说明我们的猜想是正确的。
字符串的顺序就是先用到的字符串放到后面,后用到的排在前面。
根据上一次我们找到的规律,程序段是以14开头,以16结尾。从字符串后面开始找,程序段
开始的地址是9E,结束地址是CA。
程序内容是14 01 00 00 00
09 06 00 0A
09 05 00 35 01 04 00 03 0A
09 03 00 35 01 04 00 030A
09 02 00 35 01 04 00 03 0A
09 01 00 35 01 04 00 03 16
掐头去尾,找四个模样差不多的句子。我们大胆猜想一下:
0905 00 35 01 04 00 03是(princ "555555555555")
09 03 00 35 01 04 00 03 是(princ "333333333333")
09 02 00 35 01 04 00 03是(princ "222222222222")
09 01 00 35 01 04 00 03是(princ "11111111111")
经过修改内容,重新编译解码,证明这猜想是正确的。
这四个句子共同的特点就是:
09 xx 00 35 01 04 00 03
xx正好是我们的字符串顺序,当然,是倒序。01 00 表示0001,就是字符串"11111111111"
04 00表示0004,是princ,和我们预想的一样。
程序段的头是14 01 00 00 00,和以前defun里面的头不太一样,那个是14 00,这里是14 01
09 06 00 0A不知道是什么意思,09和0A应该是指令,06 00像是字符串编号0006,但我们只有5个字符串,怎么会出来第6号?
09 01 00 35 01 04 00 03是(princ "11111111111")从这一句可以看出09这个指令是根据编号01 00取得字符串"11111111111"
35 01这个是执行04 00号命令,也就是princ。
前边几句09 和0A是成对出现的,最后一句没有0A,因此0A可能是另起一行的意思吧?
那03是什么意思?暂且把它当成“)”,以后再研究。
baitang36
发表于 2018-9-8 15:48:05
yxp 发表于 2018-9-8 15:20
你的fas解密后可以运行? 我试了一下我解出来的不能运行。
解密程序下载:
key是循环使用的,用完一遍从头循环,这中间的接茬看看有没有处理好?
kozmosovia
发表于 2018-9-8 17:22:47
解密后应该是不能运行的,因为CAD加载时会再解密一次。
baitang36
发表于 2018-9-8 18:32:45
本帖最后由 baitang36 于 2018-9-12 18:37 编辑
kozmosovia 发表于 2018-9-8 17:22
解密后应该是不能运行的,因为CAD加载时会再解密一次。
应该是能运行的
你试试这个
我找到能运行的关键位置了,就是key的第一个字节是否为0。
解码完成后,把这个字节改成0,acad会直接加载运行它,不需要再解密一次。
如果这个字节不为零,acad.exe就需要先解密它,然后再运行。
yxp
发表于 2018-9-8 19:54:06
baitang36 发表于 2018-9-8 18:32
应该是能运行的
解密后的fas能不能运行不是重点,能反成lisp就可以。
baitang36
发表于 2018-9-8 19:57:42
本帖最后由 baitang36 于 2018-9-8 20:01 编辑
yxp 发表于 2018-9-8 19:54
解密后的fas能不能运行不是重点,能反成lisp就可以。
是的,能运行可以玩破解,修改几个字节就跳过注册。
key的最后一个字节要和第一个字节配合来用。我当初就没处理好,导致解码有错误。
yxp
发表于 2018-9-8 20:09:39
本帖最后由 yxp 于 2018-9-8 20:13 编辑
baitang36 发表于 2018-9-8 19:57
是的,能运行可以玩破解,修改几个字节就跳过注册。
严格的说,世界上没有绝对安全的代码,只要你决心闯入源码,因为 arx 都可以被破译。
世界上的软件大公司都放弃了软件的高强度加密,比如微软,桌子,甲骨文等。
他们选择用法律武器来捍卫自己的知识产权,在欧美打个官司花的钱,远远低于软件的开发投入。
所以这是一个成本问题,而不是技术问题。
但是在中国。。。。。有很多像苏州思杰马克丁这样不要脸的软件公司。
baitang36
发表于 2018-9-8 20:12:37
yxp 发表于 2018-9-8 20:09
严格的说,世界上没有绝对安全的代码,只要你决心闯入源码,因为 arx 都可以被破译。
世界上的软件大公 ...
目前流行的.net 安卓 ios都是可以反编译的,软件越来越大,可维护性更重要。加密势必要降低兼容性,越是大公司越不加密了。