https://bbs.125.la/forum.php?mod ... 14664021&extra=
老鸟绕道。文中如有错误,麻烦指出
大概看了下,这个算法,
浏览器加载完这个 js 后,会执行一个初始化操作
这个初始化,包括申请一块很长的内存堆(这就是为什么会boom 的缘故)
0x1 瞎J8搜索定位法
在 Sources 处 ctrl + shift + f 搜索 password ,来到这里,下个断点,再点登录跑一次
断下来之后,F9 跟进去
来到这里:
继续 F9 进去:
根据传入的字符串型函数名,动态调用加密函数
妈妈咪啊,再一步步跟进去...
我们注意上面这个stringToUTF8 函数
function stringToUTF8(str, outPtr, maxBytesToWrite) {
return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
}
此处很熟悉的几个单词 Ptr 、HEAP ,像是在内存堆里面搞事情...
0x2 使劲扣就行
跟到这里,我们看到这个看到这个文件:2.20200901.js
大概看了下,这个文件几乎都是和加密有关的。
二话不说,ctrl + a 然后 ctrl + c
有一点需要注意,arraybuffer 是在 ES6 标准中才增加的,这是用来表示一段固定的二进制,所以我们得用 V8 来执行它(如果你非要杠的话,时间大把的话,也可以把他转换一下)
下图这些方法,也是和上面那个吊毛一起加进去的。
好了,来加载运行它:
上面跟出来是调用 ccall('strEncrypt','string',['string'],['aaaaaaaaaaa,1611826834']) 来执行加密的,现在,我们也来调用它
提示 189 行, console 是个黑户,找不到,删!!!
最终189和190行变成:
var out = Module["print"];
var err = Module["printErr"];
再跑起来。。。。
提示 window 没有定义,先来个空对象,加进去,
var window = {}
再跑起来.....
提示 document 没定义。不着急
我们来看这两行代码
if (ENVIRONMENT_IS_WORKER) {
scriptDirectory = self.location.href
} else if (document.currentScript) {
scriptDirectory = document.currentScript.src
}
这不就是获取一些文档的信息吗? 通过 搜索 scriptDirectory 关键词,搞清楚了它是想加载一些文件,oh,,,shit,
先删为敬!
整条 if 语句都删。。。。
最终变成
再跑起来:
提示 host 读不到,我们知道,host 是 window 的孙子,location 的儿子。。。
回到上面 ,var window = {} 再改下,我们需要把 host 写进去
变成:
再跑起来:
是这样的吗?我们来验证一下:
ccall('strEncrypt','string',['string'],['aaaaaaaaaaa,1611826834'])
浏览器断点:"UhJOMQ2GS02sUla5g30P1hwoAb0CdjDw3a8EFGnz5DQ="
V8引擎计算: UhJOMQ2GS02sUla5g30P1hwoAb0CdjDw3a8EFGnz5DQ=
好了,至此,我们搞定了 phone 和 password 的加密
我们回过头来,注意到 header 里面还有个 sign
瞎J8搜索大发好,搜索 sign
搜索了好久,看到非常熟悉的函数,和调用方法,果断下段,重新跑一下
我们再来验证一下:
正确,那么我们回到刚才的js中,对比一下计算结果
ccall('get_sign','string',['string'],['1611828992,249508908bearer null'])
完全 OJBK
至此,加密算法全部被搞出来了!
感谢耐心观看,
如有帮助到你,能否伸出爱心小手加个分:
js:
1.txt
(286.91 KB, 下载次数: 17)
|