0x00.基本概念:
1. 软件保护技术是向合法用户提供完整功能,所以软件保护必然要验证用户合法性,通常采用注册么验证的方式来实现。
2. 通常流程:
b) 软件计算出合法的注册码serial=f(name)返回给用户
c) 用户在界面输入正确的name和serial
d) 软件通过验证函数来验证其合法性
0x01.堡垒战术:
1. MD5:
0x02.游击战术:
1. 将验证函数F分解成为多个不相同的Fi,然后将这些Fi尽量隐藏到程序中去。
2. 真正的注册码可以通过全部的Fi,而解密者只找到一个或几个Fi就不能对完整的算法求逆。
(1). 线性扫描算法:依次将模块中的每一条指令都反汇编成汇编指令,不对内容进行判断,因此无法正确的将代码段和数据段区分,数据也被当成代码来解码,导致反汇编出现错误。
(2). 递归行进算法:按照代码可能执行的顺序来反汇编,对每条可能路径进行扫描。当解码出现分支指令后,反汇编器将地址记录,并分别反汇编分支中的各个指令。可以避免将代码中的数据当作指令来解码,比较灵活。
(3). 构造巧妙的代码和数据,在指令流中插入很多数据垃圾来干扰反汇编软件的解码,使它错误的判断指令的起始位置,这类代码称之为“花指令”。对于静态加密非常有效。
(4). 不同的机器指令包含的字节数并不相同,有的是单字节指令,有的是多字节指令。对于多字节指令来说,反汇编软件需要确定指令的第一个字节的起始位置,也就是操作码的位置,这样才能正确的反汇编,否则可能得出不同的反汇编指令。
线性扫描的情况:
要迷惑这类递归行进算法的反汇编器,只要让其难以确定跳转的目的地址即可。
(2). 多重的SMC实现:不好意思,不在我现阶段能力水平的承受范围。
3. 信息隐藏
(1). 在人与计算机的交互过程中,需要用户进行选择的地方,会提供相对应的提示信息,以及一些反映当前状态的信息,而解密者可以根据这些信息进行字符串搜索快速定位到核心代码的区域(也是我目前搞CM的主要套路…)
(2).摘录:
(2). 校验内存代码片段:对一段内存代码计算CRC-32,如果有人在其中跟踪调试设置断点INT3,则内存代码会发生更改,CRC-32校验也会发生变化,从而发现程序被跟踪。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!