JS逆向基础

Posted SuanYunyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS逆向基础相关的知识,希望对你有一定的参考价值。

JS逆向基础


简单记录一下JS逆向用到的一些知识。

一、常见的加密算法及特点

  • MD5: 加密后有16位和32位,以0-9和小写a-f组成。其中16位的就是截取中间的第9至第24位,判断是否以MD5加密,主要看一下两点:是否符合16位或32位,加密后的结果是否是0-9,A-F。
  • AES:对称加密算法,加密和解密用同一个秘钥,密钥长度主要有128位,192位,256位。没法直接通过密文判断是否是AES加密,加密后的结果通过Base64编码,主要可以推断:例如密文长度是否为16的倍数。对于前端来说,可以找到加密源码来判断一下。
  • Base64: 准确来说,Base64是一种编码。以a-z,A-Z,0-9和+/=组成。
  • RSA: 非对称加密,有公钥和私钥两种秘钥。加密后的结果同样是经过Base64编码的。
  • SHA:常见的有SHA1,SHA256,SHA512。组成以0-9和a-f组成。加密后分别为sha1(40位),sha256(64位),sha512(128位)。

二、禁用Debugger的一些方法

主要针对无限Debugger的一些处理方法

1.暴力禁用法:

直接禁用所有断点,这样其实也无法调试了,不推荐。

点击“停用断点”,所有断点都不生效。

2.利用条件断点

在debugger处打上条件断点,置为false,debugger就不执行了

3.中间人工具
  • 利用fidder拦截并改写含有debugger语句的js文件
  • 浏览器自带的Overrides本地覆盖改写JS文件等方式
4.改写函数法

置空含有debugger语句的函数:

控制台进行变量覆盖,重新声明一下函数,直接置空。缺点是刷新页面就失效

还有另外一种方式,直接重置构造器:

Function.prototype.constructor = function()
5.无限Debugger

一打开F12就无限debugger,这时无法调试其他代码,可以通过call stack调用栈层层找到最开始的调用者:

虽然是加密过的,不过不影响,直接重写函数:

这时debugger已经失效了。

小提示:一般无限debugger都会配合定时器无限复活,把setInterval干掉就行。

Python进阶篇:百度指数解密抓包|JS逆向|数据区分

前言

大家好,我是辣条哥~

过往给大家更新了不少基础相关的,今天给大家上点硬货,基础不好的慎入,免得打击你们的积极性~

其次对数据分析|数据可视化|pandas感兴趣的可以来这里刷刷题: →→→《Pandas狂刷120题》←←←

工具准备

开发工具:pycharm
开发环境:python3.7, Windows10
使用工具包:requests

目录

采集目标地址

项目需求分析

需要通过代码来获取到当前网页上的曲线指数数据

这是单独一个点,需要取出所以点的数据信息

项目思路解析

第一步 区分数据类型

我们获取的数据有静态和动态两种,首先区分是静态还是动态数据,在页面鼠标右击点击查看网页源代码,在源代码页面来进行搜索看看我们的数据是否是存在与静态页面上的

可以看到我们的数据并没有在页面上可以得出我们想要的数据为动态数据

第二步 抓包获取数据

动态数据的获取我们需要使用抓包的方式来进行获取,在浏览器页面鼠标右击点击检查,打开我们的抓包工具,点击network,选择xhr选项,xhr为筛选的动态数据,刷新页面,现在展示的就是动态数据

定位到我们想要的数据,要是不太熟练的可以一个个去进行确认看看那个数据是我们想要的,大致可以判断出我们想要的数据是在当前这个请求包里面

但是这个数据比较特殊,怎么看这个数据都不像是我们想获取的坐标点数据,可以由此得出,当前的数据为服务器加载过来的加密json数据,那我们需要考虑的就是如何去找到这个数据的解密位置,一个网页是有html、css、js所组成的,能用来处理数据的只能在js代码里面我们把找到js解密位置的过程就叫做js逆向

