電腦端微信收到圖片后是存在了“C:\Users\系統用戶名\Documents\WeChat Files\微信帳號\Data”目錄下的,但文件不能直接使用圖片瀏覽器打開的,因為做了一些加密,之前有個朋友問我這些文件怎么解密,就抽空研究了下。參考了一篇文章:http://share.iclient.ifeng.com/news/shareNews?forward=1&aid=117431304&from=timeline&isappinstalled=1&forward=1#backhead,文章里提到的是加密值:ox5,其實現在改了,是根據不同的圖片格式采用不同的加密值了,今天這里使用Delphi來實現這個圖片文件的解密,教你找到被撤回的微信圖片或者存儲被撤回的圖片,哈哈。直接上代碼吧!
uses System.SysUtils, System.Classes, Winapi.Windows, System.Math, System.StrUtils; // 計算MagicCode以及圖片類型 function CalcMagicCode(const AHeadCode: Word; var AMagicCode: Word; var AFileExt: string): Boolean; const C_TypeCodeArr: array of Word = [$4D42, $D8FF, $4947, $5089]; C_TypeExtArr: array of string = ['.bmp', '.jpeg', '.gif', '.png']; var I: Integer; LByte1, LByte2: Byte; LMagicCode: Word; begin Result := False; LByte1 := Byte(AHeadCode); LByte2 := HiByte(AHeadCode); for I := Low(C_TypeCodeArr) to High(C_TypeCodeArr) do begin LMagicCode := Byte(C_TypeCodeArr[I]) xor LByte1; if LMagicCode = (HiByte(C_TypeCodeArr[I]) xor LByte2) then begin AMagicCode := LMagicCode; AFileExt := C_TypeExtArr[I]; Result := True; end; end; end; procedure MakeFileList(const Path, FileExt: string; AFileList: TStrings); var sch: TSearchRec; tmpPath: string; begin if RightStr(Trim(Path), 1) <> '\' then tmpPath := Trim(Path) + '\' else tmpPath := Trim(Path); if not DirectoryExists(tmpPath) then Exit; if FindFirst(tmpPath + '*', faAnyFile, sch) = 0 then begin repeat if ((sch.Name = '.') or (sch.Name = '..')) then Continue; if (UpperCase(ExtractFileExt(tmpPath + sch.Name)) = UpperCase(FileExt)) or (FileExt = '.*') then AFileList.Add(tmpPath + sch.Name); until FindNext(sch) <> 0; System.SysUtils.FindClose(sch); end; end; procedure DecryptWXImgFile(const ASrcFile, ASavePath: string); var LSrcStream: TMemoryStream; LDesStream: TFileStream; LFilesize, LPos: Integer; LBuffer: Word; LSrcByte, LDesByte: Byte; LMagicCode: Word; LFileExt, LFileName: string; begin LSrcStream := TMemoryStream.Create; try LSrcStream.LoadFromFile(ASrcFile); LSrcStream.Position := 0; LSrcStream.ReadBuffer(LBuffer, 2); if CalcMagicCode(LBuffer, LMagicCode, LFileExt) then begin LFileName := ASavePath + ChangeFileExt(ExtractFileName(ASrcFile), LFileExt); LDesStream := TFileStream.Create(LFileName, fmCreate); try LPos := 0; LFilesize := LSrcStream.Size; // 此處效率低,需要優化 while LPos < LFilesize do begin LSrcStream.Position := LPos; LSrcStream.ReadBuffer(LSrcByte, 1); LDesByte := LSrcByte xor LMagicCode; LDesStream.WriteBuffer(LDesByte, 1); Inc(LPos); end; finally LDesStream.Free; end; end; finally LSrcStream.Free; end; end;
調用方法:
DecryptWXImgFile(‘C:\Users\5bug\Documents\WeChat Files\Wubug5\Data\1383774871197177544.dat’, ‘C:\Users\5bug\Desktop\test\’);
以上代碼里有一處自行優化吧,否則效率非常低下!只要監控這個存儲目錄,就可以實現找到被撤回的微信圖片或者存儲被撤回的圖片了,還可以實現一些小工具了,比如微信防撤回圖片存儲器,微信圖片整理工具等了。
另外愛好Delphi的而且正在學習Python的同學可以加群一起交流啊QQ群643829693!