web逆向经验

一、JS逆向调试流程

  1. 如果网页有跳转,必须勾选 preservelog 防止丢包
  2. 看一下有没有框架 右键查看框架源代码(弹出式登陆界面)
  3. 登陆尽量使用错误密码 防止跳转
  4. 查看关键登陆包 分析哪些参数是加密的
  5. 使用别的浏览器分析哪些参数是固定的值
  6. 初步猜测加密方法
  7. 搜索,直接搜索参数,例如pwd ,Encrypt,decrypt
  8. 密码框地方右键 检查 查看 id name type
  9. 找到加密的地方(重点)(一般debug)
  10. 找出所有的加密代码
  • 从最后一步开始写起,缺啥找啥
  • 如果找的是函数的话 search 要带上 function xxx
  • 如果看到加密的地方有个类,并且之后是用 prototype 把方法加在原生对象上的话,要把 所有加在原生对象上的方法都找出来
  • 函数找多了没关系,只要不报错不会影响结果,但是不能找少了

二、加密破解

  • 始于前端js对密码加密实现的需要,目前使用最多是AES、RSA、MD5,当然这三个的嵌套和混合使用情况也比较多
  • 发现有加密时,搜索encrypt,JSON.parse,​​JSON.stringify,​​CryptoJS 等相关
  • 关于算法总结:
  1. 对称加密(加密解密密钥相同):DES、DES3、AES
  2. 非对称加密(分公钥私钥):RSA
  3. 信息摘要算法/签名算法:MD5、HMAC、SHA
  4. 前端实际使用中MD5、AES、RSA使用频率是最高的
  5. 几种加密方式配合次序:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,用签名算法生成非对称加密的摘要
  6. DES、DES3、AES、RSA、MD5、SHA、HMAC传入的消息或者密钥都是bytes数据类型,不是bytes数据类型的需要先转换;密钥一般是8的倍数

参考项目

三、有eval语句体的,直接把eval改为console.log,在控制台输出查看

四、补环境

  1. 什么是 “补浏览器环境”
  • 浏览器环境: 是指JS代码在浏览器中的运行时环境,它包括V8自动构建的对象(即ECMAScript的内容,如Date、Array),浏览器(内置)传递给V8的操作DOM和BOM的对象(如document、navigator)
  • Node环境:是基于V8引擎的Js运行时环境,它包括V8与其自己的内置API,如fs,http,path;

Node环境 与 浏览器环境 的异同点可以简单概括如图:
在这里插入图片描述
补浏览器环境” 其实是补浏览器有 而Node没有的环境,即补BOM和DOM的对象

  • 关于bom对象和dom对象:
    在这里插入图片描述
  1. 为什么要 “补浏览器环境”?

对于逆向老手而言,“补环境” 这个词不会陌生,当我们每次把辛辛苦苦扣出来的 “js加密算法代码”,并且放在浏览器环境中能正确执行后,就需要将它放到Node环境 中去执行,而由于Node环境与浏览器环境之间存在差异,会导致部分JS代码在浏览器中运行的结果 与在node中运行得到的结果不一样或者报异常,从而影响我们最终逆向成果;eg:

function decrypt() {
    document = false;
    var flag = document?true:false;
    if (flag) {
        return "正确加密"
    } else {
        return "错误加密";
    }
}

在浏览器环境运行时 flag为true,然后得到正常结果;
在Node环境运行时 flag为false,然后得到错误结果;

所以我们需要 “补浏览器环境”,使得扣出来的 “js加密算法代码” 在Node环境中运行得到的加密值,与其在 浏览器环境中运行得到的加密值一致。 即对于这段 “js加密算法代码” 而言,我们补出来的环境与浏览器环境一致。

  1. 怎么 “补浏览器环境”?

要想 “补浏览器环境”,首先我们得知道 “js加密算法代码” 到底使用了哪些浏览器环境API,然后再对应去补上这些环境
那么我们该如何监测 “js加密算法代码” 对浏览器环境API的使用呢?毫无争议:使用Proxy来监测浏览器环境API的使用,辅助补浏览器环境

