系列文章索引:
昨天说到开发“微信群成员提取”工具开发,如何提取微信sqlite句柄的时候,戛然而止,是因为突然想到咱忘了很重要的一步,就是要用ida先来分析微信,毕竟ida可以f5快捷键生成伪c代码,虽然有些地方生成的不是很准确,但是比纯看汇编要容易多了。话不多说,开干。
1.打开ida,载入微信,然后等他分析完成
2.ida分析完成后,咱们快捷键“shift+f12"跳到字符串窗口,字符串窗口主要的作用是可以根据指定的字符串快速定位到汇编的地方,以便我们更快速的找到基址。像我们平时开发的时候,肯定会有写日志,常量名的东西,字符串窗口就是可以查找这些东西,找到后跳转到相关引用的地方,然后就可以上下比对,搜索,查到我们要的东西
字符串界面窗口如上图,大家可以看到都是些很有意思的字符串,根据这些字符串我们脑海里对软件的相关东西就有了些清明。比如要找登录相关的,我们就可以找Login或者LoginInfoMrg,如果要找数据库相关的就找:Db,sqlite......
可能大家一看,觉得那还蛮简单的,那其实不是的,逆向的厉害程度都是要靠经验,多找才能积累起来的,比如咱们要找数据库句柄,也并非找sqlite关键字,虽然sqlite关键字也可以找到,但是要绕好远好远的路。
今天就教大家快速找到主数据库句柄的关键字,为什么是主数据库句柄呢。因为微信是有好几个sqlite库的。咱们要找是跟通讯录,微信群有关的数据库句柄。
那咱们就在字符串界面窗口”Ctrl+f",在输入栏里输入“AccountStorageMgr::initStorage”,我们会发现只找到了1个结果,这样是非常好的,因为如果有多个结果,就增加我们分析的难度了。
3.找到后,我们鼠标双击它。跳转到对应的汇编代码窗口,我们鼠标点击前面的变量名的地方,按快捷键“X"弹出看有哪些地方引用了这个变量
如上图,我们可以看到有3个地方引用了这个变量名,但是好在都是在同1个函数里面。这样子就非常方便我们分析了,很精准的一个关键词。我们就点第1个引用的地方,点击过去。跳到如下图的地方
4.接着我们按"F5"快捷键,查看伪c代码。一到这个伪C代码,我相信大家心情愉悦了不少,毕竟比看汇编亲切多了。
我们看函数的开头有这样了个赋值语句
v0 = (_DWORD *)dword_11AB0E0C;
恭喜你,找到我们要的东西了,这个语句就是把数据库句柄赋值给v0,那我为什么会知道是句柄赋值呢,这个就是前面说的要多找多练,多在od里面走迷宫,才能在ida里面快速定位基址。
5.最后一步,我们要找出偏移。首先我们要看下ida的基址,字我就不打了,大家看截图
1).
2).
图片里面的value值:0x10000000,就是基址了。
偏移的话,就是取变量的地上(变量名后面那一串数字)减去基址就是结果了
偏移:0x11AB0E0C-0x10000000=1AB0E0C
记住是16进制的。
完美收官。
接下来的"微信群成员批量导出/提取工具"文章,我们来讲怎么定位相关的sqlite数据库函数。