微信图片路径:
%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 }