《lisp程序反编译的原理.pdf》由会员分享,可在线阅读,更多相关《lisp程序反编译的原理.pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 抗反编译程序镇楼:反编译失效 反编译代码不可用 2.fas(171.07 KB,下载次数:5)反编译人员可以先测试这个附件,需要加密的朋友可以看下面:=提供一些简单容易操作的 Fas 修改方法给需要抗反编译的朋友。不定期更新。首先我们学习多 Fas 合并为一个 Fas。因为目前反编译工具都是针对单一 Fas 文件的,因此可以通过合并 Fas 方式稍微对抗一下。我们写两个小文件:d:1.lsp 内容:(defun c:qq()(print q)编译为 1.fas d:2.lsp 内容:(defun c:bb()(print b)编译为 2.fas 不用任何工具的方法:1.(vl-file-co
2、py d:1.fas d:2.fas T)复制代码 加载 2.fas,是不是两个命令都有了:)【如果你有兴趣,也可以用这个函数自己合成 VLX】然后我们开始学习二进制工具的使用:准备工具:EverEdit 编辑器,这个网上有很多下载,论坛也有低版本可以搜索到。用 2.lsp 重新生成 2.fas 用 EverEdit 编辑器打开 1.fas 是一堆 16 进制编码,不用管,全选复制。everedit 打开 2.fas。粘贴到后面(红色表示修改),直接另存为 3.fas 为了防止看的晕,图放后面 然后我们开张新图纸,加载 3.fas,测试两个命令都存在。这个类似于 VLX,但是不能打包 txt
3、和dcl。恭喜你完成了 Fas 的二进制修改!如果你把一个真 Fas 藏在几十几百个假的 Fas 中间(记得假代码和真代码要差不多一样,函数名类似),那么想找出来真 Fas 也不容易。=下面这步可以让所有的反编译工具反编译后的代码都不能使用,原理可以看下大海的帖子(看不懂可以忽略看后面)【首发】定义真正意义的可选参数(附带防反编译技术)通过修改 Fas 实现函数真正的多参数,首先我们写个简单的程序:d:4.lsp 内容:(defun tt1(a);注意函数不能是 c:开头,参数 1 个以上 (print a)编译为 4.fas EverEdit 打开 4.fas 看到一堆二进制的内容,我们用
4、Ctrl+F 搜索 14,找到第一个 14,后面跟了几个 01,如下:14 01 01 01 00 (14 表示函数开始,后面第一个 01 总是大于等于你参数个数,第二个 01 和第三个 01 总是等于你参数的个数,最后总是 00)修改方法:鼠标点在最后的 00 上,输入 01,保存。为了防止看的晕,图放后面 加载 4.fas,命令行测试结果:命令:(tt1 1)1 1 命令:(tt1 1 2)1 1 命令:(tt1 1 2 3)1 1 命令:(tt1 1 2 3 4)1 1 根据你函数参数的个数,后面的 01 数量会变化。为什么反编译后不能用?因为源码不支持这种多参数调用,只要你改的函数够多
5、,反编译后就需要修改你的代码否则不能用。如果需要更多变化,可以回头看大海的帖子了。合并 Fas 图:改多参图 =接下来我们用垃圾代码干扰反编译工具,让反编译工具失败,这次要改 2 个编码+5 个垃圾编码 原理贴:原创给 AutoLisp 语言增加 goto 指令 看不懂没关系,直接看下面:首先写一个正常代码 5.lsp 内容:(defun c:tt()(print ok)加一句关键的:(defun c:tt()(print 188);这句代码要修改成跳过执行,留下垃圾给反编译 (print ok)生成 5.fas 用 everedit 打开 5.fas 首先你能找到刚才的函数开头,也就是 14
6、 00 00 00 00,下面我们为了方便查看在编码区【鼠标右键】【显示】【10 进制】14 变成了 020,后面跟着还是 000 000 000 000.这时候我们向后找 051 和 188 这个数字(以后为了找数字方便,我将用 10 进制进行讲解)发现 188?没错,这个 188 就是你刚才写的 188.如果你现在改了 188 保存 Fas,输出的数字将发生变化。然后我们开始修改,记得这次要输入 3 个数改一个编码:051 改成 087(固定修改,表示要跳过)188 改成 005(固定修改,跳过 5 个)跟着的三个编码都是 00 00 00(不用修改,这三个属于 087)再来 5 个编码
7、xxx xxx xxx xxx 改成任意 0-128 之间的 5 组数字即可(也就是让反编译失效的垃圾,红色部分推荐值:003 006 009 020 042 053 057 087 103 104 106 和其他数字混搭)原:020 000 000 000 000.051 188 000 000 000 xxx xxx xxx xxx xxx 改:020 000 000 000 000.087 005 000 000 000 003 111 100 009 122 保存 5.fas,加载后只输出 ok。说明我们修改成功了。注意:不管 020 和 188 中间有多少其他内容,我们总是从 051
8、 188 开始修改的。=这里我们就需要了解一下为什么这样修改可以抗反编译 首先我们需要了解 vlx 和 Fas 格式。vlx=fas+txt+dcl vlx 包括头部、fas、文本、dcl、尾部等,头部说明了包含的文件和独立命名空间等相关说明,我们用普通文本工具打开就能看到。因 vlx 拆分工具和代码也是公开了很多,这里就不再详述。简单讲一下 Fas 的文件格式和编码原理。Fas 在解码前包括头部、函数代码区、加密区、尾部。目前有一些公开的解码工具(就是把加密区转换后能够看见数据区的字符串)比如:通过二进制读写彻底修改 VLX 或者 FAS 原有命令还有:fas 解码程序 6.1 版,发布 v
9、c 版,防止误报病毒。头部总是固定的,包含了这个字符串:FAS4-FILE;Do not change it 尾部也总是固定的,一般是倒数 10 个字节。加密区每次 Fas 生成都会变,所以你可以用同一个代码生成两次来对比。然后函数代码区同一套代码每次生成都是固定的。只要你的代码有 defun 自定义函数,那么都是从 20 x x x 0 这样的编码指令开始的。(10 进制编码)Fas 会把变量、字符串、单引号表、参数、系统函数等放到数据区,然后在代码区用指令去调用。普通的数字和一些特殊函数会在代码区直接列出来。(也就是为什么能看见 188 这个数字)正常 CAD 生成的 Fas,编码规则都是
10、固定的,比如 20 x x x 0 总是固定的格式,而 87 x x x x 跳转指令一般出现在嵌套函数、条件语句、循环语句中。(后面的 x 表示跳的位置)正常的 Fas 没有垃圾指令的产生,只是在执行时根据条件跳过某些代码不执行。因此反编译需要把所有的指令都翻译为正常代码。通过垃圾指令的填充,翻译后的代码中就包含了垃圾代码(有些乱码会让反编译出错,因为编码非正常不能翻译出来)这种垃圾代码会使得 Lsp 文件无法运行,甚至无法加载。=接下来对头文件的修改让解码失败 刚才看了抗反编译的简单原理,我们看下头文件的编码 013 010 032 070 065 083 052 045 070 073
11、076 069 032 059 032 068 111 032 110 111 116 032 099 104 097 110 103 101 032 105 116 033 013 010 049 054 053 057 013 010 049 050 048 032 036 用(vl-list-string)转义这段编码,可以得到这样的字符串:1.rn FAS4-FILE;Do not change it!rn1659rn120$复制代码 我们看这个$符号是 036,一般对 Fas 解码时查找的关键字也是这个符号。我们可以把 033 013 这里的 013 替换成 036 变成:013 010 032 070 065 083 052 045 070 073 076 069 032 059 032 068 111 032 110 111 116 032 099 104 097 110 103 101 032 105 116 033 036 010 049 054 053 057 013 010 049 050 048 032 036 这样一些反编译工具找$符号就会失败。=
限制150内