废话不多说,上代码
前端页面,为了省事,js都是引用的cdn
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content="bat, 解密, bat解密, wechat, 微信,dat,dat解密"/>
<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<meta name="description" content="bat,解密,wechat,微信,dat"/>
<title>微信dat解密</title>
<script src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://www.layuicdn.com/layui/css/layui.css" />
<script src="https://www.layuicdn.com/layui/layui.js"></script>
<style>
#img {
margin-top: 20px;
}
#img img {
width: 200px;
margin-right: 20px;
margin-top: 10px;
padding: 5px;
border: 5px double #ffc7c7;
}
</style>
</head>
<body>
<div class="layui-bg-gray" style="padding: 30px;">
<div class="layui-row layui-col-space15">
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">提示</div>
<div class="layui-card-body">
1、单个dat文件不能大于1M<br>
2、单次最多上传20个文件解析<br>
3、解析之后点击图片下载<br>
4、单次上传的dat文件需是同一微信的dat文件
</div>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">文件上传</label>
<button type="button" class="layui-btn layui-btn-normal" id="uploadDat">
<i class="layui-icon"></i>
选择dat文件
</button>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" id="submitimg">开始上传</button>
<button class="layui-btn layui-btn-primary reset">重置</button>
</div>
</div>
<hr class="layui-border-blue">
<div id="img"></div>
<script>
layui.use('upload', function(){
var upload = layui.upload;
//执行实例
var uploadListIns = upload.render({
elem: '#uploadDat'
,accept: 'file'
,size: '1024'
,multiple: true
,number: 20
,exts: 'dat'
,field: 'files'
,auto: false
,bindAction: '#submitimg'
,url: '自己的上传接口.php'
,before: function(res){
$('#img').html('');
}
,done: function(res){
//上传完毕回调
_html = '<a href="'+res.data.scr+'" download="'+res.data.alt+'.jpg"><img src="' + res.data.scr + '" alt=""></a>';
$("#img").append(_html);
}
,error: function(){
//请求异常回调
}
});
});
</script>
</body>
</html>
php代码:
<?php
header("Access-Control-Allow-Origin: *");
$files = $_FILES['files'];
if($files){
$verify = uploadVerify($files);
if($verify['code'] > 0){
echo json_encode($verify,320);
exit;
}
$filename = './images/';
$filehost = $_SERVER['HTTP_ORIGIN'] . dirname($_SERVER['PHP_SELF']) . '/';
$res = datdecode($files['tmp_name']);
$imgList = ['scr'=>$filehost . $res,'alt'=>$res];
echo json_encode(['code'=>0,'data'=>$imgList,'msg'=>'解密成功'],320);
}else{
echo '{"code":1,"msg":"请上传文件"}';
}
function uploadVerify($files)
{
if(!$files) return ['code'=>1,'msg'=>'请上传文件'];
if(is_array($files['name'])) return ['code'=>1,'msg'=>'上传错误'];// 限制只能单文件上传
if($files['error'] > 0) return ['code'=>1,'msg'=>$files['error']];
if($files['size'] > 1024*1024) return ['code'=>1,'msg'=>'文件大小超出限制'];
if(strtolower(substr(strrchr($files['name'], '.'), 1)) != 'dat') return ['code'=>1,'msg'=>'请上传dat文件'];
if($files['type'] != 'application/octet-stream') return ['code'=>1,'msg'=>'请上传dat文件'];
return ['code'=>0,'msg'=>'验证完毕'];
}
function xor_enc($filename)
{
static $key='';
$content = ''; // 处理后的字符串
$fp = fopen($filename, 'rb');
while(!feof($fp)){
$tmp = fread($fp, 1);
if(!$key) $key = hexdec('0x'.bin2hex($tmp)) ^ 0xff;
$a = dechex(hexdec('0x'.bin2hex($tmp)) ^ 0x5e);
// ╭(╯ε╰)╮不知道为啥, 1 使用pack函数之后是10
if(strlen($a) == 1) $a = '0'.$a;
$content .= pack('H*', $a); ;
}
fclose($fp);
return $content;
}
function datdecode($filenameold)
{
$key = 0x5e;
$date = date('YmdHis');
$datedir = substr($date,0,6);
$filename = './images/';
$filename .= $datedir;
if(!is_dir($filename))
{
mkdir($filename, 0775, true);
}
$filename = $filename . '/'.uniqid().$date.rand(100000,999999).'.jpg';
touch($filename);
$a=file_put_contents($filename, xor_enc($filenameold) , true);
return $filename;
}
?>
只是初版,没有来得及优化,有不足之处欢迎指正
演示地址:https://tool.kongning.top/datdecode/
php版本下载:https://download.csdn.net/download/qq_34792050/81459999