您现在的位置是:首页 > 正文

JS逆向混淆加密参数分析,反调试分析

2024-01-30 21:23:40阅读 4

闲逛github看到issues别人发的一个网站,网址:aHR0cCUzQS8veXMuZmdqLnRhaXl1YW4uZ292LmNuL0ZpcnN0aGFuZC90eWZjL3B1Ymxpc2gvcC9Qcm9qZWN0TGlzdC5kbw==
随便勾选菜单查询,上抓包 如下图requestbody
在这里插入图片描述
分析一下requestbody的生成过程,老规矩F12
在这里插入图片描述
在这里插入图片描述
匿名函数的无限debugger,直接删掉debugger代码即可,有2个debugger暗桩。分析下把2个都干掉,然后替换JS文件即可

在这里插入图片描述
在这里插入图片描述
查询下断到这儿 看到了熟悉的CryptoJS.AES.encrypt,以为本次分析就此结束了。但是简单枯燥的生活,还是来扣一下整个JS吧
扣JS把CryptoJS整个类扣取出来即可 直接搜AES的定义可以快速定位,AES的16进制字符为’\x41\x45\x53’
在这里插入图片描述
扣取的过程中会发现一个内存溢出RangeError: Maximum call stack size exceeded
在这里插入图片描述
提取出来,分析一下这段代码

