blog's People
blog's Issues
编译SQLite fts5中文扩展
项目地址
windows环境编译
环境准备
- 安装cmake
- 安装msys64,执行
pacman -S --needed base-devel mingw-w64-x86_64-toolchain
安装编译工具链 - 安装Git
环境变量
- 添加cmake的bin目录到path环境变量
- 添加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参数加密)
目标网站
某潮流网购社区
目标
获取商品信息
断点调试问题
使用chrome打开devtools工具会不断触发断点
解决办法如图所示,在触发断点行首右键,选择Add Conditional breakpoint,写入false然后回车。即可解决断点不断触发问题
分析网络请求
打开Network视图,经过分析获取数据请求是从
api/v1/h5/index/fire/flow/product/detail这个接口获取的
经过分析发现请求参数对象中有sign字段
猜测是作为数据签名信息一起发送给后台服务用于验证请求的合法性
导出HAR文件
由于暂时不清楚,是由那个js文件发送的请求,以及处理的数据
所以选择下载HAR文件进行全文检索
(HAR,即HTTP存档格式(HTTP Archive format)是一种JSON格式的存档文件格式,用于记录网页浏览器与网站的交互过程。文件扩展名通常为.har)
获取加密方法
下载HAR文件后使用编辑器打开
由于加密参数为sign,所以直接搜索(sign=),(sign:)等给sign字段赋值的字符串
首先排除(sign=),其次排除(sign =)
然后在搜索(sign:)时发现如下代码
向上查找,发现此代码来自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
定位到关键代码
发现加密函数如下
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的其他字段列表
方法的处理流程为
-
遍历参数列表
-
赋值参数列表给t
-
给t拼接048a9c4943398714b356a696503d2d36
-
调用Object(x["a"])(t)
此处的Object(x["a"])(t),可以理解为调用x方法,传入a作为参数,再调用函数的返回值(还是个方法),传入t作为参数进行处理
搜索19e7,找到x方法内容
x方法内容比较复杂,暂时不去理解方法具体过程,只需要弄清楚如何调用即可
调用解密方法
经过分析,入口函数是h函数
h函数处理过程中会调用中间的i,o,r,a等函数
分析完成,开始编写测试
测试
在webstorm中创建nodejs项目
创建sign.js文件,文件内容
执行node sign.js计算sign的值为
和上图Network视图中请求参数的sign的值一致,证明过程没有问题
扩展
加密算法需要理解,最好可以翻译成python或者java代码
爬虫研究分析-请求包含验证参数
爬虫-请求包含验证参数
目标网站
某修改运动步数网站
目的
使用接口发送请求或者自动化
(暂不清楚)
分析网络请求
打开Network视图
找到请求修改步数接口
请求包含sing字段,应该是用作验证请求是否合法
定位加密方法
首先定位到发送请求的JS文件
点击左下角大括号,格式化JS文件
定位到加密方法
解析加密方法
稍微格式化一下加密方法
_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执行命令
发现结果都是字符串,那么猜测_0x4dd058应该是一个object,根据这里的key取对应的方法
同样在console中执行_0x4dd058,结果为未定义
全局检索_0x4dd058 = 寻找在何处进行定义
继续检索_0x260d9f =
至此,已经非常清晰了,再看一遍加密方法
_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')]。得到方法逻辑如图
据此,替换每一层方法,得到化简后的加密方法如下
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字段结果一致
结束
爬虫研究分析-响应结果加密
目标网站
某磁力连接网站
目标
获取如图信息
遇到问题
-
数据是js加载的
-
数据是加密(?)的
那么就需要进行解密
解密数据
格式化代码
关键JS文件是压缩过的,无法进行调试。需要格式化后才可以进行调试
首先找到关键JS文件
点击代码左下角进行格式化
格式化后会生成一个新的JS文件,这个时候刷新页面,在新的JS里面打的断点就会起作用
开始调试
首先查找接口看是否可以获取线索
显然,基本没有什么多余的信息可以获取
那么换一种思路,从接口获取数据到渲染页面一定会有从接口返回数据中读取列表信息的过程
经过查看接口返回值,发现列表信息对应的Key为hits
所以搜索hits(注意搜索时选择不忽略大小写)
如图所示,从请求接口返回值中获取列表数据
只需要关注这一句
l.adapter.data.pushAll(a)
接下来搜索adapter.data
一共7个结果,经过查看除了调用clear()就是调用length。只有这里最可疑
接下来走了一些弯路,我先后去搜索了wt,We,Ue这几个函数,发现这些方法实现的逻辑是构造虚拟dom。渲染页面。没有我关注的解密数据过程
直到我发现这一行代码
原来如此,解密方法写在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
参考文档
配置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,按照如图所示安装
需要注意的是Windows 10 SDK(10.0.19041)需要安装SDK Debugging Tools
可以选择重新下载安装Windows 10 SDK,勾选如图所示
安装完成后查看是否有C:\Program Files (x86)\Windows Kits\10\Debuggers目录存在
安装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
编译 nginx for windows
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 查询和直接在数据库中查询数据不一致
问题定位
- 直接在数据库中查询是将 roleIds 条件直接写在 SQL 中,而在 mybatis plus 中使用的是 ? 占位符方式
- mybaits plus 中占位符方式为防止 SQL 注入,会将内容认为是字符串,添加单引号,如下
SELECT DISTINCT role_id
FROM b1_role_menu
WHERE del_flag = 1
AND role_id IN ('1, 2, 7')
- SQL 查询 IN 条件遇到字符串可能会进行类型转换,将'1,2,7'转为1。导致查询错误
解决方案
- 将 # 替换为 $(如果确认不会有 SQL 注入问题,此解决方案最简单)
- 使用 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
参考链接
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.