base64随机字符混淆加密、解密-美拍视频地址解密,反推加密算法

用火车头测试采集美拍的数据时无意中发现美拍的视频地址是一段加了混淆字符串的base64代码。如下图

于是好奇之下研究了下解密算法。具体过程省略800字。发现美拍的视频解密是通过js完成,于是找到了具体的解密代码,如下:

 1 ;(function(a) {
 2     var b = "substring",
 3     c = "split",
 4     d = "replace",
 5     e = "substr",
 6     f = {
 7         getHex: function(a) {
 8             return {
 9                 str: a[b](4),
10                 hex: a[b](0, 4)[c]("").reverse().join("")
11             }
12         },
13         getDec: function(a) {
14             var d = parseInt(a, 16).toString();
15             return {
16                 pre: d[b](0, 2)[c](""),
17                 tail: d[b](2)[c]("")
18             }
19         },
20         substr: function(a, c) {
21             var f = a[b](0, c[0]),
22             g = a[e](c[0], c[1]);
23             return f + a[b](c[0])[d](g, "")
24         },
25         getPos: function(a, b) {
26             return b[0] = a.length - b[0] - b[1],
27             b
28         },
29         decode: function(a) {
30             var b = this.getHex(a),
31             c = this.getDec(b.hex),
32             d = this[e](b.str, c.pre);
33             return window.atob(this[e](d, this.getPos(d, c.tail)))
34         }
35     };
36     a.decodeMp4 = f,
37     window.MP = a
38 } (window.MP || {}))

通过解密代码可以发现视频地址字符串是base64加密的,只不过在其中插入了一些混淆字符。只要清除混淆字符即可通过base64解密得到视频地址。

js怎样对字符进行base64加密、解密?如下:

1 window.atob(str);//解密
2 window.btoa(str);//加密
3 //但后来发现这样是不兼容中文的,于是有了下面的兼容中文的方法
4 decodeURIComponent(escape(window.atob(d)));//解密
5 window.btoa(unescape(encodeURIComponent(str)));//加密

解密算法已经找到,但我想要的是加密算法,所以只能通过解密算法反推加密算法,于是展开了一系列烧脑操作。终于发现了加密的原理(大概可能是)。

首先说说加密的原理:

1、先用base64对视频地址进行加密。

2、在视频地址前面加上一个4位字符串,字符串要满足以下条件:

①必须是四位16进制的字符串。

②字符串的10进制必须也是一个四位整数。(这个四位整数很重要,用来确定随机字符串的插入位置和个数的)

③插入加密地址前的是四位16进制的字符串的倒序。

3、通过开头加上的4位字符串确定随机字符串以及插入的位置。(前后相应位置都加上一段随机字符串)

看着原理是不是一头大?不用急,现在慢慢来解析一下:

现在用第一张图上的字符串来说明一下解密的过程,然后就能反推加密原理:

base64混淆加密后的地址:b901aHR0TDcDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdejNA==

①首先前面4位16进制的字符串为b901,因为是倒序添加的,所以实际上为109b。

②109b对应的10进制为4251。

③通过4251推算,前面添加的随机字符串位置为第4个字符开始,添加2个随机字符串;后台添加的随机字符串位置为倒数第5个添加1个随机字符串。

得出上面的混淆加密的随机字符为(用*号替代):

aHR0**cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjd*jNA==

去掉*号的内容即为真实的base64加密地址:aHR0cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdjNA==

然后就可以通过普通的base64解密方法来解密视频地址了。

1 decodeURIComponent(escape(window.atob(‘aHR0cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdjNA==‘)));
2 //得出内容为:http://mvvideo1.meitudata.com/59afe704f10b94782.mp4?k=43b78db6fba5f3eec8667536191627de&t=59b367c4

知道了加密原理,那么推算出加密算法就只是时间问题了。

