文章目录

  • 写在前面
  • 备份函数
  • 编写测试程序
    • 配置环境
    • 编译
  • OD调试
  • 结果
    • OD地址
    • IDA地址
  • 写在后面

写在前面

上一篇文章,介绍了如何使用找到的数据库句柄和sqlite3_exec函数执行SQL,本篇文章,来尝试定位微信中备份sqlite数据库的相关函数,为下一篇文章要实现的在线备份做铺垫。

备份函数

开始找之前,要明确需要找的目标,先看一段别人写的备份函数:

int backupDb(sqlite3* pDb, const char* szFilename,void(*xProgress)(int, int)
) {int rc;sqlite3* pFile;sqlite3_backup* pBackup;//打开数据库rc = sqlite3_open(szFilename, &pFile);if (SQLITE_OK == rc) {//初始化获取一个备份对象pBackup = sqlite3_backup_init(pFile, "main", pDb, "main");if (pBackup) {do {//每次备份5页rc = sqlite3_backup_step(pBackup, 5);//通知更新进度xProgress(sqlite3_backup_remaining(pBackup),//还剩余需要备份的页数sqlite3_backup_pagecount(pBackup)//备份的总页数);if (SQLITE_OK == rc || SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {//睡眠sqlite3_sleep(250);}} while (SQLITE_OK == rc || SQLITE_BUSY == rc || SQLITE_LOCKED == rc);//完成备份sqlite3_backup_finish(pBackup);}rc = sqlite3_errcode(pFile);}sqlite3_close(pFile);return rc;
}

这段代码需要的三个参数,分别是需要备份的数据库句柄、备份后保存的文件名,以及一个回调函数。
句柄我们已经拿到,保存的文件名和回调函数是自定义的,三个参数没有需要特别注意的,函数里面用到的几个sqlite函数是关注的重点。
作为一个半吊子,无法解释为什么用到这几个函数,也不再深究,只需要知道它可以正常工作就好。整理一下:

sqlite3_open // 打开数据库
sqlite3_backup_init // 初始化获取一个备份对象
sqlite3_backup_remaining // 还剩余需要备份的页数
sqlite3_backup_pagecount // 备份的总页数
sqlite3_sleep // 睡眠
sqlite3_backup_finish // 完成备份
sqlite3_errcode // 应该是检查是否有错误
sqlite3_close // 关闭数据库

编写测试程序

配置环境

在准备阶段已经下载了sqlite3 3.28.0的源码包,解压后将其整理一下,标头和源码分开:

现在,使用VS2019新建一个空项目,将sqlite3中的标头和源代码都包含进去:
添加包含目录

添加源文件

在第一篇文章找到的资料里,前辈们帮我们踩了一些坑,在编译之前,需要在sqlite3.h中添加一处宏定义:

#ifndef SQLITE3_H
#define SQLITE3_H
// 添加这一句
#define SQLITE_CORE 1
#include <stdarg.h>     /* Needed for the definition of va_list */

此外,需要将以下文件排除出项目:
fts1.c
fts2.c
fts3_tokenizer.c
geopoly.c
icu.c
tclsqlite.c
最后,关闭内联函数扩展,避免函数入口被编译器优化掉:

编译

接下来编写测试程序,并在OD中调试找到函数特征码。测试程序如下:

#include <iostream>
#include <windows.h>
#include "sqlite3.h"int create(sqlite3** db) {int rc = sqlite3_open("test.db", db);string sql = "CREATE TABLE IF NOT EXISTS Test (bin BLOB)";rc = sqlite3_exec(*db, sql.c_str(), NULL, NULL, NULL);return rc;
}int main() {sqlite3* db = NULL;int rc = create(&db);return 0;
}

平台配置选择ReleaseWin32(x86),然后右键项目->生成,等待编译完成。

OD调试

编译完成后,得到了测试程序,接下来要在OD中进行分析,这里不建议使用吾爱版OD,它对函数加了很多修饰符(不知道是否可以通过设置取消),而看雪提供的OllyICE不存在此问题。
程序启动后会立刻断下,不需要运行,只需按Ctrl+G,输入函数名并跳转:

跳转到目标函数入口:

00AEBCF0 >/.  55            push    ebp
00AEBCF1  |.  8BEC          mov     ebp, esp
00AEBCF3  |.  8B55 0C       mov     edx, dword ptr [ebp+C]
00AEBCF6  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
00AEBCF9  |.  6A 00         push    0
00AEBCFB  |.  6A 06         push    6
00AEBCFD  |.  E8 4EF9FFFF   call    openDatabase
00AEBD02  |.  83C4 08       add     esp, 8
00AEBD05  |.  5D            pop     ebp
00AEBD06  \.  C3            retn

然后,使用特征码8B 55 0C 8B 4D 08 6A 00 6A 06在IDA中搜索(可以在OD中选中汇编代码,右键->二进制->二进制复制来获取特征码),IDA中可以按Alt+b打开二进制搜索窗口:

搜索到的地址:

双击查看:

只能说完全一样。

sqlite3_open的地址就确定了,为WeChatWin.dll + 0x138ACD0
这个找起来是如此的简单,但并不是所有的都这么简单,特征码检索不到时,可以尝试以下办法:

  1. 比对特殊的立即数,比如sqlite3经常用到的0x4B771290、0xA029A697、0xF03B7906
  2. 字符串,比如sqlite3_backup_init可以使用source and destination must be distinct来定位。
  3. 交叉引用,比如sqlite3_close调用了sqlite3Close,就可以先定位到sqlite3Close,然后根据引用关系找到sqlite3_close
  4. 参数比对,当搜索出的地址过多时,可以根据源码中函数所需的参数数量(IDA中函数头部有arg和var,是参数和局部变量)来确定到底是哪一个。
  5. 地址距离比对,比如在OD中找到sqlite3_open的地址是100,sqlite3_close地址是300,在IDA中找到的sqlite3_open地址是1000,那么IDA中sqlite3_close的地址应该在1200附近,虽然无法确定具体地址,但是这个相对距离可以帮助我们在一堆函数中快速筛选。

结果

剩下的函数就不写具体的找法了,都可以通过函数名在OD里直接跳转。IDA中寻址就留作读者的作业吧,这里提供一份参考答案:

OD地址

在比对地址距离的时候可以使用。

sqlite3_open = 0091BBC0
sqlite3_backup_init = 008CDF40
sqlite3_backup_step = 008CE2B0
sqlite3_sleep = 0091C110
sqlite3_backup_finish = 008CE760
sqlite3_close = 0091A1B0
sqlite3_backup_remaining = 008CE830
sqlite3_backup_pagecount = 008CE840
sqlite3_errcode = 0091B090

IDA地址

微信版本:3.6.0.18

sqlite3_open = 1138ACD0
sqlite3_backup_init = 1131C110
sqlite3_backup_step = 1131C510
sqlite3_sleep = 1138B510
sqlite3_backup_finish = 1131CB50
sqlite3_close = 113880A0
sqlite3_backup_remaining = 1131CC50
sqlite3_backup_pagecount = 1131CC60
sqlite3_errcode = 11389970

写在后面

本文介绍了如何通过特征码等方式定位备份所需的函数,下一篇文章,将使用找到的信息,褪去微信数据库的神秘面纱,完成数据库在线备份!

