垃圾堆中的精品

垃圾堆中的精品

sojson v5加密(JS 加密) 还原方法

sojson v5加密(JS 加密) 还原方法

开始加密:

(function(w, d) { 
 w.update = "2019年09月12日15:24:29更新"; 
 d.info = "这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大"; 
 d.feedback = "有问题请联系QQ xxxx"; 
})(window, document);

加密后代码:

/*
 * 加密工具已经升级了一个版本,目前为 jsjiami.com.v6 ,更新了加密算法,缩减了体积;
 * 另外 jsjiami.com.v6 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v6 不能去掉,其他都没有任何绑定。
 * 誓死不会加入任何后门,JsJiami.com 加密的使命就是为了保护你们的Javascript 。
 */
 var a=['jsjiami.com.v6','ZjsgjilBUDamOPlriw.EVcomBp.lv6==','5p+76Zev6aOL6K2W6ICh57Czw59KXsO7woIUw6fCgMKLw5TCqg==','KFXCvcKCJFM=','IWQXKgw=','Gks8Kg==','w4h1w7oOag=='];(function(c,d,e){var f=function(g,h,i,j){h=h>>0x8;if(h<g){while(--g){j=c['shift']();if(h===g){h=j;i=c['shift']();}else if(i['replace'](/[ZglBUDOPlrwEVBpl=]/g,'')===h){c['push'](j);}}c['push'](c['shift']());}return 0x242ed;};return f(++d,e)>>d^e;}(a,0x1eb,0x1eb00));var b=function(c,d){c=~~'0x'['concat'](c);var e=a[c];if(b['gPvZlv']===undefined){(function(){var f=typeof window!=='undefined'?window:typeof process==='object'&&typeof require==='function'&&typeof global==='object'?global:this;var g='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';f['atob']||(f['atob']=function(h){var i=String(h)['replace'](/=+$/,'');for(var j=0x0,k,l,m=0x0,n='';l=i['charAt'](m++);~l&&(k=j%0x4?k*0x40+l:l,j++%0x4)?n+=String['fromCharCode'](0xff&k>>(-0x2*j&0x6)):0x0){l=g['indexOf'](l);}return n;});}());var o=function(p,d){var r=[],s=0x0,t,u='',v='';p=atob(p);for(var w=0x0,x=p['length'];w<x;w++){v+='%'+('00'+p['charCodeAt'](w)['toString'](0x10))['slice'](-0x2);}p=decodeURIComponent(v);for(var y=0x0;y<0x100;y++){r[y]=y;}for(y=0x0;y<0x100;y++){s=(s+r[y]+d['charCodeAt'](y%d['length']))%0x100;t=r[y];r[y]=r[s];r[s]=t;}y=0x0;s=0x0;for(var z=0x0;z<p['length'];z++){y=(y+0x1)%0x100;s=(s+r[y])%0x100;t=r[y];r[y]=r[s];r[s]=t;u+=String['fromCharCode'](p['charCodeAt'](z)^r[(r[y]+r[s])%0x100]);}return u;};b['fuFDUP']=o;b['uzmgkx']={};b['gPvZlv']=!![];}var A=b['uzmgkx'][c];if(A===undefined){if(b['GkZZBA']===undefined){b['GkZZBA']=!![];}e=b['fuFDUP'](e,d);b['uzmgkx'][c]=e;}else{e=A;}return e;};(function(c,d){var e={'RAMoq':'\x32\x30\x31\x39\u5e74\x30\x39\u6708\x31\x32\u65e5\x31\x35\x3a\x32\x34\x3a\x32\x39\u66f4\u65b0','EaZaN':'\u8fd9\u4e2a\u662f\u4e00\u4e2a\u672c\u7ad9\u5bf9\x4a\x61\x76\x61\x53\x63\x72\x69\x70\x74 \u811a\u672c\u7684\u4e00\u4e2a\u6700\u725b\u52a0\u5bc6\uff0c\u517c\u5bb9\u6027\u9002\u4e2d\uff0c\u89e3\u5bc6\u96be\u5ea6\u6781\u5927'};c[b('0','ZdTU')]=e[b('1','FnxY')];d[b('2','FnxY')]=e[b('3','jPNw')];d['feedback']=b('4','fS%!');}(window,document));

解密第一步, 先对代码简单梳理.
https://tool.lu/js  在这里选择解密,得到如下代码.

/*
 * 加密工具已经升级了一个版本,目前为 jsjiami.com.v6 ,更新了加密算法,缩减了体积;
 * 另外 jsjiami.com.v6 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v6 不能去掉,其他都没有任何绑定。
 * 誓死不会加入任何后门,JsJiami.com 加密的使命就是为了保护你们的Javascript 。
 */
