快捷导航
Sojson V5解密方法全过程分享,Sojson V5加密其实也有网上说的那么神奇!有网友问:怎么破解sojson.v5加密?官方给出的说法是“不要尝试破解,难度较大,非专业人员无法破解,另外如果有人说可以100%还原,那就不用再聊,肯定是骗人的。”那我们就尝试破解一下Sojson V5加密的代码。
首先,我们给一段代码用sojson.v5加密:
  1. (function(w, d) {
  2. w.update = "2019年09月12日15:24:29更新";
  3. d.info = "这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大";
  4. d.feedback = "有问题请联系QQ xxxx";
  5. })(window, document);
复制代码
加密后代码:
  1. /*
  2. * 加密工具已经升级了一个版本,目前为 jsjiami.com.v6 ,更新了加密算法,缩减了体积;
  3. * 另外 jsjiami.com.v6 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v6 不能去掉,其他都没有任何绑定。
  4. * 誓死不会加入任何后门,JsJiami.com 加密的使命就是为了保护你们的Javascript 。
  5. */
  6. 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));
复制代码
解密第一步, 先对代码简单梳理,得到如下代码:
  1. /*
  2. * 加密工具已经升级了一个版本,目前为 jsjiami.com.v6 ,更新了加密算法,缩减了体积;
  3. * 另外 jsjiami.com.v6 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v6 不能去掉,其他都没有任何绑定。
  4. * 誓死不会加入任何后门,JsJiami.com 加密的使命就是为了保护你们的Javascript 。
  5. */
  6. /*1.基本数据开始*/
  7. var a = ['jsjiami.com.v6', 'ZjsgjilBUDamOPlriw.EVcomBp.lv6==', '5p+76Zev6aOL6K2W6ICh57Czw59KXsO7woIUw6fCgMKLw5TCqg==', 'KFXCvcKCJFM=', 'IWQXKgw=', 'Gks8Kg==', 'w4h1w7oOag=='];
  8. /*1.基本数据结束*/

  9. /*2.解密基本数据的函数*/
  10. (function(c, d, e) {
  11.         var f = function(g, h, i, j) {
  12.                         h = h >> 0x8;
  13.                         if (h < g) {
  14.                                 while (--g) {
  15.                                         j = c['shift']();
  16.                                         if (h === g) {
  17.                                                 h = j;
  18.                                                 i = c['shift']();
  19.                                         } else if (i['replace'](/[ZglBUDOPlrwEVBpl=]/g, '') === h) {
  20.                                                 c['push'](j);
  21.                                         }
  22.                                 }
  23.                                 c['push'](c['shift']());
  24.                         }
  25.                         return 0x242ed;
  26.                 };
  27.         return f(++d, e) >> d ^ e;
  28. }(a, 0x1eb, 0x1eb00));
  29. var b = function(c, d) {
  30.                 c = ~~'0x' ['concat'](c);
  31.                 var e = a[c];
  32.                 if (b['gPvZlv'] === undefined) {
  33.                         (function() {
  34.                                 var f = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this;
  35.                                 var g = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  36.                                 f['atob'] || (f['atob'] = function(h) {
  37.                                         var i = String(h)['replace'](/=+$/, '');
  38.                                         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) {
  39.                                                 l = g['indexOf'](l);
  40.                                         }
  41.                                         return n;
  42.                                 });
  43.                         }());
  44.                         var o = function(p, d) {
  45.                                         var r = [],
  46.                                                 s = 0x0,
  47.                                                 t, u = '',
  48.                                                 v = '';
  49.                                         p = atob(p);
  50.                                         for (var w = 0x0, x = p['length']; w < x; w++) {
  51.                                                 v += '%' + ('00' + p['charCodeAt'](w)['toString'](0x10))['slice'](-0x2);
  52.                                         }
  53.                                         p = decodeURIComponent(v);
  54.                                         for (var y = 0x0; y < 0x100; y++) {
  55.                                                 r[y] = y;
  56.                                         }
  57.                                         for (y = 0x0; y < 0x100; y++) {
  58.                                                 s = (s + r[y] + d['charCodeAt'](y % d['length'])) % 0x100;
  59.                                                 t = r[y];
  60.                                                 r[y] = r[s];
  61.                                                 r[s] = t;
  62.                                         }
  63.                                         y = 0x0;
  64.                                         s = 0x0;
  65.                                         for (var z = 0x0; z < p['length']; z++) {
  66.                                                 y = (y + 0x1) % 0x100;
  67.                                                 s = (s + r[y]) % 0x100;
  68.                                                 t = r[y];
  69.                                                 r[y] = r[s];
  70.                                                 r[s] = t;
  71.                                                 u += String['fromCharCode'](p['charCodeAt'](z) ^ r[(r[y] + r[s]) % 0x100]);
  72.                                         }
  73.                                         return u;
  74.                                 };
  75.                         b['fuFDUP'] = o;
  76.                         b['uzmgkx'] = {};
  77.                         b['gPvZlv'] = !! [];
  78.                 }
  79.                 var A = b['uzmgkx'][c];
  80.                 if (A === undefined) {
  81.                         if (b['GkZZBA'] === undefined) {
  82.                                 b['GkZZBA'] = !! [];
  83.                         }
  84.                         e = b['fuFDUP'](e, d);
  85.                         b['uzmgkx'][c] = e;
  86.                 } else {
  87.                         e = A;
  88.                 }
  89.                 return e;
  90.         };
  91. /*2.解密基本数据的函数结束*/

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

  102. /*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文件
  1. /*
  2. * 加密工具已经升级了一个版本,目前为 jsjiami.com.v6 ,更新了加密算法,缩减了体积;
  3. * 另外 jsjiami.com.v6 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v6 不能去掉,其他都没有任何绑定。
  4. * 誓死不会加入任何后门,JsJiami.com 加密的使命就是为了保护你们的Javascript 。
  5. */
  6. var a = ['jsjiami.com.v6', 'ZjsgjilBUDamOPlriw.EVcomBp.lv6==', '5p+76Zev6aOL6K2W6ICh57Czw59KXsO7woIUw6fCgMKLw5TCqg==', 'KFXCvcKCJFM=', 'IWQXKgw=', 'Gks8Kg==', 'w4h1w7oOag=='];
  7. (function(c, d, e) {
  8.         var f = function(g, h, i, j) {
  9.                         h = h >> 0x8;
  10.                         if (h < g) {
  11.                                 while (--g) {
  12.                                         j = c['shift']();
  13.                                         if (h === g) {
  14.                                                 h = j;
  15.                                                 i = c['shift']();
  16.                                         } else if (i['replace'](/[ZglBUDOPlrwEVBpl=]/g, '') === h) {
  17.                                                 c['push'](j);
  18.                                         }
  19.                                 }
  20.                                 c['push'](c['shift']());
  21.                         }
  22.                         return 0x242ed;
  23.                 };
  24.         return f(++d, e) >> d ^ e;
  25. }(a, 0x1eb, 0x1eb00));
  26. var b = function(c, d) {
  27.                 c = ~~'0x' ['concat'](c);
  28.                 var e = a[c];
  29.                 if (b['gPvZlv'] === undefined) {
  30.                         (function() {
  31.                                 var f = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this;
  32.                                 var g = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  33.                                 f['atob'] || (f['atob'] = function(h) {
  34.                                         var i = String(h)['replace'](/=+$/, '');
  35.                                         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) {
  36.                                                 l = g['indexOf'](l);
  37.                                         }
  38.                                         return n;
  39.                                 });
  40.                         }());
  41.                         var o = function(p, d) {
  42.                                         var r = [],
  43.                                                 s = 0x0,
  44.                                                 t, u = '',
  45.                                                 v = '';
  46.                                         p = atob(p);
  47.                                         for (var w = 0x0, x = p['length']; w < x; w++) {
  48.                                                 v += '%' + ('00' + p['charCodeAt'](w)['toString'](0x10))['slice'](-0x2);
  49.                                         }
  50.                                         p = decodeURIComponent(v);
  51.                                         for (var y = 0x0; y < 0x100; y++) {
  52.                                                 r[y] = y;
  53.                                         }
  54.                                         for (y = 0x0; y < 0x100; y++) {
  55.                                                 s = (s + r[y] + d['charCodeAt'](y % d['length'])) % 0x100;
  56.                                                 t = r[y];
  57.                                                 r[y] = r[s];
  58.                                                 r[s] = t;
  59.                                         }
  60.                                         y = 0x0;
  61.                                         s = 0x0;
  62.                                         for (var z = 0x0; z < p['length']; z++) {
  63.                                                 y = (y + 0x1) % 0x100;
  64.                                                 s = (s + r[y]) % 0x100;
  65.                                                 t = r[y];
  66.                                                 r[y] = r[s];
  67.                                                 r[s] = t;
  68.                                                 u += String['fromCharCode'](p['charCodeAt'](z) ^ r[(r[y] + r[s]) % 0x100]);
  69.                                         }
  70.                                         return u;
  71.                                 };
  72.                         b['fuFDUP'] = o;
  73.                         b['uzmgkx'] = {};
  74.                         b['gPvZlv'] = !! [];
  75.                 }
  76.                 var A = b['uzmgkx'][c];
  77.                 if (A === undefined) {
  78.                         if (b['GkZZBA'] === undefined) {
  79.                                 b['GkZZBA'] = !! [];
  80.                         }
  81.                         e = b['fuFDUP'](e, d);
  82.                         b['uzmgkx'][c] = e;
  83.                 } else {
  84.                         e = A;
  85.                 }
  86.                 return e;
  87.         };