PC微信逆向--定位备份sqlite数据库相关函数相关推荐

  1. PC微信逆向--定位sqlite3_exec和数据库句柄

    写在前面 最近在做PC端微信逆向,搞定了基本的收发消息,通讯录获取等,这期间遇到一个小小的问题,从通讯录获取到的内容不全,除非登录后手动点击过某个好友,不然获取不到头像.V3等,所以产生了解密数据库的 ...

  2. PC微信逆向--在线备份数据库

    写在前面 在前面三篇文章,已经找到数据库句柄.sqlite3_exec函数和一系列备份用的函数地址,本篇文章,尝试完成微信数据库在线备份. 回顾 数据库句柄 [[WeChatWin.dll + 0x2 ...

  3. PC微信逆向--调用sqlite3_exec执行SQL

    文章目录 写在前面 回顾 sqlite3_exec 回调函数 函数指针 编写代码 注入的DLL 注入程序 输出结果 写在后面 写在前面 上一篇文章,实现了定位保存微信数据库句柄的容器和微信内部的sql ...

  4. android 模拟器 sd卡文件 fileexport,备份SQLite数据库文件到SD卡

    所以我见过很多备份SQLite数据库文件到SD卡的例子,我已经得到这个在开发中的android模拟器上成功工作,但它不能按预期工作在电话本身.这是我不明白的奇怪部分.备份文件实际上是在SD卡上创建文件 ...

  5. PC微信逆向--看看哪些好友删除了自己

    文章目录 写在前面 微信版本 资料 Duilib界面 定位发送CALL 具体原理 关键代码 写在后面 写在前面 搞微信逆向也有一段时间了,实现了发送文本.图片.文件.名片.xml文章消息,以及获取好友 ...

  6. pc微信逆向最新3.9.2.23版本

    最近想做个微信机器人,就研究了pc端的微信逆向,发现网上开源的项目挺多的,但是都是一些老版本的,3.7版本的基本上很少,3.8的更少了,现在3.9版本开源的很少.不过还是发现了两个开源项目,特分享备忘 ...

  7. 【原创】PC微信逆向分析のWeTool内部探秘

    作者:zmrbak(赵庆明老师) 前言: 先不说微信在社交领域的霸主地位,我们仅从腾讯公司所透露的在研发微信过程中踩过的无数的坑,以及公开的与微信相关的填坑的源代码中,我们可以感受到,单从技术上讲,微 ...

  8. PC微信逆向:分析发送xml名片call

    文章目录 微信版本 定位发送xml名片call 发送xml名片call的切入点 定位选择联系人的call 定位发送xml名片的call 定位接收者的微信ID 定位发送xml名片的call 验证发送xm ...

  9. PC微信逆向:实现自动添加好友分享名片

    文章目录 如何实现自动添加好友分享名片 定位加好友call相关思路 定位微信加好友call 定位加好友call的微信ID 定位微信加好友call 验证加好友call 微信加好友call的分析 添加名片 ...

最新文章

  1. matplotlib pcolormech 用法
  2. C 回顾 volatile 和 register 修饰符
  3. 第九章-构建图形用户界面
  4. 安卓系统底层C语言算法之测试参数是几个long型的算法
  5. bootstrap五星评分_星型打分插件 bootstrap-rating-input
  6. Comptia Strata认证考点相关情况【2018.06.05更新】
  7. C#连接sqlServer数据库详解
  8. 【theano-windows】学习笔记十三——去噪自编码器
  9. python用一行代码编写一个回声程序_使用Python的多回声测验
  10. sklearn模型使用贝叶斯优化调参(以随机森林为例)
  11. 用机器学习来预测情侣间何时吵架,这是一个很实用的算法
  12. centos7 安装 php7
  13. linux 6.5 :qw,rhel 6.5替换centOS6的网易yum源
  14. matlab中K=[K,temp]含义
  15. rename 命令批量修改后缀
  16. php 模拟登陆微云,微云 - HHTjim'S 部落格
  17. 必须要了解的编程基础--哈希与字符串
  18. steps_per_epoch=2000,epochs=100之间的区别
  19. 佩尔方程(超详细推导+例题讲解) 每日一遍,算法再见!
  20. 使用cv2.VideoCapture()函数捕获笔记本内置摄像头的拍摄画面

热门文章

  1. 趣丸集团招股书“失效”,旗下TT语音已下架,如何实现稳定增长?
  2. springboot毕设项目软件外包服务39e05(java+VUE+Mybatis+Maven+Mysql)
  3. Infortrend新一代GS统一存储系统性能全面提升
  4. linux文本界面发邮件,柴少鹏的官方网站-linux发送邮件内容变成了tcmime.xxxx.xxxx.xxxx.bin的附件形式...
  5. 信息学奥赛一本通 1244:和为给定数 | OpenJudge NOI 1.11 07:和为给定数
  6. 鲍尔默炮轰纳德拉提出的通用Windows平台战略
  7. WordPress插件 Buddypress完美汉化版 社区插件
  8. 转载 如何用示波器进行UART串口数据分析
  9. PAT-2019年冬季考试-甲级 7-1 Good in C (20分)
  10. Android应用的界面编程