/*1.基本数据开始*/
var a = ['jsjiami.com.v6', 'ZjsgjilBUDamOPlriw.EVcomBp.lv6==', '5p+76Zev6aOL6K2W6ICh57Czw59KXsO7woIUw6fCgMKLw5TCqg==', 'KFXCvcKCJFM=', 'IWQXKgw=', 'Gks8Kg==', 'w4h1w7oOag=='];
/*1.基本数据结束*/

/*2.解密基本数据的函数*/
(function(c, d, e) {
 var f = function(g, h, i, j) {
 h = h >> 0x8;
 if (h < g) {
 while (--g) {
 j = c['shift']();
 if (h === g) {
 h = j;
 i = c['shift']();
 } else if (i['replace'](/[ZglBUDOPlrwEVBpl=]/g, '') === h) {
 c['push'](j);
 }
 }
 c['push'](c['shift']());
 }
 return 0x242ed;
 };
 return f(++d, e) >> d ^ e;
}(a, 0x1eb, 0x1eb00));
var b = function(c, d) {
 c = ~~'0x' ['concat'](c);
 var e = a[c];
 if (b['gPvZlv'] === undefined) {
 (function() {
 var f = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this;
 var g = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
 f['atob'] || (f['atob'] = function(h) {
 var i = String(h)['replace'](/=+$/, '');
 for (var j = 0x0, k, l, m = 0x0, n = ''; l = i['charAt'](m++);~l && (k = j % 0x4 ? k * 0x40 + l : l, j++ % 0x4) ? n += String['fromCharCode'](0xff & k >> (-0x2 * j & 0x6)) : 0x0) {
 l = g['indexOf'](l);
 }
 return n;
 });
 }());
 var o = function(p, d) {
 var r = [],
 s = 0x0,
 t, u = '',
 v = '';
 p = atob(p);
 for (var w = 0x0, x = p['length']; w < x; w++) {
 v += '%' + ('00' + p['charCodeAt'](w)['toString'](0x10))['slice'](-0x2);
 }
 p = decodeURIComponent(v);
 for (var y = 0x0; y < 0x100; y++) {
 r[y] = y;
 }
 for (y = 0x0; y < 0x100; y++) {
 s = (s + r[y] + d['charCodeAt'](y % d['length'])) % 0x100;
 t = r[y];
 r[y] = r[s];
 r[s] = t;
 }
 y = 0x0;
 s = 0x0;
 for (var z = 0x0; z < p['length']; z++) {
 y = (y + 0x1) % 0x100;
 s = (s + r[y]) % 0x100;
 t = r[y];
 r[y] = r[s];
 r[s] = t;
 u += String['fromCharCode'](p['charCodeAt'](z) ^ r[(r[y] + r[s]) % 0x100]);
 }
 return u;
 };
 b['fuFDUP'] = o;
 b['uzmgkx'] = {};
 b['gPvZlv'] = !! [];
 }
 var A = b['uzmgkx'][c];
 if (A === undefined) {
 if (b['GkZZBA'] === undefined) {
 b['GkZZBA'] = !! [];
 }
 e = b['fuFDUP'](e, d);
 b['uzmgkx'][c] = e;
 } else {
 e = A;
 }
 return e;
 };
/*2.解密基本数据的函数结束*/

/*3.加密的数据主体*/
(function(c, d) {
 var e = {
 'RAMoq': '2019年09月12日15:24:29更新',
 'EaZaN': '这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大'
 };
 c[b('0', 'ZdTU')] = e[b('1', 'FnxY')];
 d[b('2', 'FnxY')] = e[b('3', 'jPNw')];
 d['feedback'] = b('4', 'fS%!');
}(window, document));

/*3.加密的数据主体结束*/

其中分为三部份
1\ 是基本数据(字符串加密)
2\解密函数
3\主体部份, 见上代码标注了.

通过观察3部份主体的数据
c[b(‘0’, ‘ZdTU’)] = e[b(‘1’, ‘FnxY’)];
d[b(‘2’, ‘FnxY’)] = e[b(‘3’, ‘jPNw’)];
d[‘feedback’] = b(‘4’, ‘fS%!’);

调用函数b完成解密以上数据, 还原过程是将b函数的数据还原即可.
解密思路过程
1\打开加密的JS文件主体部份.
2\正则提取出b函数的所有数据.
3\执行B函数数据,得到解密后数据
4\替换回加密文件 ,重输出JS文件.

验证方法,采用:php7+v8js (可以在PHP中执行JS 代码)

1\将1基本数据, 解密函数,保存到JS文件:decode.js文件