复制代码
2、将主体解密部份放到:en.js文件
  1. (function(c, d) {
  2.         var e = {
  3.                 'RAMoq': '2019年09月12日15:24:29更新',
  4.                 'EaZaN': '这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大'
  5.         };
  6.         c[b('0', 'ZdTU')] = e[b('1', 'FnxY')];
  7.         d[b('2', 'FnxY')] = e[b('3', 'jPNw')];
  8.         d['feedback'] = b('4', 'fS%!');
  9. }(window, document));
复制代码
3、解密PHP代码如下:js.php
  1. <?php
  2. $jscode=file_get_contents("en.js");
  3. preg_match_all("/b\('[^']*'[\s]*,[\s]*'[^']*'\)/i", $jscode, $res);
  4. if(isset($res))
  5. {
  6.         $res[0]=array_values(array_unique ($res[0]));
  7.         ksort($res[0]);
  8.         usort($res[0],function($a,$b){return strlen($b)-strlen($a);});
  9.         $JS =file_get_contents("decoded.js");
  10.         $v8 = new V8Js();
  11.         try
  12.         {
  13.                 $v8->executeString($JS, 'basic.js');
  14.         } catch (V8JsException $e)
  15.         {
  16.                 print_r($e);
  17.                   die();
  18.         }
  19.         foreach( $res[0] as $k => $v){
  20.                 preg_match_all("/'([^']*)'[\s]*,[\s]*'([^']*)'/i", $v, $res1);
  21.                 $JS='b("'.$res1[1][0].'", "'. $res1[2][0] .'");';
  22.                 $vv = $v8->executeString($JS, 'basic.js');
  23.                 $jscode=str_ireplace(array('window['.$v.']',$v),array($vv,"'".$vv."'"),$jscode);
  24.         }
  25. }
  26. echo "ok!";
  27. file_put_contents("src.js",$jscode);
  28. die();
