PC板微信图片解密-javascript

微信图片路径:

%Documents%WeChat Files\%微信ID%FileStorageImageyyyy-mm

解密方法原理网上很容易搜罗到, 就是没有javascript的代码(解密后方便直接在网页显示),于是找来魔改

关键代码如下:

  1 function getRealMimeType(data){
  2     var arr = data.subarray(0,4);
  3     var header = '';
  4     var realMimeType;
  5     for (var i = 0; i < arr.length; i++) {
  6         header += arr[i].toString(16);
  7     }
  8     // magic numbers: http://www.garykessler.net/library/file_sigs.html
  9     switch (header) {
 10         case "89504e47":
 11             realMimeType = "image/png";
 12             break;
 13         case "47494638":
 14             realMimeType = "image/gif";
 15             break;
 16         case "ffd8ffDB":
 17         case "ffd8ffe0":
 18         case "ffd8ffe1":
 19         case "ffd8ffe2":
 20         case "ffd8ffe3":
 21         case "ffd8ffe8":
 22             realMimeType = "image/jpeg";
 23             break;
 24         default:
 25             realMimeType = "unknown"; // Or you can use the blob.type as fallback
 26             break;
 27     }
 28     return realMimeType;
 29 }
 30 
 31 function getCode(data){
 32 // 图片字节头信息,
 33 // [0][1]为jpg头信息,
 34 // [2][3]为png头信息,
 35 // [4][5]为gif头信息
 36     var pic_head = [0xff, 0xd8, 0x89, 0x50, 0x47, 0x49]
 37     var code=0;
 38     var head_index = 0
 39     while(head_index < pic_head.length){
 40     // 使用第一个头信息字节来计算加密码
 41     // 第二个字节来验证解密码是否正确
 42         code = data[0] ^ pic_head[head_index]
 43         var idf_code = data[1] ^ code
 44         head_index = head_index + 1
 45         if (idf_code == pic_head[head_index])
 46             return code
 47         head_index = head_index + 1
 48     }
 49     //print("not jpg, png, gif")
 50     return 0
 51 }
 52 
 53 //监听change事件
 54 fileInput.addEventListener('change',function(){
 55     //检查文件是否选择
 56     if(!this.value){
 57         fileInfo.innerHTML = "没有选择任何文件";
 58         return;
 59     }
 60 
 61     var files=this.files;
 62     for(var i=0;i<files.length;i++){
 63         //获取file的引用
 64         var file = files[i];
 65 
 66         //获取file信息
 67         fileInfo.innerHTML = '文件: '+files.length;
 68 
 69         var reader=new FileReader();
 70         reader.onload = (e)=>{
 71             DecodeXor(e.target.result, file.name+' '+ '大小: '+file.size+' '+ '修改: '+file.lastModifiedDate)
 72         }
 73         reader.readAsArrayBuffer(file);
 74     }
 75 });
 76 
 77 function DecodeXor(buff,s){
 78     var data=new Uint8Array(buff);
 79     var code=getCode(data);
 80     if(code<1)return fileInfo.innerHTML+=s+"--------解密失败<br/>";
 81     for(var i=0;i<data.length;i++){
 82         data[i]=data[i]^code;
 83     }
 84     //let blob = new Blob(data,{type:getRealMimeType(data)});// 不能加`MIME`,数据 本身带有`MIME`信息,加了反而破坏数据了,搞死了 o(╥﹏╥)o
 85     //show(blob);
 86     show(new Blob([data]),s);
 87     //downloadFile("aaa.jpg",data);
 88 }
 89 
 90 function show(blob,s){
 91     var img = document.createElement("img");
 92     img.onload = function (e) {
 93       window.URL.revokeObjectURL(this.src); // 清除释放
 94     };
 95     //img.src为Blob格式的img资源
 96     img.title=s;
 97     img.src = window.URL.createObjectURL(blob);
 98     console.log(img.src)
 99     imgs.append(img);
100 }
原文地址:https://www.cnblogs.com/lzpong/p/15123242.html