前段时间玩了一下ins,整体感觉我接触过的国外的网站例如youtube、Ins、Facebook比国内的加密相对比较少,很多数据都是在HTML中的。但是做起来真的很烦人,因为我是个很讨厌从H5中扣数据的人。
一、ins的登录参数分析
请求接口:4oCLaHR0cHM6Ly9pLmluc3RhZ3JhbS5jb20vYXBpL3YxL3dlYi9hY2NvdW50cy9sb2dpbi9hamF4L+KAiw==
data参数:很明显如下图所示enc_password加密了。我用大拇脚趾猜测enc_password是密码的加密。
二、找到加密点
这个网上有教程,我就不啰嗦了,一句话总结就是加密参数中 “PWD_INSTAGRAM_BROWSER”是一直固定的,那就搜索PWD_INSTAGRAM_BROWSER就能找到了。如果这点还不具备,这位读者你需要多加练习才行啊。
最后这里就找到了。这里应该就是入口,这个代码是我两周前逆向完弄完的,我刚刚又找了一遍,应该就是这里没错了。
三、观察加密、解密
这里图三就是加密的入口算是
这就是加密代理的流程,如果读者觉得我这个看起来苦涩难懂也没事,你可以搜索一下别人的,他们的写的比我细致。
注意1:
这个地方是个异步,要有耐心,多留意多观察,然后就能找到接下来 k 的值是在哪里加密的
K值的加密在这里:
进去后是这样的:
写的也很清楚,这是个什么加密,然后看了下加密代码,感觉就是个单纯的AES-GCM 加密。然
截止这里,找到加密点的部分已经完成了,接下来就是调用了
四、实现加密
实现加密其实就是跟着人家的流程走,人家有的你就加上,加上没用你就删了。最后整个跟下来,你会惊喜的发现你的Js代码逻辑和人家的一模一样的情况下你的会报错,就算不报错加密结果明显就不对。
所以……
注意二:w = window.crypto || window.msCrypto;w.subtle.generateKey;这个地方最容易报错;我们用node的话应该这样替换:
const crypto = require('crypto').webcrypto;
window = global
window.crypto = crypto
然鹅,有些读者和我一样,看了网上别人家的博客以为这样就OK了,大错特错,接下来还有一个坑等着。那就是你的nodejs调用不了require('crypto').webcrypto或者调用了发现是个undefined,不要沮丧,这只仅仅是因为你的node版本太低了,至少得要个15以上的版本,像我一样我就是14的版本最后无奈上官网查看官方文档才解决的。
注意三:当以上问题统统解决了之后,你会发现,我一行一行跟着扣下来的代码为什么执行完加密打印的结果是错误的,很简单,因为你的代码不是异步的。关于JS的异步你们可以网上看看资料。如果你的JS代码不是异步的,那么你跑出来的结果只有#PWD_INSTAGRAM_BROWSER:10:1666597197:后面毛都没有。所以Js代码要异步。
整个弄完后,我网上说python调用js速度还是太慢,不如放服务器用node开个后端接口跑,这样最快,于是乎不死心的我写了个node后端,把代码放服务器上了,也不知道心里原因还是咋滴,感觉确实比python本地调用的快。
至此,整个ins的登录加密就算弄完了!!!
最后给读者说一下,如果你是玩玩他的登录加密那就OK,如果你指望这篇文章看完能登录ins,那就洗洗睡吧,因为……这样根本登录不上去,他会返回 {"zhanghao":"ok","mima":"OK","验证":"c错误"}。这是最后最大的坑,我也是自己掉进去后后面才发现的。不是你的加密错了,也不是你的代码有BUG,而是一共有三个请求,这只仅仅是其中一个,所以登录不上去。
好了,就这,我的笔记做完了。