。。。又经过一系列的测试整理,终于出版了js版的base64随机字符混淆加密、解密方法,如下:

 1 ;(function(base64){
 2     var substring=‘substring‘,
 3         split=‘split‘,
 4         reverse=‘reverse‘,
 5         join=‘join‘,
 6         toString=‘toString‘,
 7         substr=‘substr‘,
 8         replace=‘replace‘,
 9         fn={
10         getHex: function(str) {//获取前4位标记数字
11             return {
12                 str: str[substring](4),//排除前4位字符串
13                 hex: str[substring](0, 4)[split]("")[reverse]()[join]("")//前4位倒序
14             }
15         },
16         getDec: function(str) {//获取混淆字符位置坐标
17             str = parseInt(str, 16)[toString]();//前4位倒序的16进制
18             str[substring](0, 2)[split]("");
19             return {
20                 pre: str[substring](0, 2)[split](""),//前面坐标
21                 tail: str[substring](2)[split]("")//后面坐标
22             }
23         },
24         delStr: function(str, pos) {//混淆的字符抽取
25             var s = str[substring](0, pos[0]),
26                 del = str[substr](pos[0], pos[1]);//需替换的字符
27             return s + str[substring](pos[0])[replace](del, "");//返回替换完成后的base64字符串
28         },
29         getPos: function(str, pos) {
30             return [str.length - pos[0] - pos[1],pos[1]];
31         },
32         decode: function(str) {//解密
33             var sh = this.getHex(str),//获取前4位标记数字
34                 pos = this.getDec(sh.hex),//获取混淆位置坐标
35                 d = this.delStr(sh.str, pos.pre);//前面混淆的字符抽取
36                 d=this.delStr(d, this.getPos(d, pos.tail));
37             return decodeURIComponent(escape(window.atob(d)));//base64转成utf-8(兼容中文)
38         },
39         encode:function(str){//加密
40             var base64=window.btoa(unescape(encodeURIComponent(str))),//转换成base64格式
41                 random=this.getRanNum(base64),//获取16进制是4位数的随机字符
42                 pos = this.getDec(random);//获取混淆位置坐标
43             base64 = this.addStr(base64, pos);//插入混淆字符
44             //console.log(random,pos)
45             return random[toString]()[split]("")[reverse]()[join]("")+base64;
46         },
47         addStr: function(str, pos) {//混淆的字符插入
48             var r1=this.getRanStr(pos.pre[1]),//获取随机字符串(前)
49                 r2=this.getRanStr(pos.tail[1]),//获取随机字符串(后)
50                 pre=this.insertStr(str,r1,pos.pre[0]),//插入随机字符串(前)
51                 tail=pre.length - pos.tail[0];
52             str=this.insertStr(pre,r2,tail);//插入随机字符串(后)
53             return str;
54         },
55         insertStr:function(str,addstr,pos){//往指定位置插入字符串
56             return str[substring](0,pos)+addstr+str[substring](pos);
57         },
58         getRanNum:function(str){//获取16进制是4位数的4位随机字符
59             var ranArr=[];
60             ;(function(){
61                 var n=‘‘,
62                     length=str.length;
63                 /** 4101开始16进制是4位数 **/
64                 for(var i=4101;i<=9999;i++){//找出所有符合要求的16进制4位数
65                     n=i[toString](16);//16转成10
66                     if(length>=8&&!(Math.floor(i/100)%10===0||i%10===0)&&n.length===4){
67                     //正常的base64编码长度大于8才前后加混淆字符
68                         //console.log(i,n);
69                         if(Math.floor(i/1000)<=length/2&&Math.floor(i%100/10)<=length/2){//混淆位置不能大于长度一半
70                             ranArr.push(n);
71                         }
72                     }else if(i%100===0&&n.length===4){//只在前面插入混淆字符
73                         if(Math.floor(i/1000)<=length){//混淆位置不能大于长度
74                             ranArr.push(n);
75                         }
76                     }
77                 }
78             }());
79             var length=ranArr.length,
80                 ran = Math.round(Math.random()*(length-1));
81             return ranArr[ran];
82         },
83         getRanStr:function(num){//获取指定个数随机字符串
84             var str=[0,1,2,3,4,5,6,7,8,9,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘,‘+‘],
85                 length=str.length,
86                 res = "";
87              for(; num-- ;) {
88                  var id = Math.round(Math.random()*(length-1));
89                  res += str[id];
90              }
91              return res;
92         }
93     }
94     base64.tranCode=fn;
95     window.base64=base64;
96 }(window.base64||{}));

以上代码已经带有一些注释,就不详细说明了。不明白或有指教的请留言吧!

算法兼容对美拍视频地址的解密!同时兼容其他内容的加密,同时兼容中文的加密、解密。

反推加密算法的过程是烧脑的,但也是有意思的,在成功的那一瞬间还是有点小兴奋的。