第三步 js代码逆向

通过全局来进行搜索定位到我们数据的位置,定位的方式有两种服务器传递的数据为json信息,我们可以直接通过JSON.parse来进行定位,js代码想处理js数据就需要通过这个关键字来转换,再有我们可以通过userIndexes来进行定位,因为前端在取数据的时候一定会根据userIndexes来进行定位

定位到的js文件有两个,感兴趣的可以一个个去进行访问,我们要的数据在第二个文件搜索到我们想要的数据,打上断点在进行解析,看看我们的数据是如何进行处理解密的,可以很直观的看到下方有个decrypt函数大致推断出是我们的解密函数

断点之后重新刷新页面,可以看到解密函数里面传递了两个参数,第二个参数是我们开始抓包得到服务器传递过来的加密数据,第一个参数目前还不是很明确

我们可以去搜索一下第一个传递的参数是什么内容,可以看到我们的数据是另外一个接口请求过来的,第一个参数还需要我们对这个接口再次发送请求

那我们的这个接口如何跟我们前面请求的数据发生关联呢,接口数据请求的网址是根据uniqid来进行获取的


两个参数都明确了,那我们就开始对他的js代码来进行解析,

其实做的事情很简单,根据加密数据的索引来进行重新排列数据,根据索引值,得出最后的曲线上的坐标数据,现在我们需要做的就是把js代码转换成py代码

def decrypt(t, e):
    n = list(t)
    i = list(e)
    a = 
    result = []
    ln = int(len(n) / 2)
    start = n[ln:]
    end = n[:ln]
    for j, k in zip(start, end):
        a.update(k: j)
    for j in e:
        result.append(a.get(j))
    return ''.join(result)

简易代码分享

本篇文章只用于技术分享,切勿用作其他用途!!

import requests
import sys
import time

word_url = 'http://index.baidu.com/api/SearchApi/thumbnail?area=0&word='
headers = 
    'Cipher-Text': '你的数据',
    'Cookie': '你的cookie',
    'Host': 'index.baidu.com',
    'Referer': 'https://index.baidu.com/v2/main/index.html',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36',
    # 'X-Requested-With': 'XMLHttpRequest',



def decrypt(t, e):
    n = list(t)
    i = list(e)
    a = 
    result = []
    ln = int(len(n) / 2)
    start = n[ln:]
    end = n[:ln]
    for j, k in zip(start, end):
        a.update(k: j)
    for j in e:
        result.append(a.get(j))
    return ''.join(result)


def get_ptbk(uniqid):
    url = 'http://index.baidu.com/Interface/ptbk?uniqid='
    resp = requests.get(url.format(uniqid), headers=headers)

    if resp.status_code != 200:
        print('获取uniqid失败')
        sys.exit(1)
    return resp.json().get('data')


def get_index_data(keyword, start='2011-02-10', end='2021-08-16'):
    keyword = str(keyword).replace("'", '"')
    url = f'https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22python%22,%22wordType%22:1%7D]]&days=30'

    resp = requests.get(url, headers=headers)
    print(resp.json())
    content = resp.json()
    data = content.get('data')
    user_indexes = data.get('userIndexes')[0]
    uniqid = data.get('uniqid')
    ptbk = get_ptbk(uniqid)
    all_data = user_indexes.get('all').get('data')
    result = decrypt(ptbk, all_data)
    result = result.split(',')

    print(result)

以上是关于JS逆向基础的主要内容,如果未能解决你的问题,请参考以下文章

JS逆向基础知识

Python进阶篇:百度指数解密抓包|JS逆向|数据区分

Python进阶篇:百度指数解密抓包|JS逆向|数据区分

Python进阶篇:百度指数解密抓包|JS逆向|数据区分

Python进阶篇:百度指数解密抓包|JS逆向|数据区分

Android逆向系列文章— Android基础逆向