zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    git切换仓库 小记
    修改prometheus默认端口,修改grafana默认端口
    Redisson报错
    Windows IDEA Community 报错
    Debouncer防抖代码
    IDEA通用配置
    Jackson通用工具类
    SpringBoot接入两套kafka集群
    博客园什么时候有的高低贵贱制度???
    致已经逝去的2020和已经到来的2021
  • 原文地址:https://www.cnblogs.com/lzpong/p/15123242.html
Copyright © 2011-2022 走看看