Git Product home page Git Product logo

blog's People

Contributors

ggymm avatar

Watchers

 avatar  avatar

blog's Issues

编译SQLite fts5中文扩展

项目地址

simple

windows环境编译

环境准备

  1. 安装cmake
  2. 安装msys64,执行 pacman -S --needed base-devel mingw-w64-x86_64-toolchain 安装编译工具链
  3. 安装Git

环境变量

  1. 添加cmake的bin目录到path环境变量
  2. 添加msys64目录下,mingw64的bin目录到path环境变量

编译安装

:: 设置代理
set http_proxy=http://127.0.0.1:9910
set https_proxy=http://127.0.0.1:9910

:: 创建编译目录
mkdir build && cd build

:: 执行cmake
cmake .. -G "Unix Makefiles" -DSIMPLE_WITH_JIEBA=OFF -DCMAKE_INSTALL_PREFIX=release

:: 编译安装
make && make install

爬虫研究分析-请求包含验证参数

爬虫(Request参数加密)

目标网站

某潮流网购社区

目标

获取商品信息

image

断点调试问题

使用chrome打开devtools工具会不断触发断点

解决办法如图所示,在触发断点行首右键,选择Add Conditional breakpoint,写入false然后回车。即可解决断点不断触发问题

image_1

分析网络请求

打开Network视图,经过分析获取数据请求是从

api/v1/h5/index/fire/flow/product/detail这个接口获取的

经过分析发现请求参数对象中有sign字段

猜测是作为数据签名信息一起发送给后台服务用于验证请求的合法性

image_2

导出HAR文件

由于暂时不清楚,是由那个js文件发送的请求,以及处理的数据

所以选择下载HAR文件进行全文检索

(HAR,即HTTP存档格式(HTTP Archive format)是一种JSON格式的存档文件格式,用于记录网页浏览器与网站的交互过程。文件扩展名通常为.har)

image_3

获取加密方法

下载HAR文件后使用编辑器打开

由于加密参数为sign,所以直接搜索(sign=),(sign:)等给sign字段赋值的字符串

首先排除(sign=),其次排除(sign =)

然后在搜索(sign:)时发现如下代码

image_4

向上查找,发现此代码来自static/js/index.a0a63867.js文件

导出此js文件或者直接从HAR文件中复制此js文件内容保存为index.js

由于此文件被压缩过,所以需要格式化一下进行查看

npm install js-beautify -g

js-beautify -f index.js -o index.beautify.js

使用编辑器打开index.beautify.js

定位到关键代码

image_5

发现加密函数如下

x = n("19e7"),
_ = function() {
    var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
        t = "",
        n = function(e) {
            if (null === e) return "";
            if (e instanceof Array) {
                var t = "";
                return e.forEach((function(e) {
                    t.length > 0 && (t += ","), t += JSON.stringify(e)
                })), t
            }
            return e instanceof Object ? JSON.stringify(e) : e.toString()
        };
    return t = Object.keys(e).sort().reduce((function(t, i) {
        return void 0 === e[i] ? t : "".concat(t).concat(i).concat(n(e[i]))
    }), ""), t += "048a9c4943398714b356a696503d2d36", Object(x["a"])(t)
},

方法的参数就是请求接口中除了sign的其他字段列表

方法的处理流程为

  1. 遍历参数列表

  2. 赋值参数列表给t

  3. 给t拼接048a9c4943398714b356a696503d2d36

  4. 调用Object(x["a"])(t)

此处的Object(x["a"])(t),可以理解为调用x方法,传入a作为参数,再调用函数的返回值(还是个方法),传入t作为参数进行处理

搜索19e7,找到x方法内容

x方法内容比较复杂,暂时不去理解方法具体过程,只需要弄清楚如何调用即可

调用解密方法

image_6

经过分析,入口函数是h函数

h函数处理过程中会调用中间的i,o,r,a等函数

分析完成,开始编写测试

测试

在webstorm中创建nodejs项目

创建sign.js文件,文件内容

执行node sign.js计算sign的值为

image_7

和上图Network视图中请求参数的sign的值一致,证明过程没有问题

扩展

加密算法需要理解,最好可以翻译成python或者java代码

爬虫研究分析-请求包含验证参数

爬虫-请求包含验证参数

目标网站

某修改运动步数网站

