«

邮箱登录逆向

发布于 阅读:76


操作流程:
注:环境不讲解,可自行补环境,还有加载器
1. 定位加密位置

2. 分析逻辑

3. 修改代码

4. 验证结果

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


模块扣取与调用


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



第一步

1.1: 发包获取目标数据包

1.2:查看我们需要的内容

1.3: 账号密码随便输,不重要
 

第二步

2.1:打开启动器,进入头一个栈

2.2:按照流程 1 和 2进行发包断点

2.3:注意:第一次断点发包显示的栈不是我们要的,需要在放一次,过完验证码,在显示的就是我们要找的
 
 


第三步(过完验证码后)

3.1:我们就按照下图 1、2、3顺序就看到了我们密码和账号的获取位置

3.2:我们就让断点到 3 的位置 进行操作
 
 

第四步

1.1 因为涉及到改代码,我们就深入进去,这样代码量就很小,改代码也轻松

1.2 选中 o["a"].rsaPwd 进入到里面进行加密过程与分析

1.3 在第三步我们可以看到账号与密码在一块,这样就节省了我们很多的时间

1.4 进入到o["a"].rsaPwd 之后我们可以看到账号与密码走的同一个函数,

那就推测,他俩加密方式也就一样,所以我们就只分析密码的加密,密码出来了,账号也就出来
 

第五步

5.1 初步分析完密码走的流程,那我们就可以快乐的扣取代码了

5.2 我们返回到第三步,将整个代码复制到Code里,分析整个代码结构

5.3 我们看到整体是,webpack,然后我们复制要搜索的内容在Code里找位置

5.4 要与浏览器位置一致 3 的位置就是,就是我们要扣取的o

5.5 接下来就是要找加载器(第二步讲过我们要深入扣取代码,所以就先知扣个加载器备用)
 
 

第六步

6.1:回到第三步分析---->o["a"].rsaPwd("密码")<---

             6.1.1 首先从左往右 o 取出来 a 点出来 rsaPwd 加密

             6.1.2 然后我们为了节约时间,并保证代码量小,直接进入o["a"]不在跟着浏览器(浏览器是先用加载器加载数组里面下标为3的模块)

             6.1.3 可以看到o["a"]里面有很多但是不要担心随便进就可以(为了思路连贯我们就还是进rsaPwd方法里)
 

6.2 根据分析,o是由a(3)赋值而来,那么很自然的,我们进入的地方就是模块3的地方(这是我自己的理解,

      希望各位大佬给我提些建议,我补充我自己的理解)                        

               6.2.1 一直向上找 到模块3的开头
 
 

             6.2.2 我们将它扣取出来 放入 我们的加载器,运行,

                      会报错,按照图片修改即可,再次运行,根据报错修改
 
 

6.3 然后我们 进行 模块后的调用和调整代码,

     然后我们看到报错换了,需要补一些环境,然后还有一个小地方,就是我们扣取的模块里面还有一个模块,

     也需要将他扣取出(需要自己手动扣取出来,我就直接放成品了)
 
 
 
 

第七步

7.1 到这里我们模块就已经能扣完了

7.2 现在我们来看报错
 

7.3 这里其实就是没有加密的关键文件

7.4  加密文件会有一个混淆和一个不混淆(意思就是初次进入就是明文的不是多次进入就会是混淆的)直接放图

7.5  我将混淆的和没混淆的都放出来两个使用方法都一样
 


&&&&没混淆的
 

&&&&混淆的
 

第八步

8.1新建文件,存储加密文件,并且导出
 

8.2 输出内容测试
 


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代码分析调试与修改代码

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



第九步

9.1调试代码我们返回第三步(因为这里本地走的和浏览器走的不一致我们要在这里分析它们各自走的流程)

代码调试1:  

     先看浏览器:我们单步调试进入到  this.getRsaStr 方法里 经过1、2 步骤到达第3步 加密位置

     并且查看3 密文也就是我们要的密码加密
 
 
 

再看本地:我们看到有报错,

但加密用的函数与浏览器一致,但不知为何报错,

所以在本地下断点进行单步调试查看,我们经过1--6步骤调试,可以看到本地走不一样,

跟浏览器对比,因为本地在第2 并没有进if判断,而是走了return a.getRsaFuc方法,

从这里我们就可以知道,那么我们只要让本地也走if判断不就行了.
 
 
 
 
 
 
 
 


代码分析2:

