系列文章索引:
上一篇我们列举了当前市面上的几款“微信群成员批量导出/提取工具",也说了下相关的开发背景,这一篇我们就开始实打实的入门开发篇。
咱们这一系列文章的前提是您要会这么些门语言及相关知识,不然看起来的话,保证您晕头转向找不着北。
开发语言:汇编,c++,c#,
工具:od,ida,ce
首先说下开发语言吧,c++毋庸置疑,因为到后面我们要写内联汇编,然后写dll给客户端exe调用。
再说c#,用c#是因为咱后面的客户端打算用c#开发,有些同学可能会问为什么不直接就用c++做界面开发呢。以我浅薄的c++开发经验,我只能说以后宁愿用vb,用易语言,再也不用c++做界面开发了。
第1:控件功能过于简陋,比如要实现个列表框多选的,非得用winapi,当然不排除也有mfc之类的能实现,但是个觉得为啥有更好用的c#不用,非得用老古董的东西呢。
第2:类库太少了,比如像c#集成的base64,md5,websocket啊。c++得去网上好找一翻,才能找齐
第3:......
第4:......
总之吧,咱还是挑比较便利的来做开发。
要开发”微信群成员批量导出/提取工具“,首先第一步,就是要获取微信群列表。怎么获取呢,这里有2种方法,第一种是从微信内存里面读取,因为微信会把群列表包括联系人列表都放在内存里面,然后存成1个二叉树结构,每次读取的时候都从内存上读取,速度才会快,相关教程网上都有,大家可以找下相关文章看看。不过我们要用的是另外一种:从数据库里面获取微信群列表,为什么呢?因为吧,微信数据库里面的列表是最全,它包括了以前很久不说话的群甚至连退出的群都有记录。咱们秉着要做就做个大的来的想法,所以咱从微信的数据库上获取微信群列表及微信成员列表资料。
微信的数据库使用的是sqlite,但是是有加密的,所以直接把微信的sqlite数据库拷出来,也是没办法用相关sqlite数据库管理工具打开访问的。
既然是加密的,那咱们是不是要进行解密呢。不,虽然解密也是一种方法,但是咱们要获取的是比较实时的数据,所以咱们采用另外一种方法,就是获取微信的数据库句柄,把它的句柄拿过来,咱们就可以对数据库为所欲为了。之所以可以这么做,是因为微信打开sqlite数据库句柄后,并不关闭这个句柄,因为如果用一次关一次,那其实是挺浪费资源的,所以微信打开数据库句柄后就把句柄存在一个全局变量里,要查询数据库的时候,就拿过来用。
原理说明白了,咱就知道怎么搞了,因为全局静态变量在汇编里面的话,它就会有个基址,咱只要找到这个基址,算下偏移,只要是相同的微信版本,不管哪台电脑咱就都可以找到它了。说干就干,拿出od,载入微信,定位到数据库调用的地方。