目的

使用接口发送请求或者自动化

(暂不清楚)

分析网络请求

打开Network视图

找到请求修改步数接口

image

请求包含sing字段,应该是用作验证请求是否合法

定位加密方法

首先定位到发送请求的JS文件

image_1

点击左下角大括号,格式化JS文件

image_2

定位到加密方法

image_3

解析加密方法

稍微格式化一下加密方法

_0x4dd058[_0x3122('0xb1')](
  md5,
  _0x4dd058[_0x3122('0xf3')](
    _0x4dd058[_0x3122('0x37')](
      String(_0x4dd058[_0x3122('0x94')](_0x4dd058[_0x3122('0x3e')](parseInt, _0x136350, '10'), 0x16)) +
      _0x4dd058[_0x3122('0xb1')](String, _0x3f5e81) +
      String(_0x5c2e93),
      _0x4dd058[_0x3122('0x77')](String, _0x4dd058[_0x3122('0x64')](_0x5ea5ce, 0x3e8))
    ),
    _0x4dd058['Eygbd']
  )
)

经过分析,首先要确认如下变量

_0x3122('0xb1')
_0x3122('0xf3')
...

在console执行命令

image_4

发现结果都是字符串,那么猜测_0x4dd058应该是一个object,根据这里的key取对应的方法

同样在console中执行_0x4dd058,结果为未定义

全局检索_0x4dd058 = 寻找在何处进行定义

image_5

继续检索_0x260d9f =

image_6

至此,已经非常清晰了,再看一遍加密方法

_0x4dd058[_0x3122('0xb1')](
  md5,
  _0x4dd058[_0x3122('0xf3')](
    _0x4dd058[_0x3122('0x37')](
      String(_0x4dd058[_0x3122('0x94')](_0x4dd058[_0x3122('0x3e')](parseInt, _0x136350, '10'), 0x16)) +
      _0x4dd058[_0x3122('0xb1')](String, _0x3f5e81) +
      String(_0x5c2e93),
      _0x4dd058[_0x3122('0x77')](String, _0x4dd058[_0x3122('0x64')](_0x5ea5ce, 0x3e8))
    ),
    _0x4dd058['Eygbd']
  )
)

将_0x4dd058替换为_0x260d9f进行检索即可得到每一层的方法逻辑

例如

从最外层方法_0x4dd058[_0x3122('0xb1')]替换为_0x260d9f[_0x3122('0xb1')]。得到方法逻辑如图

image_7

据此,替换每一层方法,得到化简后的加密方法如下

const account = "账号"
const password = "密码"
const step = "步数"
const time = Date["parse"](new Date())
md5(String(parseInt(account, 10) + 0x16) + String(password) + String(step) + String(time / 0x3e8) + "422")

测试

输入如下信息后发送请求

账号:18888888888

密码:18888888888

步数:999999

查看Network面板得到

时间戳:1628655276

sing:5eba2de213710d18d51e22db732b0674

构造加密函数

md5(String(parseInt("18888888888", 10) + 0x16) + String("18888888888") + String("999999") + String(1628655276000 / 0x3e8) + "422")

在浏览器console面板中计算结果和sing字段结果一致

image_8

结束

爬虫研究分析-响应结果加密

目标网站

某磁力连接网站

目标

获取如图信息

image

遇到问题

  1. 数据是js加载的

  2. 数据是加密(?)的

image_1

那么就需要进行解密

解密数据

格式化代码

关键JS文件是压缩过的,无法进行调试。需要格式化后才可以进行调试

首先找到关键JS文件

image_2

点击代码左下角进行格式化

格式化后会生成一个新的JS文件,这个时候刷新页面,在新的JS里面打的断点就会起作用

开始调试

首先查找接口看是否可以获取线索

image_3

显然,基本没有什么多余的信息可以获取

那么换一种思路,从接口获取数据到渲染页面一定会有从接口返回数据中读取列表信息的过程

image_4

经过查看接口返回值,发现列表信息对应的Key为hits

所以搜索hits(注意搜索时选择不忽略大小写)

image_5

如图所示,从请求接口返回值中获取列表数据

只需要关注这一句

l.adapter.data.pushAll(a)

接下来搜索adapter.data

image_6

一共7个结果,经过查看除了调用clear()就是调用length。只有这里最可疑

