阅读须知
文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!
背景
在工作中,我最近面对了多次数据加密的挑战。以前,我总是观察高手们怎样在前端调试并逆向破解密钥来解密数据。这次,我决定亲自动手,运用我所学的“三步破解法”技巧尝试解决这一问题。
开始
我们的焦点放在了一个特定的微信小程序上。首先,我们审视了这个小程序的网络请求流量。对于普通人来说,这些传输的数据看起来完全无法理解,这几乎可以肯定地表明,该小程序对其流量进行了加密。
接着,我们检查了小程序发回的响应数据——结果依然让人摸不着头脑:
根据以上两个步骤的分析,我们确认这个微信小程序采用了流量加密。接下来需要确定是全部流量还是部分流量经过了加密。如果只有部分流量加密,我们还可以尝试寻找没有加密的数据;如果是全局流量加密,则需要对小程序进行逆向工程以获取源代码进一步分析。
逆向微信小程序通常采用一种特殊的模拟器配合旧版本的微信,例如使用安卓5系统和微信6.X版本。这是因为较高版本的安卓和微信不再信任系统证书,这导致无法进行数据包抓取。通过这种设置,我们能够绕过安全限制。
进一步地,我参考了网络上的相关教程,成功从模拟器中提取出了小程序的wxapkg文件。在我的系统中,这个文件的存储路径是:
-
/data/data/com.tencent.mm/MicroMsg/7e3e7c**********706/appbrand/pkg
这一路径存放了关键的小程序包文件,为我们接下来的分析和破解工作提供了基础。
由于存在多个小程序文件,不清楚哪一个是我们的目标文件,首先需要通过adb命令将这些wxapkg文件从设备中全部下载到本地。下载完成后,接下来的步骤是从这些wxapkg文件中提取源代码。
为了提取源代码,可以使用工具如wxappUnpacker进行一键提取。这个工具专门设计用于解包微信小程序的包文件(wxapkg),能有效地将编译后的文件还原为初级的源代码形式。使用此工具可以简化逆向工程的复杂度,使得分析和定位目标代码更加直接和高效。
提取源代码后,就可以开始深入分析小程序的工作原理和加密机制了,以便进一步的研究和应用安全测试。这一步骤对于理解小程序如何处理数据及其安全性具有关键意义。
在成功提取目标小程序的源代码后,你现在会看到一个特定的文件结构。这个结构通常包含多个文件夹和文件,它们各自承担不同的功能和作用。典型的文件结构可能包括:
-
pages:包含各个页面的逻辑和布局文件。 -
utils:存放实用工具函数,通常用于数据处理、格式化等。 -
app.js:小程序的入口文件,包含全局的逻辑和生命周期函数。 -
app.json:配置文件,定义了小程序的窗口背景色、导航条样式、页面路径等。 -
app.wxss:全局样式文件,影响小程序中所有页面的样式。 -
components:组件目录,存放可复用的组件。
进入分析阶段后,你需要深入这些文件,尤其关注那些处理数据和通信的部分。寻找加密和解密的函数是关键,这可能在utils
文件夹或直接在页面逻辑文件中。此外,检查app.js
和app.json
也很重要,这有助于理解小程序的整体结构和流程。
分析的目标是理解小程序的工作原理,特别是它如何处理敏感数据,以及如何通过网络发送信息。这将为进一步的安全测试或功能修改提供必要的信息和基础。如果你发现了具体的加密方法或重要的逻辑漏洞,那么这些信息将成为后续工作的关键点。
分析式
接下来,我们将进入代码审计阶段,对前端代码的算法进行深入分析。通过逆向工程,我们已经获得了以下的小程序源代码结构:
由于之前未涉及微信小程序的分析,我首先对小程序的基础知识进行了学习。主要关注了两个方面:首先是app.js
文件,它作为整个小程序的入口文件,使用App()
方法注册小程序并定义了程序的生命周期。
其次是module.exports
,这是微信小程序的模块化特性,允许某个模块的方法被其他模块调用,类似于其他编程语言中的公共(public)方法。
在掌握了这些基本概念之后,我回到了项目的源代码本身。通过审视整个文件结构,我注意到所有关于加密的方法都被定义在/utils
目录下。特别是encrypt.js
文件,它包含了处理数据流量加密和解密的关键方法。现在,让我们直接查看这些代码。
在encrypt.js
文件中,通过module.exports
,该文件对外提供了两个方法:encrypt
和decrypt
。这两个函数很可能是用于对网络流量进行加密和解密的核心方法。首先,我们来分析encrypt
函数的具体实现和逻辑。
在encrypt
函数中,它接收两个参数:e
和n
。函数内部首先调用一个名为r
的函数处理参数n
,处理后的结果被赋值给变量s
。下面是r
函数的详细内容,需要注意的是为了安全考虑,示例中的字符串截取长度已经进行了修改,与原程序的实现不同:
在r
函数中,输入参数被截取一定长度的部分,然后与特定的字符串进行拼接。接着,这个拼接后的字符串通过SHA256函数进行签名,最后从签名结果中截取中间部分,并将这部分的字母转换成大写后返回。
回到encrypt
函数,其中i
变量存储了AES加密解密用的密钥,这个密钥是硬编码直接写入代码中的。变量u
用于存储经过格式化处理的s
变量,而c
变量则存储经过格式化的参数e
。
关于AES加密的部分,AES支持多种加密模式,本程序选用的是CBC(Cipher Block Chaining)模式。在CBC模式中,明文被切分成若干小段,每一小段都会先与前一段的密文或初始块进行异或运算,然后再与密钥进行加密。
在CBC模式的使用过程中,必须定义一个初始向量(IV)。初始向量在数据加密过程中用来保证随机性,确保即使在相同的明文和密钥下,使用不同的初始向量也会产生不同的密文。这增加了加密过程的安全性,因为它阻止了相同明文块生成相同密文块的可能性。
回到encrypt
函数的具体实现,可以看到该函数利用AES模块的encrypt
方法进行加密操作。传递的参数包括:c
作为明文、i
作为密钥,以及使用u
作为初始向量,整个过程都在CBC模式下执行。
完成了encrypt
函数的分析后,接下来我们来看decrypt
函数的实现。请提供或描述decrypt
函数的代码,以便进一步分析其具体操作和逻辑。
在decrypt
函数中,它接受两个参数:e
和s
。首先,参数e
会通过一个叫做formatString
的函数进行处理。这个函数的主要作用是移除e
中的所有换行符和空格。这样的处理有助于标准化数据,以便后续的解密操作。
在decrypt
函数的实现中,变量i
仍然存储的是经过r
函数处理后的参数s
。同时,变量u
用于存储经过格式化的密钥,而变量c
则存储格式化后的i
。完成这些设置后,函数调用AES模块的decrypt
方法来进行解密,解密的结果被存储在变量o
中。
解密操作的参数包括:e
作为密文、u
作为密钥以及c
作为初始化向量。整个解密过程采用CBC模式进行。在这一过程中,加密和解密所用的初始化向量都是通过r
函数处理得到的。
分析这些函数显示,加密和解密过程中传递的参数均为两个,其中一个参数用于生成初始化向量。这个参数的来源不是固定的,需要进一步分析以确保能完整地对数据进行解密。
最后,关于项目本身的进一步细节,在app.js
中,项目引入了request.js
文件。这个文件中封装了HTTP请求的方法,并且对外暴露了相关接口。这种封装和接口暴露是常见的做法,以便在小程序中方便地进行网络请求和数据交换。
在代码的第108行,出现了如下调用:
r=(0,n.encrypt)(JSON.stringify(r),d)
这行代码使用n.encrypt
方法对请求数据r
进行加密。在这里,r
首先被转换成JSON字符串格式,然后与参数d
一起传递给加密函数。d
参数在这个过程中用于生成初始向量(iv)。
在第103行的代码中提到了d
参数的来源,它是由getRandomUuid
函数生成的。这个函数负责提供一个随机的UUID,用作生成加密的初始向量。现在,让我们来看一下getRandomUuid
函数的具体实现:getRandomUuid
函数的主要功能是生成一个随机字符串并返回它。这个随机字符串作为UUID,具有重要的角色,在加密过程中用作初始向量的一部分或用于其他安全相关的用途。
在上述代码的第105行,这个随机生成的UUID(通过d
获得)被赋值给i.uuid
。这说明在小程序的逻辑中,UUID不仅用于加密过程,还被明确地用作请求数据的一部分。这可以从我们一开始审视HTTP请求数据包时发现,请求体中确实包含了一个名为uuid
的字段。这个UUID字段可能用于追踪或验证请求的唯一性,增强请求的安全性或为服务器提供一种方式来验证请求的来源。
这个uuid
字段被用作生成初始化向量(iv)的参数,这一点现在已得到确认。在完成流量加密后,代码将执行名为c
的函数,随后返回结果。因此,我们需要详细了解c
函数的作用,尤其是其在解密流程中可能扮演的角色。
在代码的第61行,一个HTTP请求被发送。如果请求成功,它会进入一个回调函数,该函数负责对接收到的数据进行解密。从代码中可以看出,解密函数中传递的参数c.uuid
正是之前HTTP请求包中包含的uuid
字段。这说明uuid
不仅用于生成加密时的初始化向量,还在解密过程中起到关键的匹配作用,确保正确地解码数据。这样的处理确保了加密和解密过程的一致性和安全性。
解密式
到这一步,我们已经完成了对整个微信小程序的分析。接下来的任务是编写一个解密脚本,这需要利用我们在分析过程中获取的密钥、初始化向量生成方法和加密算法等信息。
为了实现这一目的,你可以采用之前在开发中使用过的PHP版AES解密脚本,稍作修改以适应当前的需求。这种方法不仅能保证效率,还能利用已有的资源来达成目标。
脚本的功能将包括:用户输入uuid
参数和密文,点击解密按钮后,脚本返回明文。用户可以对这个明文进行修改,然后点击加密按钮,脚本将返回相应的密文。这样的功能设计使得脚本既实用又直观,能够快速地对数据进行加密和解密操作,满足实际应用需求。
解密返回的数据包:
这个小程序关于流量加密的分析工作已经全部完成。如果还有其他问题或需要进一步的帮助,请随时联系我!
原文始发于微信公众号(网安守护):逆向追踪网络请求流量 解密一款wx小程序
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论