Java中通过JNI技术开发一款PC端微信数据库解密备份工具
一、前言
在之前已经介绍了如何使用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 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表中:
场景:老婆发现老公的聊天记录中有什么危害夫妻关系的内容。
字段:createTime:聊天时间;talker:聊天对象(如果是@chatroom结尾的表示群聊);content:聊天内容
第二、群聊信息表:chatroom
这个表中主要包含了群聊信息,包括群聊的成员信息和群主等信息
场景:老婆查看老公都有些什么群,群里有什么女的不能看的内容。
字段:chatroomname:群聊id;memberlist:群成员id;displayname:群成员昵称;roomowner:群主id
第三、个人信息表:userinfo
这个表格中主要包含自己信息的,包括昵称,地区,微信号等
场景:这里的信息老婆都知道的
这里用id作为区分各个字段值,id=2表示微信id;id=4表示微信昵称;id=6表示电话等。
第四、好友头像信息表:img_flag
这个表中主要包括当前微信好友的头像信息
场景:老婆发现老公的通讯录中有一个昵称好友很诡异,通过查看头像发现是个影响婚姻的人。
字段:username:表示微信id;reversed1:表示好友头像
第五、通讯录信息表:rcontact
这个表中主要包括通讯录中好友信息
场景:老婆看看老公的好友中有几个微信婚姻关系的人。
字段:username:表示微信id;alias:表示微信名;nickname:表示微信昵称
第六、设备登录表:SafeDeviceInfo
主要包括账号在哪些设备中登录过,包含设备名和系统以及登录时间等
场景:老婆想看看老公的微信号在哪些设备登录过,搞不好有一个设备的主人就是威胁婚姻关系的人。
字段:uid:表示设备id;name:表示设备名;devicetype:表示设备系统;createtime:表示登录时间
我们主要就是利用和保存这些最关键的几张表格信息下面就用一张图来表示上面的各个表格之间的关系:
所以有了这些表格我们就可以开发出功能全面的UI界面的数据库信息查询和备份工具了,具体代码不多说了,因为没啥技术可说的,C++中进行查询操作然后把数据传回到java中进行UI展示即可,大致界面如下:
我们只需要打开微信专属的数据库文件夹MicroMsg即可操作了,方便快捷,而现在市面上有这类工具都是收费的而且还没有源码,但是我就是免费而且还把源码给你们。所以需要源码和工具的同学去小密圈自取即可。
四、问题延伸
好了到这里我们就把微信数据库解密备份工具开发完了,不过还有两个问题需要解决:
第一个问题:怎么把这个Java程序弄成exe这样在没有jdk环境的小白用户电脑上也可以运行呢?
这个就是很常见的一个问题了,其实我们常用的Eclipse等工具也是用Java语言开发的,你看他就是双击即可运行,这个主要是利用exe4j工具把可以运行的jar包编译成exe,然后在把对应的jre环境打包进去即可。现在的问题就是如何打包jre环境,准确的说如何把那么大的jre环境打包进去,因为我们知道jre环境是jar运行的基础,如果想要让一个没有jdk环境的电脑运行的话必须携带jre包。但是一个jre包都是几百M,那么本身一个几M的工具,结果打包了jre之后几百M很难接受的,所以这里有一个技术就是缩减jre,这个网上有很多资料,都是大同小异,主要就是把项目中用到的类重新提出来弄成一个简单的rt.jar即可。
那么怎么知道一个项目中用到了哪些类呢?这个就需要java的一个命令了:
java -jar -verbose:class weixindb_utils.jar >>class.txt
这样运行之后就可以把weixindb_utils.jar中所有用到的class文件名字打出来,这里可以把输出重定向到一个文件中即可:
看到了,这里我们后面需要把用到的类名进行归类包装重新打包一个精简的jar包,这里看到每一行都差不多是固定格式,我们可以先全局替换:
这样就全局把开头的替换完了:
然后接下来替换后面的信息,这里就需要借助这个工具强大的地方正则表达式了,这里输入: from.*即可,注意from前面有一个空格:
替换之后的信息就是:
这样每一行就是整个类的全称了,然后我们在写代码把这些类从rt.jar中提炼处理打包成一个简化的rt.jar即可。这个操作也很简单,首先解压jre中的rt.jar文件,然后按照行转化成路径找指定类的class文件,然后在拷贝到简化的目录下,最终在打包成jar即可。但是这个过程中需要注意一定要把工具中所有的功能都走一遍,这样才能把工具中用到的class信息打印出来。不然还是报错的。
这样我们就简化了属于自己工具的jre包了,接下来我们就用exe4j工具把jar变成exe即可,这个都是傻瓜式操作不多解释了,主要设置这两个地方:
这里需要选择我们的工具jar包,然后设置入口的主类信息。
接着是设置工具运行的jre环境信息,需要把他默认的三个环境删除,这三个就是系统默认的JDK环境变量,但是小白用户电脑一般都没有这些的,所以全部删除,然后设置我们缩减之后的jre即可。
这样我们就有了一个exe程序了,把整个目录打包就可以给小白用户使用了,即使在没有安装jdk环境的电脑上都可以运行了。
第二个问题:怎么才能拿到用户的微信数据库目录MicroMsg呢?
这个就要回归到Android上了,我们知道这个目录是在微信沙盒中的,而且有人也好奇为什么要开发一个PC端工具呢?为什么不直接在Android手机上开发一个工具呢?的确可以这么做为什么我不这么做呢?因为这个要留给你们去完成,但是不管怎么样要想弄到微信沙盒中的数据现在想到的办法就是设备root了,当然还有其他两个方案,不过可能已经过时了:
第一个方案:就是之前介绍应用备份属性allowBackup利用工具可以免root获取设备的应用沙盒数据,这个大约在微信6.0之前这个属性都是true的,也就是可以这么干的,不过之后的版本已经不行了,不了解这个属性的操作方式可以查看这里:Android中免root获取应用沙盒数据;
第二个方案:就是利用之前说到的WebView跨域漏洞,利用钓鱼页面可以免root获取应用的沙盒数据,但是这个方式前提是微信中的WebView是否开启了跨域功能,如果没有那就不可能操作的了,不了解这个漏洞的可以看这里:Android中利用WebView的跨域漏洞免root获取应用的沙盒数据;
不管是哪个方案其实想要弄到微信的沙盒数据是很难的,那么PC端功能和Android端工具到底有啥区别呢?其实还是有点区别,假如有的用户微信数据想备份或者解析直接在电脑上查看,设备已经损坏了,但是可以进行数据修复的,比如现在很多案件利用微信的通讯录恢复进行寻找线索,一个设备损坏可能是锁机或者开不了机了,那么可以把手机的内存卡或者数据段从手机中进行分离,然后利用特殊设备把这段内存读出来这时候就需要PC端的工具了。其实还有很多场景都可能需要PC端工具的,当然手机端的工具也有一定用途,如果大家感兴趣可以自己动手写一个Android应用即可。
五、总结
本文主要利用JNI技术写了一个微信数据库备份和解密工具,本文的重点在于学习JNI开发技术,而这个技术在我的逆向大黄书中也介绍了,如果感兴趣的同学可以购买此书查看,所以以后如果你不会C++开发界面编程,可以利用C++底层做事情然后在Java层进行展示也是一个不错的选择,而且最后可以把jar变成一个可以在没有JDK环境的电脑上运行。