加密数据库解密技术深度剖析
1. 加密块特征与CryptoPP库分析
在对加密数据库进行分析时,我们发现大部分加密块的大小介于36到48之间,且所有块的大小均为偶数,不存在大小为奇数的块。同时,存在能在字节甚至比特级别操作的流密码。
用于浏览该加密数据库的程序用C#编写,其.NET代码经过了深度混淆。不过,其中的DLL包含x86代码,经检查发现其中有Popular open - source library CryptoPP的部分代码。由于CryptoPP是开源库,所以很容易找到DLL中的所有函数。
CryptoPP库拥有众多加密函数,包括AES(Rijndael)。较新的x86 CPU具备AES辅助指令,如AESENC、AESDEC和AESKEYGENASSIST 。较新的CryptoPP版本会使用这些指令,但在解密过程中,AESENC会被执行,而AESDEC却未被执行。经检查,CPU是支持这些AES指令的,这就引发了疑问:为何程序使用AES加密来解密数据库呢?
我们找到了加密块的函数 CryptoPP::Rijndael::Enc::ProcessAndXorBlock
,它可以调用 Rijndael::Enc::AdvancedProcessBlocks()
,而后者又能调用包含AESENC指令的 AESNI_Enc_Block
和 AESNI_Enc_4_Blocks
。由此可知, CryptoPP::Rijndael::Enc::ProcessAndXorBlock()
用于加密一个16字节的块。以下是