0x00.基本概念:
1. 软件保护技术是向合法用户提供完整功能,所以软件保护必然要验证用户合法性,通常采用注册么验证的方式来实现。
2. 通常流程:
a) 用户向软件作者提交用户码name,申请注册。
b) 软件计算出合法的注册码serial=f(name)返回给用户
c) 用户在界面输入正确的name和serial
d) 软件通过验证函数来验证其合法性
0x01.堡垒战术:
1. MD5:
缺点就是MD5不可逆,所以相应的a一定是一个常数,当获得了一组合法的U,R的时候,就可以追踪到a,b。
2. RSA:
0x02.游击战术:
1. 将验证函数F分解成为多个不相同的Fi,然后将这些Fi尽量隐藏到程序中去。
2. 真正的注册码可以通过全部的Fi,而解密者只找到一个或几个Fi就不能对完整的算法求逆。
3. 对解密者来说,游击战术会非常被动,因为并不知道程序当中还隐藏着什么检测程序。
4. 游击战术的缺点在于,每一个验证函数都必须访问注册码,而注册码的源头只有一个,解密者通过跟踪程序并监控注册码所在的内存地址,那么一旦验证函数访问注册码,那么函数就会被泄露。不过也有应对方法,就是不停地转移注册码。
5. 转移注册码:
(1). 内存拷贝,属于最常规的方法,容易被追踪到。
(2). 写入注册表或者文件中,然后在另一处代码中再读入到另一个内存地址。会被注册表和文件监视工具识破。
(3). 一次将注册码拷贝到多个地址。
(4). 在反复使用同一个函数搬家后,突然使用另一个前半段代码相同后半段不同的函数进行搬家。
(5). 以上方法结合反复使用。
0x03.抵御静态分析:
1.花指令:目前主要的两种反汇编算法是线性扫描算法(Linear Sweep)和递归行进算法(Recursive Traversal)
(1). 线性扫描算法:依次将模块中的每一条指令都反汇编成汇编指令,不对内容进行判断,因此无法正确的将代码段和数据段区分,数据也被当成代码来解码,导致反汇编出现错误。
(2). 递归行进算法:按照代码可能执行的顺序来反汇编,对每条可能路径进行扫描。当解码出现分支指令后,反汇编器将地址记录,并分别反汇编分支中的各个指令。可以避免将代码中的数据当作指令来解码,比较灵活。
(3). 构造巧妙的代码和数据,在指令流中插入很多数据垃圾来干扰反汇编软件的解码,使它错误的判断指令的起始位置,这类代码称之为“花指令”。对于静态加密非常有效。
(4). 不同的机器指令包含的字节数并不相同,有的是单字节指令,有的是多字节指令。对于多字节指令来说,反汇编软件需要确定指令的第一个字节的起始位置,也就是操作码的位置,这样才能正确的反汇编,否则可能得出不同的反汇编指令。
线性扫描的情况:
0E8H这项垃圾数据就干扰了反汇编的解码工作。
而用OD打开就不会受影响,因为OD使用递归行进算法进行反汇编:
要迷惑这类递归行进算法的反汇编器,只要让其难以确定跳转的目的地址即可。
常见的解决办法就是讲花指令用nop代替,OD的花指令去除插件:听说叫DeJunk,等需要的时候再研究一下怎么安装把。
2. SMC技术实现(Self-modifying Code)
(1). 编写SMC代码不是汇编语言的专利,但是用汇编语言来写可以更加充分并方便控制每一个细节,看起来应该是很骚的东西。。。
实例:
其实这里面的DecryptFunc函数对EnData处的字节进行异或处理解密出来加密的代码,异或完成后,程序从DecryptFunc返回并执行解密后的EnData段的代码。
代码的真实面目:
(2). 多重的SMC实现:不好意思,不在我现阶段能力水平的承受范围。
3. 信息隐藏
(1). 在人与计算机的交互过程中,需要用户进行选择的地方,会提供相对应的提示信息,以及一些反映当前状态的信息,而解密者可以根据这些信息进行字符串搜索快速定位到核心代码的区域(也是我目前搞CM的主要套路...)
(2).摘录:
4. 简单的多态变形技术
主要用于病毒领域??现阶段暂时不深入了解。记录下一些恶意代码领域的网站(转载自https://www.52pojie.cn/thread-378845-1-1.html):
VirusTotal
网址:https://www.virustotal.com/
主要是静态分析,也有一定的动态分析。有专业的API接口提供自动化分析,或直接获取分析结果。我测试了100万个样本,其中85万个样本有直接的分析结果,仅有15万个没有。
vxheaven网址:http://vxheaven.org/
这个网站界面特丑,但是上面数据不少,最有用的是公开了27万个恶意代码样本,按卡巴斯基命名规则命名。
malwr网址:https://malwr.com
这个网站是最近才发现的,但是特别喜欢,既包括静态分析,也包括动态分析,分析速度比火眼快,而且结果详细,包括动静态。
火眼网址:https://fireeye.ijinshan.com/
国内的一家动态分析网站,比较喜欢,只是分析速度还有点慢,而且分析地状态不全,还有待改进。
恶意程式知识库网址:http://owl.nchc.org.tw/km/
从新闻上看到的,说是该网站是第一个公开的恶意代码数据库(database),来自台湾,看着玩吧,对我没太大用处。
virussign网址:http://www.virussign.com/
要想从这个网站获取恶意代码,比较贵,免费的又太少,比较郁闷。
当申请通过时,别想能Down下来自己需要的样本,基本上是逼着你交钱!
网址:http://malshare.com/
公开的网站,负责人非常nice,给他们发送申请后,直接将Key的权限从每天1000提升到了1000,000,这个网站是基本上是100多万个样本。
Malware Sample Sources for Researchers网址:https://zeltser.com/malware-sample-sources/
0x04. 文件完整性检验:
1. CRC-32:CRC算法可以对一段字符串进行CRC-32转化,最后可以得到一个4字节长的CRC-32值,然后在文件某个位置存储这个CRC-32,当文件运行的时候,对文件重新进行CRC-32计算,再与原来的CRC-32进行比较,如果文件有变动,CRC-32就会改变,这样就实现了文件完整性检查的目的。
2. 校验和(Checksum):PE的IMAGE_OPTIONAL_HEADER有一个Checksum字段,一般的EXE,其值为0,但是一些重要的
和系统DLL及驱动文件必须有一个Checksum的值。
3. 内存映像校验:对内存关键代码数据也进行校验:
(1). 对整个代码数据校验:每个程序都至少有代码段和数据段,且数据段的属性是可读可写,而代码段一般只可读,所以这里的数据一般不会发生改变,因此对这一段进行内存校验是可行的。
实现思路如下:
(2). 校验内存代码片段:对一段内存代码计算CRC-32,如果有人在其中跟踪调试设置断点INT3,则内存代码会发生更改,CRC-32校验也会发生变化,从而发现程序被跟踪。