写了一个demo,有兴趣的可以下载看看,如图。下载地址为:https://github.com/zhouxitian/base64

欢迎指教!!!

以上代码只为研究学习使用。

时间: 2024-08-07 12:33:08

base64随机字符混淆加密、解密-美拍视频地址解密,反推加密算法的相关文章

解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

原文 解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾 php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样.一些人不理解为什么要混淆(加密),甚至鄙视混淆(加密),在我看来混淆加密代码可以用来防一般的小人,会起到一定的保护作用. 加密的原因: 1. 保护代码,防止别人剽窃 2. 保护文件,防止别人发现/查杀(php木马 or 后门) 3. 剽窃了他人代码防止被发现 4. 其他商业或非商业目的 我一直都比较关注代码的加解密,从简单e

010 实现输入字符的加密解密

本实例实现对字符的加密和解密 源代码如下: import java.util.Scanner; public class Encryption { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); System.out.println("请输入一个英文字符或解密字符串");

爬虫之Js混淆&amp;加密案例

需求: 中国空气质量在线监测分析平台是一个收录全国各大城市天气数据的网站,包括温度.湿度.PM 2.5.AQI 等数据,链接为:https://www.aqistudy.cn/html/city_detail.html,网站显示为: 一连串的分析 该网站所有的空气质量数据都是基于图表进行显示的,并且都是触发鼠标滑动或者点动后才会显示某点的数据,所以如果基于selenium进行数据爬取很吃力,因此考虑采用requests模块进行数据爬取. 首先要找到空气质量数据所在的数据包: 使用抓包工具抓取,经

手工脱壳之 PESpin加密壳【SHE链硬件反调试】【IAT重定向】【混淆+花指令】

一.工具及壳介绍 使用工具:Ollydbg,PEID,ImportREC,LoadPE,IDA,Universal Import Fixer,OllySubScript 此篇是加密壳的第二篇,更详细的步骤和思考,请查看第一篇:手工脱壳之 未知加密壳 [IAT加密+混淆+花指令] PESpin壳: 二.脱壳之寻找OEP 1.硬件断点失效 尝试ESP定律,但硬件断点未断下. (原因其实是壳做了反调试,后面部分介绍) 2.采用API断点+单步跟踪 API下断: 壳导入了LoadLibrary 和 Ge

网络视频m3u8解密及ts文件合并

网络视频m3u8解密及ts文件合并 参考了两篇博客: https://blog.csdn.net/weixin_41624645/article/details/95939510 https://blog.csdn.net/u014484783/article/details/79350392 再加上了自己的办法写的更详细了一点: 直接用ffmpeg下载是排队逐个下载,嫌慢就写了个脚本多线程下载能快一些,,然后用ffmpeg合并ts文件. 进入chrome开发者模式,然后Network选项卡,如

企业Shell面试题1:批量生成随机字符文件名案例

使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下: [[email protected]]# ls /oldboy apquvdpqbk_oldboy.html mpyogpsmwj_oldboy.html  txynzwofgg_oldboy.html bmqiwhfpgv_oldboy.html mtrzobsprf_oldboy.html  vjxmlflawa_oldboy.html jhjdcj

Java中生成随机字符的方法总结

package learnExercise; public class RandomCharacter { public static char getRandomCharacter(char ch1,char ch2){ return (char)(ch1+Math.random()*(ch2-ch1+1));//因为random<1.0,所以需要+1,才能取到ch2 } public static char getRandomLowerCaseLetter(){ return getRand

软件USB加密狗(锁)复制克隆解密破解多少钱?

加密狗(dongle),经常被认为是软件保护,它是一个可被附加在计算机并口.串口或USB上的小插件,它包含厂家烧制的EPROM和定制的专用集成电路.dongle保护的的原理就是软件开发者在程序里经常检查dongle中的单元(Cell)的并对比返回值,这种检查可以是直接读单元或者是使用某种内部算法(此时单元受到保护无法直接读). 深圳凯基迪科技,在软件开发和加密狗复制方面拥有丰富的实践经验,现可解密复制各种软件狗USB加密锁,并承诺100%包成功!如有需要欢迎来电咨询! [132-6677-824

详细讲解Android对自己的应用代码进行混淆加密防止反编译

1.查看项目中有没有proguard.cfg. 2.如果没有那就看看这个文件中写的什么吧,看完后将他复制到你的项目中. -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep publ