一、上期摘要
上一篇 文章,我们使用原生 SQLite 数据库引擎函数创建了一个演示数据库,我们的目标是将敏感信息保存到数据库并将之作为资源嵌入到程序中,以便在运行时实现某些诸如程序状态的收集、验证等操作。
通常情况下我们可以简单的将资源释放、保存到临时文件再加载获取数据以便完成相对隐蔽的操作。但既然是数据有敏感性,这种操作可能会造成了某些潜在的风险,我们的目标是资源数据不落地,所有操作都在内存中完成,完全避免上述可能的风险,接下来的文章就来完成这个目标。
二、资源编辑
上一篇文章我们使用 SQLiteDatabaseBrowserPortable 和原生 SQLite 函数分别生成了2个数据库文件,下面我们将这2个文件都作为资源嵌入到程序中,使用记事本新建一个 BNDemo.rc 的文件,保存在工程文件夹下,输入如图1所示的内容,描述资源名称、类型、文件路径即可。
再新建一个批处理文件 BuildRes.bat,输入如图2所示,批处理中主要是调用brcc32.exe来编译资源文件,同样保存在工程文件夹下。
运行 BuildRes.bat 可以发现在当前工程文件夹下生成了一个 BNDemoDb.res 的文件,如图3所示,这个就是我们在程序中使用到的资源。
接下来修改工程文件,加入嵌入资源语句,如下图4所示:
最后编译 Delphi 工程,然后使用 CFF Explorer 打开刚刚编译的工程文件查看其中的资源,图5显示了资源名称为“DB2”的二进制数据,可以清晰的辨识该资源数据就是由SQLiteDatabaseBrowserPortable 工具创建的未加密的数据库 demodb,作为对比再来看看资源“DB1”的二进制数据,如图6所示,可以看到由于该数据库已设置密码,无法直观的看到 SQLite 数据库文件头的标识 “SQLite format 3” 字样。
三、结语
作为示例,本文所使用的资源经过编译后直接嵌入到程序本身,实际工程中往往单独编译成资源文件,与程序本身分离。
至此,我们已完成了准备工作,下一篇我们将着重代码的实现,目标是完成资源不落地的场景下解析获取所需数据。