Proxy是ES6提供的代理器,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。它可以代理任何类型的对象,包括原生数组,函数,甚至另一个代理;拥有递归套娃的能力

也就是说我们代理某个对象后,我们就成了它的中间商,任何JS代码对它的任何操作都可以被我们所拦截

  1. 基于Proxy的特性,衍生了两种补环境思路:
  • 递归嵌套Proxy以此来代理浏览器所有的BOM、DOM对象及其属性,再配合node vm2模块提供的纯净V8环境,就相当于在node中,对整个浏览器环境对象进行了代理,JS代码使用任何浏览器环境 api都能被我们所拦截。然后我们针对拦截到的环境检测点去补。
  • 搭建补环境框架,用JS模拟浏览器基于原型链去伪造实现各个BOM、DOM对象,然后将这些JS组织起来,形成一个纯JS丐版浏览器环境,我们补的纯JS丐版浏览器环境越完善,就越接近真实浏览器环境,能通杀的js环境检测就越多。最终完美通杀所有JS环境检测
  • 第一种思路虽然实现简单,主要是对Proxy拦截器的使用,但是具备的环境监测能力有限,对较复杂的原型链等难以监测,即使是二次开发也上限不高;并且遇到JS使用了很多环境时手补也相当麻烦;
  • 第二种思路虽然实现较为复杂,但是上限极高,且可以完美兼容第一种思路,具备可成长的通杀潜质。

所以业内补环境框架几乎都是基于第二种思路,先搭建一个补环境框架的骨架,将常见浏览器环境BOM、DOM对象补齐,如:window、location、Document、navigator等,等空闲时或工作遇到其他浏览器环境BOM、DOM对象,再将它补进来。补的越完善,我们能通杀JS环境检测越多。

  • 优点:
  • 补的越完善,能通杀JS环境检测越多。
  • 一键运行输出目标JS中所有环境检测点;
  • 生成的最终代码可直接用于生产环境(可直接供nodejs、v8使用); 告别玄学补环境,不再一行行去debugger,极大提高工作效率。
  • 可以在Chrome浏览器进行无浏览器环境调试。
  1. 常见的补环境方式
  • window is not defined;

修改为: window = global或者,var window = {}

  1. ASN1 is not define
尝试window = global
  1. navigator is not defined

修改为: var navigator = {}

  1. Cannot read property ‘userAgent’ of undefined

navigator.userAgent = ‘xxxx’

  1. Cannot read property ‘body’ of undefined:

这个是 document里面的。

修改为:document.body = {xxx(具体的某个参数)}

  1. Cannot read property ‘x’ of undefined

缺少函数,具体缺少什么,可根据调试来添加。

  1. Cannot read property ‘href’ of undefined
是 location.href
修改为:
window.location = {
"xxxx": {},
"href": "https://www.xxxx.com/",
(其他参数保持)
}
  1. Cannot read property ‘length’ of undefined
具体原因是取值的时候,取到的是null。。。

具体调试可得知。
  1. Cannot read property ‘cookie’ of undefined
var document = {
cookie:"xxxxxx"
}
  1. Object.getOwnPropertyDescriptor
var Navigator = function() {};
Navigator.prototype = {"platform": "win32"};
navigator = new Navigator();

在这里插入图片描述

  1. 补齐window.localStorage:
window.localStorage = {
    removeItem: function (key) {
        delete this[key]
    },
    getItem: function (key) {
        return this[key] ? this[key]: null;
    },
    setItem: function (key, value) {
        this[key] = "" + value;  // 将数字转为字符串
    },
};
  1. .document补齐
