在之前已经介绍了如何使用VS2017编写C++代码解密微信数据库文件了,但是这个不是最终的目的,因为要想让一个工具可以给别人使用,必须要有界面交互才是完美的,所以我们本文主要来进行解密编写,可惜的是我不会MFC,无法直接用C++编写界面,而我会的是用Java编写界面,所以问题就来了,我们的所有解密工作都用C++编写的,界面展示用Java实现。所以这里就需要一个技术啦,就是传说中的JNI开发,其实这个和Android中的NDK几乎一样,只是JNI包含了他而已,因为NDK对于Android,也就是Linux系统。所以native层就是so文件格式了,而Java层可以值Windows的DLL文件,也可以是Linux的so文件等格式。但是不管怎么样这个都是Java语言和底层的C/C++交互的方式而已。语法和编码方式完全一致。
在之前我们已经知道了微信数据库保存的目录MicroMsg,我们只需要这个目录就可以进行解密操作了,主要是读取这个目录下的几个cfg文件即可。从这里可以了解本文就是利用这个案例来给大家介绍Java中如何调用DLL文件实现和底层交互,因为在之前我们已经了解了VS2017中用C++利用sqlite3进行了数据库解密操作了。所以我们可以这么划分功能,把数据库密码获取放在Java层操作,因为这样会更方便,然后把一些数据库操作都放在C++中,把查询的数据结果返回给Java层进行渲染即可。这里我们先把native接口定义一下:
然后利用javah生成对应的头文件即可,命令很简单先进入源码src目录下,然后运行命令:
javah cn.wjdiankong.wxdbpwd.SqlcipherImpl
然后刷新工程就有了对应的头文件信息:
然后我们把这个头文件拷贝到之前的VS项目中:
这样就把Java层和C++层联系到一起了,而我们编译VS中的项目运行之后会生成一个dll文件,然后我们在Java层进行加载:
这里包含了三个dll文件,其中libeay32.dll和sqlcipher.dll文件是sqlite3需要依赖的库文件,WeixinSqlcipherDB.dll是我们自己生成的。最后我们还需要把java程序编程exe,所以这里就把所有dll文件放到libs下面了。有了初始化,接下来对于其他的接口操作就不多说了,主要就是各种查询操作。需要说明一点就是在C++中如何构造Java层的对象,这里利用类似于反射机制即可,比如这里:
这里就构造了一个Java层的UserInfo对象信息,所以不管是在Java中还是Android中,都是这么做的。其他的查询操作都只是sql语句的执行了,这里不多太多的介绍了,
这里需要介绍的是微信数据库中哪些数据表是我们这一次关心需要展示出来的,这个就要看我们需要展示什么数据了?这里我们把能展示的都展示出来吧:
第一、展示聊天记录表:message
主要包括聊天对象信息和聊天内容信息,这个主要在message表中
场景:老婆发现老公的聊天记录中有什么危害夫妻关系的内容
字段:
<