链接地址:合肥房产网_合肥二手房|租房|新房|房地产信息网【合肥贝壳找房】
点击登录,打开开发者工具,点击账号密码登录,输入错误密码和账号 。找到登录的数据包。打开发现有许多参数加密。数据包是authenticate
再登陆一次看哪些参数是变化的,是加密后的
发现password是加密过后的,dataId是不变的 ,loginTicketId应该是登陆方式的选择,dataid是怎么来的,我们可以搜索内容,看是不是别的包返回的
dataId是由g包返回的 ,loginTicketId由initiate包返回
现在确定password需要加密,进行断点调试,由于返回的是XHR数据,因此进行XHR断点调试(比直接跟栈好一点) ,复制数据包后面的链接,进行下图操作,然后点击登录。
进入这个页面,再l.apply处打上断点
分析一下栈点
存在异步栈,它就是函数或方法的回调,本身是一个容器,会储存方法1,方法2,方法3,一般前面是请求,后面是响应,称为拦截器分为requests和response部分。 比如requests时候出现异常,触发方法2,可以回调方法3。
t.exports表示载入->它就是webpack
点击c.requests,取消之前的断点。然后释放所有断点,让网页运行,再打上下面的断点,点击登录。
i = i.then(n.shift(), n.shift());n是一个容器,储存了一个方法
如何去确定我们需要的加密是在请求拦截器构成呢?
如果断点在异步栈,发现请求对象即为(t)加密已经生成,那么加密并非这个地方生成,如t中password已经加密了。即不是异步回调方法构成的。需要继续往前推,看是由哪些堆栈生成。
堆栈很多,直接舍弃匿名栈。 点击v栈,发现加密已经生成。点击passwordlogin发现加密了
点击value栈,发现加密已经生成。
因此加密过程发生在value到passwordlogin中,我们回溯是栈已经执行完的位置。
value执行完毕,还是明文密码,因此加密发生在passwordlogin栈中。
进入其中。把其他断点删除。释放程序,在堆栈开始位置断点,点击登录。
结果为,传入t包括账号和密码,e是一些对象信息。
然后点击跳过下一个函数调用,一个函数一个函数走,看什么时候变成加密的。
上面的代码,将明文变成了密文数据。
o.publicKey是公钥,o.ec.encrypt(t.password)为加密函数。在该位置打上断点,释放断点,取消其他断点,重新点击登录。
目标变为找到o,o为一个对象,不可能在其他方法中包含 ,o是一个类属性。找到了o的位置了!