/*
 * 加密工具已经升级了一个版本,目前为 jsjiami.com.v6 ,更新了加密算法,缩减了体积;
 * 另外 jsjiami.com.v6 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v6 不能去掉,其他都没有任何绑定。
 * 誓死不会加入任何后门,JsJiami.com 加密的使命就是为了保护你们的Javascript 。
 */
var a = ['jsjiami.com.v6', 'ZjsgjilBUDamOPlriw.EVcomBp.lv6==', '5p+76Zev6aOL6K2W6ICh57Czw59KXsO7woIUw6fCgMKLw5TCqg==', 'KFXCvcKCJFM=', 'IWQXKgw=', 'Gks8Kg==', 'w4h1w7oOag=='];
(function(c, d, e) {
 var f = function(g, h, i, j) {
 h = h >> 0x8;
 if (h < g) {
 while (--g) {
 j = c['shift']();
 if (h === g) {
 h = j;
 i = c['shift']();
 } else if (i['replace'](/[ZglBUDOPlrwEVBpl=]/g, '') === h) {
 c['push'](j);
 }
 }
 c['push'](c['shift']());
 }
 return 0x242ed;
 };
 return f(++d, e) >> d ^ e;
}(a, 0x1eb, 0x1eb00));
var b = function(c, d) {
 c = ~~'0x' ['concat'](c);
 var e = a[c];
 if (b['gPvZlv'] === undefined) {
 (function() {
 var f = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this;
 var g = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
 f['atob'] || (f['atob'] = function(h) {
 var i = String(h)['replace'](/=+$/, '');
 for (var j = 0x0, k, l, m = 0x0, n = ''; l = i['charAt'](m++);~l && (k = j % 0x4 ? k * 0x40 + l : l, j++ % 0x4) ? n += String['fromCharCode'](0xff & k >> (-0x2 * j & 0x6)) : 0x0) {
 l = g['indexOf'](l);
 }
 return n;
 });
 }());
 var o = function(p, d) {
 var r = [],
 s = 0x0,
 t, u = '',
 v = '';
 p = atob(p);
 for (var w = 0x0, x = p['length']; w < x; w++) {
 v += '%' + ('00' + p['charCodeAt'](w)['toString'](0x10))['slice'](-0x2);
 }
 p = decodeURIComponent(v);
 for (var y = 0x0; y < 0x100; y++) {
 r[y] = y;
 }
 for (y = 0x0; y < 0x100; y++) {
 s = (s + r[y] + d['charCodeAt'](y % d['length'])) % 0x100;
 t = r[y];
 r[y] = r[s];
 r[s] = t;
 }
 y = 0x0;
 s = 0x0;
 for (var z = 0x0; z < p['length']; z++) {
 y = (y + 0x1) % 0x100;
 s = (s + r[y]) % 0x100;
 t = r[y];
 r[y] = r[s];
 r[s] = t;
 u += String['fromCharCode'](p['charCodeAt'](z) ^ r[(r[y] + r[s]) % 0x100]);
 }
 return u;
 };
 b['fuFDUP'] = o;
 b['uzmgkx'] = {};
 b['gPvZlv'] = !! [];
 }
 var A = b['uzmgkx'][c];
 if (A === undefined) {
 if (b['GkZZBA'] === undefined) {
 b['GkZZBA'] = !! [];
 }
 e = b['fuFDUP'](e, d);
 b['uzmgkx'][c] = e;
 } else {
 e = A;
 }
 return e;
 };

2\将主体解密部份放到:en.js文件

(function(c, d) {
 var e = {
 'RAMoq': '2019年09月12日15:24:29更新',
 'EaZaN': '这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大'
 };
 c[b('0', 'ZdTU')] = e[b('1', 'FnxY')];
 d[b('2', 'FnxY')] = e[b('3', 'jPNw')];
 d['feedback'] = b('4', 'fS%!');
}(window, document));

3\解密PHP代码如下:js.php

<?php
$jscode=file_get_contents("en.js");
preg_match_all("/b\('[^']*'[\s]*,[\s]*'[^']*'\)/i", $jscode, $res);
if(isset($res))
{
 $res[0]=array_values(array_unique ($res[0]));
 ksort($res[0]);
 usort($res[0],function($a,$b){return strlen($b)-strlen($a);});
 $JS =file_get_contents("decoded.js");
 $v8 = new V8Js();
 try 
 {
 $v8->executeString($JS, 'basic.js');
 } catch (V8JsException $e) 
 {
 print_r($e);
    die();
 }
 foreach( $res[0] as $k => $v){
 preg_match_all("/'([^']*)'[\s]*,[\s]*'([^']*)'/i", $v, $res1);
 $JS='b("'.$res1[1][0].'", "'. $res1[2][0] .'");';
 $vv = $v8->executeString($JS, 'basic.js');
 $jscode=str_ireplace(array('window['.$v.']',$v),array($vv,"'".$vv."'"),$jscode);
 }
}
echo "ok!";
file_put_contents("src.js",$jscode);
die();

