案例研究:从 Delphi 软件中提取数据库

逆向工程 艾达 解密
2021-06-23 14:02:52

这是我在这里的第一篇文章(希望不是最后一篇!)

首先,我得说我不是 RE 专家,所以我可能听起来有点困惑。

所以我有一个由两个文件组成的 Delphi 程序(就你而言):

  • 程序.exe
  • 程序.bin

program.bin 是一个数据库,我的最终目标是提取它。通过提取,我的意思是有一个原始的 db 文件或一些有形的并且不缺少任何信息的东西。

该程序是一个 GUI 应用程序,除了加载数据库并在两列中显示它之外什么都不做(至少这是我看到的)。

项目简介

  • 语言:Borland Delphi 6-7(感谢 PEiD)
  • 使用的 IDE:RAD Studio(最有可能)

我做了什么

  • 我试过 DeDe,但由于某种原因 program.exe 没有完全加载(我猜这使得反编译变得更加困难)。
  • 我尝试了(几乎)所有 BDE 类型的数据库查看器(paradox、dBase 等)。为什么?因为我在 Olly 中滚动汇编代码时发现了这些字符串。除了一个,他们都没有成功。他们中的一些人在开场时坠毁,另一些人说它的标题不正确。有效的是密码恢复程序,它没有拒绝文件,而且还告诉我密码!:D。
  • 我尝试了很多文件类型检测程序。除了“文件分析器”之外,所有这些都失败了,它告诉我 99% 的准确率 [原文如此] 这是 VisiCalc 文件,来吧不可能是真正的 xD。
  • 我尝试过 Process Monitor 并看到 program.bin 是由 64 字节的块读取的。(不确定这是否是有用的信息)。
  • 我还尝试了一些著名的分析工具(idr、Olly),尝试观察代码数小时,但由于我不了解,我无法使用它们。

观察

  • 除此之外,我在程序集中发现了“paradox”、“dBase”字符串,我还看到它与 cryptbase.dll 有某种关系,这让我认为它可能被加密了,但令人惊讶的是,IDA 并没有在其中列出 cryptbase.dll导入库列表。
  • 在检查 IDR 的结果时,我看到 program.exe 实际上有一个 dblogin 形式。如果这真的存在,那么我猜它是不可见的。

所以我的问题是我能做什么?我怎样才能把自己放在组件之间,以便我可以看到它的作用?

PS 我可以放一个链接到可执行文件,但我不想让它具体。我打算在这里学习通用技术。

注意:这纯粹是为了教育目的,因为我已经有了这个数据库。我所做的基本上是转储程序放置其数据库的内存。(顺便说一句,有没有什么小工具可以转储特定范围的内存?我在任务管理器中使用了Win7的原始转储程序)

1个回答

不是真正的答案,但评论太长了。

您的程序可能用于LoadLibrary加载 cryptbase.dll。开始奥利上放置断点LoadLibraryALoadLibraryW和检查会发生什么。

64 字节(256 位)是各种加密算法的输入块大小。您的程序可能使用其中之一,通过cryptbase.dll或编译到程序中。检查signrch以查看您的程序是否包含各种加密算法使用的任何常量。

请记住,进程监视器可以向您显示它拦截的每个 API 调用的堆栈。如果 64 字节的每次读取都源自 .exe 中的相同地址,但堆栈更靠上的地址各不相同,则最后一个公共地址可能是某个read_and_decrypt()子例程。这是放置断点的好地方。

有时,让原始程序完成其工作比破解所有内容更容易。您的程序可能会在某处使用一个函数,将一行添加到要显示的表中。如果你能找到这个函数,你可以创建一个打开文件的绕道,将行数据附加到它,然后关闭它。