var _0x3b5fab = function () {
    var _0x142e66 = !![];
    return function (_0xb9d633, _0x7fe927) {
        var _0x2bc370 = _0x142e66 ? function () {
            if (_0x7fe927) {
                var _0x42c9f5 = _0x7fe927['apply'](_0xb9d633, arguments);
                _0x7fe927 = null;
                return _0x42c9f5;
            }
        }
            : function () { }
            ;
        _0x142e66 = ![];
        return _0x2bc370;
    }
        ;
}();
var _0x2da5d7 = _0x3b5fab(this, function () {
    var _0x15430c = function () {
        return '\x64\x65\x76';
    }
        , _0x439f7e = function () {
            return '\x77\x69\x6e\x64\x6f\x77';
        };
    var _0x56e3d2 = function () {
        var _0x4f3652 = new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');
        return !_0x4f3652['\x74\x65\x73\x74'](_0x15430c['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
    };
    var _0x27b501 = function () {
        var _0x57a526 = new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');
        return _0x57a526['\x74\x65\x73\x74'](_0x439f7e['\x74\x6f\x53\x74\x72\x69\x6e\x67']());
    };
    var _0x574716 = function (_0x14e333) {
        var _0x16e1a5 = ~-0x1 >> 0x1 + 0xff % 0x0;
        if (_0x14e333['\x69\x6e\x64\x65\x78\x4f\x66']('\x69' === _0x16e1a5)) {
            _0x5f28c6(_0x14e333);
        }
    };
    var _0x5f28c6 = function (_0x2e24f4) {
        var _0xc07f1b = ~-0x4 >> 0x1 + 0xff % 0x0;
        if (_0x2e24f4['\x69\x6e\x64\x65\x78\x4f\x66']((!![] + '')[0x3]) !== _0xc07f1b) {
            _0x574716(_0x2e24f4);
        }
    };
    if (!_0x56e3d2()) {
        if (!_0x27b501()) {
            _0x574716('\x69\x6e\x64\u0435\x78\x4f\x66');
        } else {
            _0x574716('\x69\x6e\x64\x65\x78\x4f\x66');
        }
    } else {
        _0x574716('\x69\x6e\x64\u0435\x78\x4f\x66');
    }
});
_0x2da5d7();

!_0x56e3d2()为假是就会进入_0x574716 和_0x5f28c6 死循环中,导致堆栈溢出
_0x56e3d2函数,正则_0x15430c是否匹配

        var _0x4f3652 = new RegExp('\w+ *\(\) *{\w+ *['|"].+['|"];? *}');
        return !_0x4f3652.test(_0x15430c.toString());

通过判断函数是否格式化来判定代码是否在调试状态,因为很多格式化工具会添加换行等,原生态环境中_0x15430c 应该为

var _0x15430c=function(){return '\x64\x65\x76';}

格式化后代码:

var _0x15430c = function () { 
	return '\x64\x65\x76'; 
}

熟悉了套路,直接删掉此段代码即可,后面扣除代码即可。AES的key动态,主要代码如下

var parm="PerYear=&PerFlowNO=&PerType=0&ProType=1&ProName=&OrgName=&HouseType=0&Region=0&ProAddress=&pageNo=1&pageSize=15TAIL";

var _0x56924a=xhs_0x3daa52(0x8);
var _0x2da736=crc32(_0x56924a);
while (_0x2da736[xhs__0x8016('0xf4')](0x0) == '\x2d' || _0x7a0d75['\x53\x4d\x5a\x79\x4d'](_0x7a0d75['\x6e\x63\x63\x4f\x4c'](_0x56924a['\x63\x68\x61\x72\x41\x74'](0x0), 0x2), 0x1)) {
    _0x56924a = xhs_0x3daa52(0x8);
    _0x2da736 = crc32(_0x56924a);
}
_0x56924a+=_0x2da736;
var _0x227f6e = this.CryptoJS.enc['\x55\x74\x66\x38']['parse'](_0x56924a);
var result= _0x7a0d75[xhs__0x8016('0x1a7')](_0x56924a,this.CryptoJS.AES.encrypt(parm, _0x227f6e, {
    '\x6d\x6f\x64\x65': this.CryptoJS[xhs__0x8016('0xda')][xhs__0x8016('0xdb')],
    '\x70\x61\x64\x64\x69\x6e\x67': this.CryptoJS['\x70\x61\x64'][xhs__0x8016('0xdd')]
}));
console.log(result);

在这里插入图片描述
本文仅作为技术讨论与分享,严禁用于非法用途,不接单,打发枯燥生活,欢迎提供素材:321481996@qq.com

网站文章

  • 实现每日早安推送

    实现每日早安推送

    做一个程序员给女朋友的浪漫礼物吧,微信推送每日早安。

    2024-01-30 21:23:10
  • Linux环境下使用阿里云盘 热门推荐

    Linux环境下使用阿里云盘 热门推荐

    一直有个直播推流的想法,那就是把阿里云盘上的视频资源,在不下载到本地的情况下放在服务器上直播推流,这个时候就需要阿里云盘能能支持Linux环境下使用了。 目前阿里云盘官方还没有推出Linux环境下的版...

    2024-01-30 21:23:03
  • 软件测试常用的oracle语句,Oracle 一些常用的语句记录

    1、oracle数据库锁表查询:select db.object_name,sess.sid,sess.serial#,sess.module,sess.action ,'alter system k...

    2024-01-30 21:22:54
  • 本科阶段的一点总结

    先一点随笔大学转眼过去三年,这几年参加了各种比赛,硬件和软件也都做了一些,也靠这些和还算过得去的成绩拿到了保研名额,不过因为一些原因选择留在了本校直接攻读phd。。。 以后应该是学术向+技术向了,所以在这里开个坑,也算是对自己以后的学习的一个记录吧,主攻的方向该是机器学习和人工智能。 之后的博客也主要在这些方向上更新一些博文,或者有一些比较新颖的想法也会放上来和大家交流,决定读phd后感觉自己的

    2024-01-30 21:22:18
  • 【杂谈】网络修复杂谈

    前言断网,是仅次于断水、断电的危机,对于部分依赖于网络的人来说,可能重要性更加突出。这里主要谈一谈网络修复的方法与一些常见的故障。正题首先要知道怎么修复网络,就需要大致了解网络的运作方式,正如一个能够装机的人要会拆机、能够做网络防御的人要懂得网络攻击的原理。这里主要通过对几个名词的解析来大致描述网络的运作方式。由于这里只打算大致讲一下网络的工作方式,过多的说明可能比不上形象的比喻。

    2024-01-30 21:22:09
  • Linux与Windows共享文件、互传文件

    Linux与Windows共享文件、互传文件

    1.设置共享目录通过虚拟机,把一个windows目录共享,让linux可以访问这个目录2.复制文件夹

    2024-01-30 21:22:02
  • MySQL 事务

    在数据修改之前结果就可以被其他事务查看,不可以解决任何问题。

    2024-01-30 21:21:35
  • android后台如何获取客户端传来的值,Android:使用OkHttp框架与后台通讯、获取数据...

    android后台如何获取客户端传来的值,Android:使用OkHttp框架与后台通讯、获取数据...

    摘要:本文介绍了Android应用如何与服务器通讯的一些机制,并分享了笔者的一些开发经验与技巧,经过具体的代码描述OkHttp框架的使用,适合初学者。前端对于初学者来讲,先后端一手抓很常见,若是你想要...

    2024-01-30 21:21:16
  • 计算机主机板开机原理与维修,主机板损坏电脑会出现什么现象

    计算机主机板开机原理与维修,主机板损坏电脑会出现什么现象

    主机板损坏电脑会出现什么现象以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!主机板损坏电脑会出现什么现象音效卡坏了不造成开...

    2024-01-30 21:21:08
  • Android 平滑和立体翻页效果2

    Android 平滑和立体翻页效果2

    http://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt2/Android launcher 的平滑和立体翻页效果我们这里把 Android launcher 程序的 Workspace 相关的代码抽取出来,以一个比较简单的代码来展示 launcher 程序是如何实现多页以及不同页面之间的切换效果。本示例代

    2024-01-30 21:20:40