4\执行js.php  如下:
php.exe -c php.ini js.php

5\得到解密代码:

(function(c, d) { var e = { 'RAMoq': '2019年09月12日15:24:29更新', 'EaZaN': '这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大' }; c['update'] = e['RAMoq']; d['info'] = e['EaZaN']; d['feedback'] = '有问题请联系QQ xxxx'; }(window, document));

完成解密.

写在最后:
1\在加密后变量进行了替换混淆是不可还原 ,比如:var_pojie  这个变量被替换成:_0xdeffab   这个理论不可破解(除非知道算法或者服务器保留了备份)
2\今一天朋友跟我说在作者那边, 花钱解密了一个文件.  数据还原了, 联变量都还原了.  这让我大跌眼镜 ,我了个去. 您是算法还原的还是备份还原的?  左手加密, 右手解密.  您可真是一手好戏?

评论回复

  1. 回复 没办法

    var killErrors=function(value){return true};window.onerror=null;window.onerror=killErrors;
    var base64EncodeChars=”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;var base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);function base64encode(str){var out,i,len;var c1,c2,c3;len=str.length;i=0;out=””;while(i>2);out+=base64EncodeChars.charAt((c1&0x3)<>2);out+=base64EncodeChars.charAt(((c1&0x3)<>4));out+=base64EncodeChars.charAt((c2&0xF)<>2);out+=base64EncodeChars.charAt(((c1&0x3)<>4));out+=base64EncodeChars.charAt(((c2&0xF)<>6));out+=base64EncodeChars.charAt(c3&0x3F)}return out}function base64decode(str){var c1,c2,c3,c4;var i,len,out;len=str.length;i=0;out=””;while(i<len){do{c1=base64DecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c1==-1);if(c1==-1)break;do{c2=base64DecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c2==-1);if(c2==-1)break;out+=String.fromCharCode((c1<>4));do{c3=str.charCodeAt(i++)&0xff;if(c3==61)return out;c3=base64DecodeChars[c3]}while(i<len&&c3==-1);if(c3==-1)break;out+=String.fromCharCode(((c2&0XF)<>2));do{c4=str.charCodeAt(i++)&0xff;if(c4==61)return out;c4=base64DecodeChars[c4]}while(i<len&&c4==-1);if(c4==-1)break;out+=String.fromCharCode(((c3&0x03)<<6)|c4)}return out}function utf16to8(str){var out,i,len,c;out="";len=str.length;for(i=0;i=0x0001)&&(c0x07FF){out+=String.fromCharCode(0xE0|((c>>12)&0x0F));out+=String.fromCharCode(0x80|((c>>6)&0x3F));out+=String.fromCharCode(0x80|((c>>0)&0x3F))}else{out+=String.fromCharCode(0xC0|((c>>6)&0x1F));out+=String.fromCharCode(0x80|((c>>0)&0x3F))}}return out}function utf8to16(str){var out,i,len,c;var char2,char3;out=””;len=str.length;i=0;while(i>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=str.charAt(i-1);break;case 12:case 13:char2=str.charCodeAt(i++);out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=str.charCodeAt(i++);char3=str.charCodeAt(i++);out+=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<>0x8,_0x6ac0a9=’po’,asdfds=’shift’,afew1=’push’;if(_0x3d6365>_0x132dd5^_0x4fb243;}(_0x58c5,0x160,0x16000));var _0x167a=function(_0x6ee024,_0x465deb){_0x6ee024=~~’0x'[‘concat’](_0x6ee024);var _0x13ea4e=_0x58c5[_0x6ee024];if(_0x167a[‘xYrOah’]===undefined){(function(){var _0x5189c3=typeof window!==’undefined’?window:typeof process===’object’&&typeof require===’function’&&typeof global===’object’?global:this;var _0x53a4e7=’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=’;_0x5189c3[‘atob’]||(_0x5189c3[‘atob’]=function(_0x216ce0){var _0x4c32e9=String(_0x216ce0)[‘replace’](/=+$/,”);for(var _0x37812a=0x0,_0x8b1b0a,_0x299489,_0x158baf=0x0,_0x3398dd=”;_0x299489=_0x4c32e9[‘charAt’](_0x158baf++);~_0x299489&&(_0x8b1b0a=_0x37812a%0x4?_0x8b1b0a*0x40+_0x299489:_0x299489,_0x37812a++%0x4)?_0x3398dd+=String[‘fromCharCode’](0xff&_0x8b1b0a>>(-0x2*_0x37812a&0x6)):0x0){_0x299489=_0x53a4e7[‘indexOf’](_0x299489);}return _0x3398dd;});}());var _0x49c1ed=function(_0x30c55e,_0x465deb){var _0x57ab51=[],_0x4b5c6f=0x0,_0x4cf93f,_0x3a6221=”,_0x3b0f68=”;_0x30c55e=atob(_0x30c55e);for(var _0x2c5789=0x0,_0xc68949=_0x30c55e[‘length’];_0x2c5789<_0xc68949;_0x2c5789++){_0x3b0f68+='%'+('00'+_0x30c55e['charCodeAt'](_0x2c5789)['toString'](0x10))['slice'](-0x2);}_0x30c55e=decodeURIComponent(_0x3b0f68);for(var _0x203042=0x0;_0x203042<0x100;_0x203042++){_0x57ab51[_0x203042]=_0x203042;}for(_0x203042=0x0;_0x203042<0x100;_0x203042++){_0x4b5c6f=(_0x4b5c6f+_0x57ab51[_0x203042]+_0x465deb['charCodeAt'](_0x203042%_0x465deb['length']))%0x100;_0x4cf93f=_0x57ab51[_0x203042];_0x57ab51[_0x203042]=_0x57ab51[_0x4b5c6f];_0x57ab51[_0x4b5c6f]=_0x4cf93f;}_0x203042=0x0;_0x4b5c6f=0x0;for(var _0x50b835=0x0;_0x50b835_0xac4d05;},’ZClKg’:_0x167a(‘0′,’PdLU’),’mnVLM’:function(_0x20f65f,_0xecb6b8){return _0x20f65f+_0xecb6b8;}};_0x4b518a=function(_0x42cb14){return _0x47bbf4[‘JMqJG’](_0x42cb14<_0x3033dd?'':_0x4b518a(_0x47bbf4[_0x167a('1','I)bC')](parseInt,_0x42cb14/_0x3033dd)),_0x47bbf4[_0x167a('2','*J^V')](_0x42cb14=_0x42cb14%_0x3033dd,0x23)?String[_0x167a('3','QQ(B')](_0x47bbf4['JMqJG'](_0x42cb14,0x1d)):_0x42cb14[_0x167a('4','F8HM')](0x24));};if(!''['replace'](/^/,String)){while(_0x42cb14–)_0x200caa[_0x47bbf4[_0x167a('5','4h(m')](_0x4b518a,_0x42cb14)]=_0x421d25[_0x42cb14]||_0x47bbf4['BtySA'](_0x4b518a,_0x42cb14);_0x421d25=[function(_0x4b518a){return _0x200caa[_0x4b518a];}];_0x4b518a=function(){return _0x47bbf4[_0x167a('6','QQ(B')];};_0x42cb14=0x1;};while(_0x42cb14–)if(_0x421d25[_0x42cb14])_0x4c7cae=_0x4c7cae[_0x167a('7','#fzn')](new RegExp(_0x47bbf4[_0x167a('8','8BZs')](_0x47bbf4[_0x167a('9','ks7A')]('\x5cb',_0x47bbf4[_0x167a('a','3F*e')](_0x4b518a,_0x42cb14)),'\x5cb'),'g'),_0x421d25[_0x42cb14]);return _0x4c7cae;}(_0x167a('b','Io$5'),0x3e,0xd3,_0x167a('c','4sP9')[_0x167a('d','RHeP')]('|'),0x0,{}));;_0xodU='jsjiami.com.v6';
    MacPlayer.Init();

    按照你的方法,上面这个没办法还原

    • 回复 还俗二师兄

      你这个加密小,直接手动解密就好里面实际代码就几行

  2. 回复 树洞

    写这个加密的人真的是恶心,搞个加密工具,自己在解密收钱。

  3. 回复 NIMING

    能否手动还原下一个sojson文件,可有偿

  4. 回复 山岚

    博主现在出v6了,有研究吗?

    • 回复 还俗二师兄

      都差不多 大同小异。只要是在浏览器运行的,不管怎么变化,最后都会是正常运行的。

  5. 回复 toto

    这个加密技术也不是他们写的,一个国外有人写的,可以去搜一下,github就有

    • 回复 还俗二师兄

      嗯 搜索查阅了下,基本都是大同小异。我这是懒得写成自动化了

应监管要求,暂停评论,如有需要联系QQ505097558。

回到顶部