软件是为delphi开发的软件,主要功能为企业开发票存储客户信息并可以读取其他开票软件的信息.主要是对它如何读取其他软件的信息有比较浓厚的兴趣.因为是delphi开发的,当然首先想到的就是dede,结果网络上找了几个版本在我的电脑上均不能正常运行,没办法只能硬着头皮弄了.先说思路:
因为软件的同目录下有个xxx.db所以第一反应就是sqlite数据库.sqllite是个非联网的数据库,所有的操作全在本地.于是就从文件访问相关的地方下手了,
在CreatefileW下断点,经过几次调用后果然发现了调用的地方,如下:
(出于对软件的保护,隐去相关信息)
CTRL+F9,返回一次后发现还不是主模块调用的地方.
再返回一次发现来到了这里
看格式应该是调用的一个虚函数,继续返回到主模块的地方去看
于是下断后重新运行软件,再次断下后
eax显示出了库的函数名,这样就省下自己逆向的过程了,因为sqlite的源码是公开的,通过查询得知,这个函数有2个参数,而看这个地方应该是个__cdel的调用方式,
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
经过验证果然第一个参数正是db的路径,而db handle 此时还未产生
经过此函数后db handle的值 如下:
此时的思路大体如下,几乎所有的sqllite的函数都需要这个db handle,所以直接在db handle上下硬件访问断点那么在open函数后的所有对sqllite操作的动作都会被断下的
F9运行后第一次断下来到此处
又看到了熟悉的call eax,单步到此语句处看看调用的是啥函数
哈.sqlite3_key.
函数原型如下
第二个参数就是访问数据库的key了,内部我稍微跟踪了下发现是自己重写了算法,不在本次追踪之列就不用理会了,因为此函数在一个dll导出的,所以我们写代码的时候直接调用相关dll就可以了
至此就能正常访问整个数据库了,
思路就是
loadlibraryA("xxx.dll");
getprocname("sqlite3_open");
getprocname("
sqlite3_key
");
然后剩下的就是调用sql语句进行查询了...
注册多年未有贡献,仅此向初学者提供思路.望各位大牛海涵.
软件不用问我,此类软件市面应该很多,我发现可能是出于对兼容其他同类软件的想法?他们都会用sqlite数据库..
by:落花满怀
QQ:394297602
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)