location = {
    "href": "https://www.w3school.com.cn/jsref/prop_anchor_href.asp",
    "origin": "https://www.w3school.com.cn",
    "protocol": "https:",
}
document = {
    createElement: function () {
        var loc = {
            href: ""
        };
        var temp_href = loc.href;
        Object.defineProperty(loc, 'href', {
            // Hook loc.href,当为其赋值时,按下面的规则强制改变
            get: function () {
                return temp_href
            },
            set: function (val) {
                if (val.indexOf('http://') === 0 || val.indexOf('https://') === 0) {
                    // 1.当值为http://或https://开头时,即为该值
                    temp_href = val;
                } else if (val.indexOf('//') === 0) {
                    // 2.当值为//开头时,即为location.protocol加上该值
                    temp_href = location.protocol + val;
                } else if (val.indexOf('/') === 0) {
                    // 3.当值为/开头时,即为location.origin加上该值
                    temp_href = location.origin + val;
                } else {
                    // 4.除以上3种情况,即为location.href中最后一个/之前的值加上该值
                    var s = location.href
                    temp_href = s.substring(0, s.lastIndexOf("/")+1) + val
                }
                return temp_href
            }
        });
        return loc;
    }
}

五、控制流平坦化

将顺序执行的代码混淆成乱序执行,并加以混淆,以下两段代码的执行结果是相同的

// 正常形态
function test(a){
  var b = a;
  b += 1;
  b += 2;
  b += 3;
  b += 4;
  return a + b
}
 
// 乱序形态
//(这里比较简单,在很多加密网站上case 后面往往不是数字或字符串,而是类似 YFp[15][45][4]这样的对象,相当恶心)
function test1(a){
  var arr = [1,2,3,4,5,6]
  for(var i = 0, i < arr.lenght, i++){
    switch (arr[i]) {
      case 4:
        b += 3;
        break;
      case 2:
        b += 1;
      break;
      case 1:
        var b = a;
      break;
     case 3:
        b += 2;
      break;
      case 6:
        return a + b
      case 5:
        b += 4;
      break;
    }
  }
}
// 结果都是30 但是test1看着费劲
console.log(test1(10));
console.log(test(10));

六、去除无限debug

//去除无限debugger
Function.prototype.__constructor_back = Function.prototype.constructor;
Function.prototype.constructor = function() {
    if(arguments && typeof arguments[0]==='string'){
        //alert("new function: "+ arguments[0]);
        if("debugger" === arguments[0]){
            //arguments[0]="console.log(\"anti debugger\");";
            //arguments[0]=";";
            return
        }
    }
   return Function.prototype.__constructor_back.apply(this,arguments);
}

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/265832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】从JDK 8迁移到JDK后续版本

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

MySQL 事务的ACID特性

MySQL事务是什么&#xff0c;它就是一组数据库的操作&#xff0c;是访问数据库的程序单元&#xff0c;事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道&#xff0c;在MySQL 中&#xff0c;有不同的存储引擎&#xff0c;有的存储引擎比如…

凸优化 2:如何判定凸函数?

凸优化 2&#xff1a;如何判定凸函数&#xff1f; 如何判断一个目标函数是凸函数&#xff1f;如果是凸函数&#xff0c;那ta的定义域是凸集合 一个函数求俩次梯度&#xff0c;大于等于0&#xff0c;那这个函数就是一个凸函数在同样条件下&#xff0c;怎么设计为凸函数模型&…

使用 Elasticsearch 检测抄袭 (二)

我在在之前的文章 “使用 Elasticsearch 检测抄袭 &#xff08;一&#xff09;” 介绍了如何检文章抄袭。这个在许多的实际使用中非常有意义。我在 CSDN 上的文章也经常被人引用或者抄袭。有的人甚至也不用指明出处。这对文章的作者来说是很不公平的。文章介绍的内容针对很多的…

【星海出品】Keepalived 使用基础案例 (二)

