从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库

开始前的例行叨叨:

被折磨很久了...orz。

如果只想解密微信数据库看看大概内容,不需要看这篇重编译sqlcipher!!

本篇是为了导出dll实现自定的搞基呸,高级功能。



背景知识:

1、手机root后才能在手机微信目录下找到uuid算出微信数据库密码。

2、安卓微信数据库是sqlite数据库,被sqlcipher加密。数据库文件EnMicroMsg.db已从root过的手机中获取。

3、sqlcipher是一种开源加密软件,采用全局整体加密,sqlite免费版无加密功能,所以微信用了sqlcipher2.1.1。

4、重编译sqlcipher需要openssl支持,不要慌,文章会讲从头编译openssl,sqlcipher2.1.1需要openssl-1.0.1g版本。

【如果以上不太明白看这里的资料】

【**微信数据库原理】https://blog.****.net/njweiyukun/article/details/54024442

【微信数据库密码的获取】https://blog.****.net/jiangwei0910410003/article/details/52238891



目的:

从源码编译sqlcipher,可以修改源码,封装新的函数,导出dll。

让我们的c++程序可以调用这个dll中的函数,操作解密sqlcipher。



环境需求:

1、安了visual stdio2017 用来写c++和用它的自带工具辅助编译。

2、安装ActivePerl因为要执行perl代码。

3、下载并安装 Nasm 汇编器,并将 D:\Program Files\NASM 添加到系统环境变量 Path 中。

4、比较麻烦的是安装MinGW下载其中的各种依赖,编译sqlcipher要用到。

【如果以上环境都OK就可以继续了】

【不行的话可以参考这篇安装1-3】

https://blog.****.net/liang19890820/article/details/51658574

【参考这篇安装4】

http://www.360doc.com/content/17/1203/15/8728596_709509894.shtml



(话说。。以上环境诚然对新手不友好,慢慢安,不要急躁~)

(虽说直接跳过详细环境配置步骤有点让人想打作者,但毕竟本篇的中心是讲后续呀)



编译openssl

这里为了支持sqlcipher2.1.1我们使用openssl-1.0.1g.tar.gz版本

官网可自行选择下载需要的版本。

(此处假装有下载链接)


1、解压openssl-1.0.1g.tar.gz到目录,用cmd进入此目录。


2、perl Configure VC-WIN32 --prefix=D:\bs\show\opensslbuild

这行命令是设定编译好的openssl放到哪个路径的opensslbuild文件夹,这个文件夹不存在也没关系,会自己建的。

必须安好ActivePerl设好环境变量才能成功执行perl命令。

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库


3、执行"E:\Visual Studio\main\VC\Auxiliary\Build\vcvars32.bat"

这是我的visual studio 2017中的路径,请去自己的vs目录下寻找,所以前提环境说要安vs2017,大概也可以自己只下这个bat。

vcvars32.bat这个bat是把当前编译环境设成32位,貌似这样才能编译成功。。


4、执行 ms\do_nasm

所以要安好 Nasm 汇编器,并添加好环境变量。

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库


5、nmake -f ms\ntdll.mak

这步进行编译,会刷出来一大堆信息,稍微等一下。


6、nmake -f ms\ntdll.mak test

这步进行测试是否ok

弹出来一堆都ok,最后出个passed all test 那离成功就剩一步了!


7、nmake -f ms\ntdll.mak install

执行完会发现,之前指定的目录下,opensslbuild目录被生成了

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库

进opensslbuild中看看有4个文件夹,都被生成了,就OK了。

接下来编译sqlcipher会需要其中的文件。

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库



编译sqlcipher

1、解压sqlcipher2.1.1


2、从opensslbulid中找到把libeay32.dll 和 libeay32.lib直接放入sqlcipher目录中


3、管理员运行C:\MinGW\msys\1.0\msys.bat

必须提前安装MinGW并且把能安的库尽量安上,一大堆。

会出现个类似linux的命令行

cd /可以进根目录 在cd d 进入d盘


4、操作MinGW进入sqlcipher的目录中


5、修改并运行这个

./configure --with-crypto-lib=none --disable-tcl CFLAGS="-DSQLITE_HAS_CODEC -DSQLCIPHER_CRYPTO_OPENSSL -I/d/bs/show/opensslbuild/include /d/bs/show/sqlcipher-2.1.1/libeay32.dll -L/d/bs/show/sqlcipher-2.1.1/ -static-libgcc" LDFLAGS="-leay32"

注意:这段命令有3处需要修改的地方

(1)修改-I/d/bs/show/opensslbuild/include

这个opensslbuild就是刚才编译好的openssl的目录

(2)修改/d/bs/show/sqlcipher-2.1.1/libeay32.dll

这个libeay32.dll是第二步从opensslbuild目录中放到解压后的sqlcipher目录中的。

(3)修改-L/d/bs/show/sqlcipher-2.1.1/

这个是sqlcipher解压后的根路径

顺便,在MinGW中不好直接粘贴,需要在框的上方栏,右键,编辑,粘贴。

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库


6、make clean


7、make sqlite3.c

这时候就可以在sqlcipher目录下发现sqlite3.c文件了!

可以任意修改它的源码,例如封装函数等。

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库

可以修改.c和.h封装新函数了


8、make

还是在MinGW窗口中一行make命令下去,就会生成sqlite3.exe这就是编译好的exe了,可以运行它解密数据库。

但我们还要生成dll。


9、make dll

即可生成sqlite3.dll

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库



正常exe解密数据库

在cmd中 sqlte3.exe xxx.db打开这个数据库

PRAGMA key = 'xxxxx';

PRAGMA cipher_use_hmac = off;

select * from message limit 1;

注意 必须先设key 

必须!!!必须!!!设cipher_use_hmac = off

否则无法解密。。。尝试了很久才测出来的姿势。

对着网上的资料,解密微信sqlcipher数据库失败很多次,才从原理上发现,需要关掉这个。

这样就能select查出来内容了。

如果密码不对是查不出来的。



在c++工程中调用dll的函数

1、要把

sqlite3.h 

sqlite3.dll

sqlite3.def

sqlite3.lib

共4个文件引入到工程内


2、如果没有sqlite3.lib生成方法如下:

用vs命令行(在开始菜单 visual studio2017目录中 Developer Command Prompt就是了)

进到sqlite3目录后执行命令 LIB /MACHINE:IX86 /DEF:sqlite3.def

即可生成sqlite3.lib

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库


3、在工程内

#include "sqlite3.h"

就可以调用函数了

从源码编译SqlCipher并修改代码实现c++中调用dll解密微信数据库



好累啊~有问题欢迎留言吧