复制代码
4、执行js.php  如下:
php.exe -c php.ini js.php

5、得到解密代码:
  1. (function(c, d) {
  2.         var e = {
  3.                 'RAMoq': '2019年09月12日15:24:29更新',
  4.                 'EaZaN': '这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大'
  5.         };
  6.         c['update'] = e['RAMoq'];
  7.         d['info'] = e['EaZaN'];
  8.         d['feedback'] = '有问题请联系QQ xxxx';
  9. }(window, document));
复制代码
完成解密。

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

举报 使用道具
| 回复

共 0 个关于本帖的回复 最后回复于 2020-3-18 15:44

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精选推荐

  • 抖音直播推流码最新获取方法抖音直播推流码最新获取方法
  • 最新抖音探房视频拍摄教程最新抖音探房视频拍摄教程
  • 网站超级VIP,尊享会员免费下载特权网站超级VIP,尊享会员免费下载特权
  • 微信裂变营销系统重磅上线,助力微信营销!微信裂变营销系统重磅上线,助力微信营销!
  • 五款实用的微信裂变营销软件五款实用的微信裂变营销软件

热门排行

会员推荐
快速回复 返回列表

微信论坛|微信运营|超级VIP|标签云|注册声明|Sitemap|( 浙ICP备14044344号

GMT+8, 2024-12-18 10:16 , Processed in 0.072482 second(s), 37 queries .