加密与逆向的那些事
加密与逆向的那些事
起源
有几个程序员不是被游戏外挂和酷炫的黑客技术所吸引入行的呢?(你非要说高薪?那你还能来看这篇文章?)
修改器二三事
从初中我才有第一台电脑,那个时候还是windows95系统连互联网还没有普及,那个时候还只有一些单机小游戏,最火的也就是红色警戒。我的第一款大型单机游戏是西山居的《剑侠情缘外传月影传说》,当时使用4张cd光盘安装(我也不知道是不是正版)。游戏打通关之后就想着有没有别的玩法,在搜索的时候就发现了修改器这个东西,当时比较流行的说法叫金手指。一开始是用别人做好的修改器,到后来就自己用金山游戏自己制作修改器。从那时起就觉得做修改器远比游戏本身有意思。
修改器进阶
后来网游兴起,手里的金山游侠突然就不香了,虽然能改本地显示但是数据本身没有改变,于是新的技术出现了,CE修改器。接触到CE修改器后才知道原来还有基址和偏移量这种东西,有些游戏取得还是客户端的数据但是和显示的数据不是用的同一个内存地址,通过CE找到基址和偏移量就能改一些设计不严密的网游。但是毕竟网游的重要数据全在服务端,手中的CE还没发光发热然后又不香了。然后新的技术又出现了!修改游戏封包,通过伪造客户端数据来欺骗服务器。然而没有很多时间去学习这种技术了,因为上高中要努力学习(英雄联盟出现了!这游戏真香)。
逆向二三事
高中起知道一些研究破解的论坛(这里就不点名了),起初是为了一些"好用"的软件去逛这些地方,后来就翻了翻一些技术文章,全是看不懂的,类似:脱壳,断点,爆破,关键跳。。。这些汉字我都认识就是组到一起不知道什么东西。于是就泡在这些知识的海洋里潜水,毕竟要以学业为重(打英雄联盟)!直到大学才正式去研究这些东西,它叫逆向。
逆向干货
学习逆向一定要为了学习而不是要做违法的事!!!
所以这里只有思路没有具体操作
逆向目的有两个:
- 找到软件的授权点(关键跳)破解软件授权
- 分析算法
大部分情况下是找关键跳进行爆破(跳过授权判断)。分析算法一般是要做注册机或者有多个关键跳再就是暗桩太多,做安全方面的大手子是分析程序的行为从而找到应对办法。
逆向分为动态和静态,动态就是将程序启动起来进行逆向,静态是直接分析程序指令(汇编语言)分析算法。
动态分析逆向:
- 查壳
- 弱壳直接脱强壳带壳破:
- 现在软件一般都用vmp之类的强壳,这种壳脱完之后修复也极其困难,所以新手小白之类的强壳不要想着脱。
- 弱壳一般都有脱壳脚本,直接用就可以(我没研究过壳,所以我都是带壳破)
- 找关键跳
- 爆破或分析算法
- 有暗桩的要修复暗桩
静态分析逆向:
- 查壳
- 脱壳(说了我不熟悉这方面了)
- 静态分析器加载库或者执行程序解出汇编码
- 找到要分析的方法
- 根据汇编码分析逻辑
动态分析VS静态分析
动态分析有个先天的优势,可以在运行时自动脱壳,所以动态分析是首选。
静态分析一般是跨平台无法进行动态分析或者非常困难,比如Android和IOS的动态库。
动态分析普遍用于windows操作系统软件逆向(你非要跟我杠Kali?那你赢了)
静态分析我暂时只用在分析不同平台的动态库
研究加密的起源
大学毕业之后放弃本行工作(工地搬砖)转行加入程序员大军(网上搬砖),起先从事游戏行业,现在从事物联网行业。
在游戏行业通常要借鉴别人家的资源,而别人家的资源通常是加密过,比如cocos常用的xxtea加密。这种加密属于算法公开而隐藏秘钥的方式,只要获取到秘钥就可以解开资源,需要增加破解难度。
现在的工作是物联网平台开发,给客户的都是可执行程序,所以需要进行软件授权,就需要研究多种加密算法。
加密干货
接下来就软件授权和我的逆向经验来简单分析下各种加密方式。
无论是软件授权还是互联网传输,对于用户一方来说消息都是透明的。互联网传输本就是服务器与用户之间通信,无论发出消息还是接收消息用户都是可以监听到,即使采用非对称加密方式也只是防止第三方窃取。软件授权就比较难监听,但是毕竟是软件读取授权信息然后再解释称软件能用的配置,只要监视软件内部就可以获取到授权消息,只不过时间成本大小。所以无论哪种情况用户都可以获取到消息,那只能让获取的难度增大,时间成本增加。
加密方式:
-
对称加密(算法公开隐藏秘钥):
- xxtea:这个算法是我在cocos游戏引擎那里知道的加密方式,是基于全文内容的一种加密方式。(2019-11-27现在还是处于不知道秘钥无法解的状态)
- AES:最常用的对称加密算法,一套秘钥进行加密解密
- 异或运算:最简单的对称加密算法,但是可以很灵活的变种,比如对一组秘钥循环异或
- 自定义码表:凯撒码表,将原字符用其他字符替换
- 动态码表:密码随时间或条件动态改变
- base64:这没什么好说的吧
-
非对称加密:
非对称加密在互联网上可以防止第三方窃取,而在软件授权上只能用作验证,因为无论是公钥还是私钥都是可以在软件内部获取其中一个,而且最终信息都是要被解密,所以失去了非对称加密的特性。- RSA:引用百度百科的其中一句“只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。”可惜在软件授权里所有信息都是要被解密的。
- 椭圆曲线加密算法(ECC):引用网络一句“210位ECC加密安全性相当于2048位RSA加密。”
- 国密算法:SM1,SM2,SM3,SM4
-
自定义算法:
可以根据已有算法进行改动来创建自己的加密算法
授权方式:
- 授权文件:
程序直接读取授权文件进行配置解析 - 网络授权:
通过网络请求来下发授权信息,好处是可以动态更改授权,缺点是无网络环境下无法授权。下发授权信息后行为和授权文件方式相同
以上提到的加密算法和授权方式是我所遇到的和比较常见的,其他的一些算法不是已经失去加密性质再就是我还没遇到。(杠精退散)
重要性 不高 的软件授权加密建议:2种以上对称加密加一种非对称加密。非对称加密验签,对称加密解密,能加壳就加壳最好能加花指令和添加无用指令。(你说运行速度慢了?那一定是你选的加密方式有问题)
重要性 高 的软件授权加密建议:去买专业做安全的商业产品吧
结语
加密和逆向一直是矛与盾的关系,加密算法一直在改进,逆向的方法也在改进。安全这方面我也只是个小白,只是分享下工作总结和以往的心得。但无论是做什么都不要损害别人的利益,不要触犯国家的法律,想要提高逆向水平在各个论坛都有教程和一些专门用来练习破解的Creakeme。