从源码编译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命令。
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 汇编器,并添加好环境变量。
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目录被生成了
进opensslbuild中看看有4个文件夹,都被生成了,就OK了。
接下来编译sqlcipher会需要其中的文件。
编译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中不好直接粘贴,需要在框的上方栏,右键,编辑,粘贴。
6、make clean
7、make sqlite3.c
这时候就可以在sqlcipher目录下发现sqlite3.c文件了!
可以任意修改它的源码,例如封装函数等。
可以修改.c和.h封装新函数了
8、make
还是在MinGW窗口中一行make命令下去,就会生成sqlite3.exe这就是编译好的exe了,可以运行它解密数据库。
但我们还要生成dll。
9、make dll
即可生成sqlite3.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
3、在工程内
#include "sqlite3.h"
就可以调用函数了