某H网的逆向分析

    1,604

一次偶然的机会,让我发现了这个网站,本来不想点进去的,可鼠标一不小心就自己点击了左键,满屏的马赛克含量直接超标... 想关掉,可点击关闭却怎么也关不了...

罢了,来都来了,作为一名开发,本着学习的态度,F12,启动!

嚯,好家伙,canvas绘制的页面

image

让我来看看,还有啥,看看数据是怎么拿的。

image

嗯?加密?可以看到,返回的数据也是加密的

image

解析页面拿不到数据,从接口也没法直接拿数据,有点水平,但也不多,搞它!

可以看到请求堆栈,发现全是“main.dart.js”发起的

image

问一下AI,看看这是个什么玩意儿

image

接下来,就是打断点分析了。还是回到之前发起的请求,可以看到有3个参数,这里就到了对哪个参数进行分析了,我选择“sign”这个参数,因为timestamp和data这俩,感觉出现的次数会比较多,不方便分析。

直接搜索“sign=”,发现找到了相关代码,进去看看怎么个事儿

image

可以看到,核心的代码都在这了

image

看来这混淆也就那样啊,所以上面才说也就有点水平,但不多。直接下断,看看sign是怎么来的

image

从上图可以发现,其中的“a”是请求的原始参数,没加密的

m还不知道是啥,n肯定是个时间戳,o也不知道是啥,看代码顺序,得先分析o的生成

image

可以看到o的生成,其中有个p.a的参数,是个字节数组,拿到控制台,看看

image

那p.a是怎么生成的呢?就得看 new A.acU(A.bVO($.c0X(), B.iW)).aXc(B.a7.gfh().bX(a), $.c0W())

虽然这行代码被混淆了,但还是能阅读的。从内往外看,可看到把参数a丢到了 B.a7.gfh().bX(a) 还是丢到浏览器去,也是个字节数组

image

看看能不能转换成字符串,往控制台丢一个转换函数

image

可以看到,其实就是a的值,分析下一个

image

看看 $.c0W() 也是个字节数组

image

再转换一下看看

image

发现是个字符串,因为这是加密的过程,所以大概率是加密的参数啥的,就看是什么加密方式了,继续

接着分析 B.iW ,还是丢控制台看看

image

这不就来了么,CBC,不就是AES加密吗,那我们只需要获取key和iv就行了,上面一个有个字符串了,再把 $.c0X() 看完

image

不出意外的又是一个字符串。那哪个是key,哪个是iv呢?找一个aes在线加密解密,试试就知道了

从上面分析的过程可以知道,a是原始内容,对其进行了加密,得到了o,我们先拿到o的值

image

拿到在线的AES加密解密网站试试

image

不对,再交换一下key和iv的顺序试试

image

对了,那就说明 $.c0X()是key, $.c0W()是iv。加密就搞定了,采用的是AES加密,运算模式是CBC,这玩意儿是个对称加密,那解密自然就不在话下了

找一个返回的数据,解密看看

image

拿捏,到此,加密解密没问题了,但是还没完,得把如何发起请求的继续分析完。

继续分析m的生成逻辑

image

从m生成开始下断,跟着分析一下,到这,可以看到m的明文内容了

image

到这为止,m也就是把各个参数按照顺序拼在了一起

那接下来,就是这一行代码,把m加密了

m = A.bSx(B.tE.bX(B.a7.gfh().bX(m + "tjJHooEeIYLszIUt")).a)

首先,m和一段字符拼在了一起

m + "tjJHooEeIYLszIUt"

然后当做入参,并且没有其他入参了。调用了 B.a7.gfh().bX,我们去控制台看一下,这是个什么玩意儿

image

那就说明 B.a7.gfh().bX(m + "tjJHooEeIYLszIUt") 其实就是m拼接字符串之后的值。继续分析

image

这里看不出什么端倪,目前只知道入参只有一个,然后经过加密。我们直接看加密后的m值

image

到这,其实可以稍微猜测一下了,比如md5加密、sha256加密。考虑到加密后的m长度是64,先试试是不是sha256加密

image

猜对了,就是sha256加密,那m也搞定了,最后就剩下sign了。同样可以发现,sign的生成,入参也只有m一个,然后看到sign的实际内容和长度

image

继续盲猜一个m经过md5加密的,验证一下

image

又猜对了,到此,所有的参数加密、返回结果解密,都搞定了。

 

总结一下,这个H网是由Flutter编译打包的,页面采用canvas进行的绘制,发起请求和请求结果都加密了。

发起请求一共有三个参数,timestamp、data、sign,其中timestamp是当前时间戳,data是由请求原始参数,经过AES CBC加密而来的值,key是tjJHooEeIYLszIUt,iv是bleBrccsf7MZLG29,sign是由timestamp+data+随机字符串经过sha256加密后,再通过md5加密而来的值

拿下~ 收工,点击关闭按钮终于把网站关掉了... 呼,破鼠标

消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息