keepalived 使用 [rootmaster ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs { //全局配置notification_email { //定义报警收件人邮件地址acassenfirewall.locfailoverfirewall.locsysadminfirewall.loc}notification_…

ECMAScript基础入门:从语法到应用

在此之前我以及发布过关于JavaScript基础知识点大家也可以参考 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注…

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值&#xff0c;对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

机场信息集成系统系列介绍(6):机场协同决策支持系统ACDM

目录 一、背景介绍 1、机场协同决策支持系统是什么&#xff1f; 2、发展历程 3、机场协同决策参与方 4、相关定义 二、机场协同决策ACDM的建设目标 &#xff08;一&#xff09;机场协同决策支持系统的宏观目标 1、实现运行数据共享和前序航班信息透明化 2、实现地面资源…

Linux常用基本命令(三)

一、显示命令 1. cat 通式&#xff1a;cat 选项 文件名 只能看普通的文本文件 缺点&#xff1a;如果内容过多会显示不全 选项效果-n显示行号包括空行-b跳过空白行编号-s讲所有的连续的多个空行替换为一个空行&#xff08;压缩成一个空行&#xff09;-A显示隐藏字符 三个标准文件…

十四、W5100S/W5500+RP2040之MicroPython开发<MQTTThingSpeak示例>

文章目录 1. 前言2. 平台操作流程3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发…

使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错问题

目录 1、问题说明 2、问题分析思路 3、问题分析过程 3.1、使用Dependency Walker打开软件主程序&#xff0c;查看库与库的依赖关系&#xff0c;查看出问题的库 3.2、使用PE工具查看dll库的时间戳 3.3、解决办法 4、最后 VC常用功能开发汇总&#xff08;专栏文章列表&…

【数据结构】线性表

一.线性表 1.定义&#xff1a; n个同类型数据元素的有限序列&#xff0c;记为 L为表名&#xff0c;i为数据元素在线性表中的位序&#xff0c;n为线性表的表长&#xff0c;n0时称为空表。 2.数据元素之间的关系&#xff1a; 直接前驱和直接后继 3.抽象数据类型线性表的定义…

PADS Layout安全间距检查报错

问题&#xff1a; 在Pads Layout完成layout后&#xff0c;进行工具-验证设计安全间距检查时&#xff0c;差分对BAK_FIXCLK_100M_P / BAK_FIXCLK_100M_N的安全间距检查报错&#xff0c;最小为3.94mil&#xff0c;但是应该大于等于5mil&#xff1b;如下两张图&#xff1a; 检查&…

SpringBoot的配置高级

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【JMeter】使用内网负载机(Linux)执行JMeter性能测试

一、背景 ​ 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试&#xff0c;一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢&#xff1f; 遇到公网环境下性能测试达到了带宽瓶颈。那么这时&#xff0c;我们就需要考虑在内网环境负载机下来执行我们…

使用C语言将ASCII明文编码为GSM短信体格式

一、背景介绍 GSM&#xff08;Global System for Mobile Communications&#xff09;是全球移动通信系统的简称&#xff0c;而GSM 03.38是GSM系统中用于短信编码的标准。GSM 03.38字符集采用7-bit编码&#xff0c;与ASCII的8-bit编码有所不同。为了将ASCII编码的文本转换为GSM…

【JavaWeb学习笔记】13 - JSP浏览器渲染技术

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jsp JSP 一、JSP引入 1.JSP现状 1.目前主流的技术是前后端分离(比如: Spring Boot Vue/React),我们会讲的.[看一下] 2. JSP技术使用在逐渐减少&#xff0c;但使用少和没有使用是两个意思&#xff…

DB207S-ASEMI迷你贴片整流桥DB207S

编辑&#xff1a;ll DB207S-ASEMI迷你贴片整流桥DB207S 型号&#xff1a;DB207S 品牌&#xff1a;ASEMI 封装&#xff1a;DBS-4 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 产品引线数量&#xff1a;4 产品内部芯片个数&#xff1a;4 产品…

Spring security之授权

前言 本篇为大家带来Spring security的授权&#xff0c;首先要理解一些概念&#xff0c;有关于&#xff1a;权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型&#xff1a; 基于角色的授权&…

2024最新苹果手机APP软件下架了,怎么安装?

如果你是一个iPhone用户&#xff0c;你可能会遇到这样的情况&#xff1a;你想下载或更新一个软件&#xff0c;但发现它已经从APP Store上消失了。这可能是因为软件违反了苹果的规则&#xff0c;或者开发者主动撤下了软件。那么&#xff0c;这种情况下&#xff0c;你还能安装或使…