接下来走了一些弯路,我先后去搜索了wt,We,Ue这几个函数,发现这些方法实现的逻辑是构造虚拟dom。渲染页面。没有我关注的解密数据过程

直到我发现这一行代码

image_7

原来如此,解密方法写在String的原型中,最后搜索到解密方法如下

String.prototype.decrypt = function() {
    var e = this.valueOf();
    if (0 < this.length) {
        for (var t = [], n = 0; n < e.length; n++)
            t[n] = 202033 ^ e.charCodeAt(n);
        e = String.fromCharCode.apply(null, t)
    }
    return e
}

python版本

if __name__ == '__main__':
    s = "誨曑嬲誨曑䑙菷"
    t = ''
    for c in s:
        t += chr((202033 ^ ord(c)) % 65536)
    print(t)

 # 输出结果
 # 龙珠(七龙珠)全集 

结语

最后分析的结果并没有用上

编译Chromium

参考文档

在Windows检查和构建文档

配置Git代理

编辑C:\Users\19679.gitconfig文件

添加如下内容

[http "https://github.com"]
    proxy = socks5://127.0.0.1:9909
		
[http "https://chromium.googlesource.com"]
    proxy = socks5://127.0.0.1:9909

Visual Studio环境准备

下载安装Visual Studio 2019,按照如图所示安装

image

需要注意的是Windows 10 SDK(10.0.19041)需要安装SDK Debugging Tools

可以选择重新下载安装Windows 10 SDK,勾选如图所示

image

安装完成后查看是否有C:\Program Files (x86)\Windows Kits\10\Debuggers目录存在

安装depot_tools

下载depot_tools

解压到D:\Code\chromium\depot_tools目录下

配置环境变量

添加:D:\Code\chromium\depot_tools到系统环境变量Path中,并使其位置最前

添加环境变量:DEPOT_TOOLS_WIN_TOOLCHAIN=0,使用本地已经安装的Visual Studio

添加环境变量:vs2019_install=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community,最好不要修改默认地址

初始化depot_tools

执行命令,安装更新python,cipd等工具

gclient

下载代码

设置代理

set http_proxy=http://127.0.0.1:9910
set https_proxy=http://127.0.0.1:9910

创建目录并下载chromium代码

mkdir chromium && cd chromium
fetch --no-history chromium

此过程使用git下载代码库中的代码,执行时间比较漫长,需要耐心等待

构建代码

下载代码之后会在chromium目录下创建src目录,进入到src目录执行下面操作

生成编译配置

gn gen out/Default

编译代码

autoninja -C out\Default chrome

Java 查询数据库 使用占位符和IN条件下 查询数据错误问题

问题描述

问题 SQL

SELECT DISTINCT router_name
        FROM b${businessId} _menu menu
                 INNER JOIN (SELECT DISTINCT menu_id
                             FROM b${businessId} _role_menu role_menu
                             WHERE del_flag = 1
                               AND role_id IN (#{roleIds})) role_menu ON (role_menu.menu_id = menu.menu_id)
        WHERE menu.del_flag = 1
          AND router_name IS NOT NULL
          AND menu_type in ('Button', 'Fragment')

问题描述

使用 mybatis plus 查询和直接在数据库中查询数据不一致

问题定位

  1. 直接在数据库中查询是将 roleIds 条件直接写在 SQL 中,而在 mybatis plus 中使用的是 ? 占位符方式
  2. mybaits plus 中占位符方式为防止 SQL 注入,会将内容认为是字符串,添加单引号,如下
SELECT DISTINCT role_id
        FROM b1_role_menu
        WHERE del_flag = 1
          AND role_id IN ('1, 2, 7')
  1. SQL 查询 IN 条件遇到字符串可能会进行类型转换,将'1,2,7'转为1。导致查询错误

解决方案

  1. 将 # 替换为 $(如果确认不会有 SQL 注入问题,此解决方案最简单)
  2. 使用 FIND_IN_SET 函数修改 SQL 为
SELECT DISTINCT role_id
        FROM b1_role_menu
        WHERE del_flag = 1
          AND FIND_IN_SET(role_id, '1,2,7') > 0

参考链接

mybatis 中 #{} 和 ${} 的区别

解决SQL查询,in条件参数为带逗号的字符串而导致查询结果错误

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.