上述我们对比浏览器和本地代码走的路线,这次我们分析两者的不同我们先来看浏览器的:

1. 浏览器为什么会走if判断

2. 让浏览器走if段的条件在哪

3. 分析代码的组成看到图片很清晰这1、2、3代码组成,是由a拿出来的,

    a = this,是当前a的定义处,那么最关键的就是a.getRsaFlag,参数位置我放到下边了,

     在浏览器中向上找就可以看到,但看到本来getRsaFlag是写死的!1也就是false

     到了判断里就为true,摸不着头脑,但不着急我们去看本地,本地是怎么回事
 
 
 

本地分析:

断点移动之后我们看到,a里面的参数与浏览器大不相同a.getRsaFlag没变为true而是false由此我们知道到了本地为什么不走if判断了,

但我们改为跟浏览器一致不就行了,这里我们不演示,感兴趣的可以去试一试,关键在于this因为a=this,a里面的方法以及参数都是由this给的
 
 
 



代码分析3:

经过代码分析1、2的流程分析我们知道浏览器与本地不同的原因在于a = this也就是找到 this 的定义处但this此时指的的是当前作用域下,

但很不幸没有地方记录this的出生地址,但是经过多次调试,以及本地这个老实人,

很快就怀疑有个地方是加密入口,让我们返回代码调试1浏览器处来再次分析这次我们关键词搜索看看是否有相同的,因为浏览器正常流程给我们的信息太少了,

所以就尝试扩大范围,下面根据箭头指引我们有两个并且其中一个给我们信息很多,图片里的就是另一个encrypt.encrypt

同时我们也看到了老熟人 getRsaFuc 同时我们就可以回忆代码分析1中的本地他就是走的这里但很不幸他报错了,

我为什么要说这个,因为在图片中我们获得了大量信息,而这是正常流程没有的比如new JSEncrypt、setPublicKey这些预示着是RSA加密前提,我们不放大胆猜测一次this里面的所有值是从getRsaFuc方法里面获取的.
 


代码分析4:

经过代码分析3 我们知道了也许,是在getRsaFuc方法里面完成了参数配置然后给了this 然后给了a,

a在调用加密方法,完成最后的加密,那我们就可以修改本地代码让他走到代码分析3图片里的位置o.encrypt.encrypt完成加密


第十步

10.1 修改代码验证代码分析1、2、3、4

10.2 打开浏览器定位到指定位置进行分析并依次修改代码

10.3 断点到$.ajax 像图片里面下断点刷新进入

10.4 切换断点后我们查看success函数e的参数,发现里面就是有我们需要的key,i函数传入的参数就是key,所以我们进入i函数
 
 
 

10.5 因为浏览器不走这里,但我们本地需要走这完成加密,

而且可以看到这里的流程和浏览器正常加密流程一致所以大致知道了,

i函数就是加密函数,只不过浏览器隐藏起来了,赋值过程不给看
 

第十一步

11.1: 修改代码,首先先根据 10.4,因为本地没有$.ajax

所以会报错另外修改之后代码就被打乱了有些参数需要固定写
 

修改之后

     图片里面的e是10.4里面的我们再次运行程序
 

      可以看到虽然没有报错,但没有值,问题出在最后的 i 函数
 

       我们进入本地的 i 方法修改判断
 
 

到这里我们本地代码的调试与修改就结束了,可以看到结果开头与浏览器一致,

但是后边的值在不停地变化很难判断是否成功了.所以我们就打开抓包软件进行验证



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

发包验证

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


第十二步   

12.1 抓包验证结果的真假        

12.2这里我用的是Reqable抓包软件

12.3首先打开软件抓一次包
 

12.4 右击数据包选择 ---->重写----->修改请求
 

12.5 双击 打开我们进行正则匹配
 

12.6 修改请求
 
 
 

12.6.1 修改请求中的密码
 

最后我们回到浏览器再次点击登录
 

但是会失败,因为我们修改的是第一次请求的数据包,

也就是我们随意输入的账号密码,当我们修改之后,前后数据不一样,会出现
 

此时我们的抓包工具内会显示出一个包,这个包里就是我们之前随便输入账号密码,

验证我们绑定的号码前后是否一致,所以只需要在修改这个包内的请求,也就是按照 12.6 再次修改 ,就可以顺利通过
 

注:这是分开的两个包,而不是一个,所以要分开修改,但修改内容一致

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////