文章目录- 常用的加密有哪些?
- 学习资源推荐
- 基础流程
- 加密方法
- RSA加密
- 微型加密算法(XXTEA)
- MD5加密
- JS加密常见混淆总结
- eval加密
- 变量名混淆
- 控制流平坦化
- 压缩代码
- Python实现加密方法合集
- RSA加密
- 微型加密算法(XXTEA)
- MD5加密
- eval加密
- 变量名混淆
- 控制流平坦化
- 压缩代码
常用的加密有哪些?
对称加密(加密解密密钥相同):DES、DES3、AES 非对称加密(分公钥私钥):RSA 信息摘要算法/签名算法:MD5、HMAC、SHA
学习资源推荐
冷月大佬的博客 : https://lengyue.me/ 突破前端反调试–阻止页面不断debugger :https://segmentfault.com/a/1190000012359015 岚光的JavaScript反调试和混淆 :https://0x0d.im/archives/javascript-anti-debug-and-obfuscator.html
基础流程
以下是可以参考的调试流程(面向新手):
- 如果网页有跳转,必须勾选 preservelog 防止丢包
- 看一下有没有框架 右键查看框架源代码
- 登陆的话尽量使用错误密码 防止跳转
- 查看关键登陆包 分析哪些参数是加密的
- 使用别的浏览器分析哪些参数是固定的值
- 初步猜测加密方法
- 搜索(md5,aes,des,tripedes,rsa,encrypt,setpubkey,setpublickey)
- 直接搜索参数
pwd=
pwd =
pwd:
pwd :
- 密码框地方右键 检查 查看 id name type
- 原生js方法获取
doucumnet.getElementById[“”].value
doucumnet.getElementByName[“”][0].value
- jQuery获取
alert($(“#id”).val());
alert($(“input[type=’password’]”).val());
- 找到加密的地方(重点)
- 调试
- 找出所有的加密代码
- 从最后一步开始写起,缺啥找啥
- 如果找的是函数的话 search 要带上 function xxx
- 如果看到加密的地方有个类,并且之后是用 prototype 把方法加在原生对象上的话,要把所有加在原生对象上的方法都找出来
- 函数找多了没关系,只要不报错不会影响结果,但是不能找少了
- 直接保存整页JS浏览器调试
加密方法
RSA加密
找了一些简单网站,查看了对应的RSA加密的方法,总结了以下套路:
- 一般的rsa加密通常会先声明一个rsa对象
- 本地使用公钥加密即public key,服务器上用私钥解密
- 通常有Encrypt关键字
- 加密后字符长度为128位或256位
结合以上套路可以帮助我们快速判断加密方式如何,便于我们理清解密思路。
微型加密算法(XXTEA)
“微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 XXTEA是其最新的变种,于1998年提出。目前还没有人找到对其进行攻击的方法,是对前面一些变种的改进。XXTEA 算法很安全,而且非常快速,非常适合应用于 Web 开发中。 以上引用自https://my.oschina.net/mickelfeng/blog/109388
MD5加密
- md5 hash的结果是固定不变的
- md5 hash 后的结果为16位或32位字母数字混合的结果
JS加密常见混淆总结
eval加密
- 把一段字符串当做js代码去执行
eval(function(){alert(100);return 200})()
例子: 漫画柜,空中网 之后会单独写一篇漫画柜的解密。
变量名混淆
- 把变量名、函数名、参数名等,替换成没有语义,看着又很像的名字。
_0x21dd83、_0x21dd84、_0x21dd85
- 用十六进制文本去表示一个字符串
x56x49x12x23
- 利用JS能识别的编码来做混淆
JS是Unicode编码,本身就能识别这种编码。类似的一些变量名,函数名都可以用这个表示,并且调用。
代码语言:javascript复制类似:
u6210u529f
表示中文字符(成功)。
类似:
u0053u0074u0072u0069u006eu0067.u0066u0072u006fu006du0043u0068u0061u0072u0043u006fu0064u0065
就代表String.fromCharCode
类似:
('')['x63x6fx6ex73x74x72x75x63x74x6fx72']['x66x72x6fx6dx43x68x61x72x43x6fx64x65'];
效果等同于String.fromCharCode
- 把一大堆方法名、字符串等存到数组中,这个数组可以是上千个成员。然后调用的时候,取数组成员去用
var arr = ["Date","getTime"];
var time = new window[arr[0]]()[arr[1]]();
console.log(time);
- 字符串加密后发送到前端,然后前端调用对应的函数去解密,得到明文
var arr = ['xxxx']
// 定义的解密函数
function dec(str){
return 'push'
}
test[dec(arr[0])](200);
控制流平坦化
将顺序执行的代码混淆成乱序执行,并加以混淆
以下两段代码的执行结果是相同的:
代码语言:javascript复制// 正常形态
function test(a){
var b = a;
b = 1;
b = 2;
b = 3;
b = 4;
return a b
}
// 乱序形态
//(这里比较简单,在很多加密网站上case 后面往往不是数字或字符串,而是类似 YFp[15][45][4]这样的对象,相当恶心)
function test1(a){
var arr = [1,2,3,4,5,6]
for(var i = 0, i < arr.lenght, i ){
switch (arr[i]) {
case 4:
b = 3;
break;
case 2:
b = 1;
break;
case 1:
var b = a;
break;
case 3:
b = 2;
break;
case 6:
return a b
case 5:
b = 4;
break;
}
}
}
// 结果都是30 但是test1看着费劲
console.log(test1(10));
console.log(test(10));
压缩代码
- 把多行代码压缩成一行
function test(a){
var b = a;
var c = b 1;
var d = b 2;
var e = b 3;
var f = b 4;
return e f
}
// 压缩一下
function test1(a){
var b,c,d,e,f
return f = (e = (d = ( c = (b = a,b 1),b 2),b 3),b 4),e f
}
Python实现加密方法合集
其实上面的步骤不一定都要去手动扣JS, 我们的大Python已经为我们造好了轮子,如果可以判断js的加密没有做其他的更改,我们就可以使用造好的轮子直接实现对应的加密。
所以这里给大家推荐一个大佬写的加密代码合集(我就不献丑了),记得给大佬来个star GitHub地址:
代码语言:javascript复制https://github.com/dhfjcuff/R-A-M-D-D3-S-M-H/blob/master/RSA-AES-MD5-DES-DES3-MD5-SHA-HMAC.py
内容如下:
代码语言:javascript复制# -*- coding:utf-8 -*-
import base64
import rsa
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from pyDes import des, CBC, PAD_PKCS5
from Crypto.Cipher import DES3
import hashlib
import hmac
class USE_AES:
"""
AES
除了MODE_SIV模式key长度为:32, 48, or 64,
其余key长度为16, 24 or 32
详细见AES内部文档
CBC模式传入iv参数
本例使用常用的ECB模式
"""
def __init__(self, key):
if len(key) > 32:
key = key[:32]
self.key = self.to_16(key)
def to_16(self, key):
"""
转为16倍数的bytes数据
:param key:
:return:
"""
key = bytes(key, encoding="utf8")
while len(key) % 16 != 0:
key = b'