这很棘手,我想你可以这样做......顺便说一句,我已经下载了 libmagic 源并查看了它......
magic_read_entries
里面有一个函数调用minifile.c
(这是我从sourceforge下载的纯香草源代码,它正在从外部文件中读取。
您可以将magic
文件(位于 /etc 目录中)附加到库代码的末尾,如下所示cat magic >> libmagic.a
。在我的系统中,magic
是474443字节,libmagic.a
是38588字节。
在magic.c
文件中,您需要更改magichandle_t* magic_init(unsigned flags)
函数,在函数末尾添加行magic_read_entries
并修改函数本身以读取库本身的偏移量以拉入数据,将其视为指向指针的指针char (char **) 并使用它而不是从文件中读取。既然您知道要读取的库数据的偏移量在哪里,那应该不难。
现在该函数magic_read_entries
将不再被使用,因为不再从文件中读取它。函数 `magichandle_t* magic_init(unsigned flags)' 将负责加载条目,你应该没问题。
如果您需要进一步的帮助,请告诉我,
编辑:
我使用了 sourceforge.net 中的旧“libmagic”,这就是我所做的:
- 将下载的存档解压缩到我的主目录中,解压缩/解压缩存档将创建一个名为libmagic的文件夹。
- 在 libmagic 中创建一个文件夹并将其命名为Test
- 将原始的magic.c和minifile.c复制到Test
- 使用封闭的 diff 输出突出显示差异,将其应用于magic.c源。
48a49,51
> #define MAGIC_DATA_OFFSET 0x971C
> #define MAGIC_STAT_LIB_NAME "libmagic.a"
>
125a129,130
> /* magic_read_entries 已过时... */
> magic_read_entries(mh, MAGIC_STAT_LIB_NAME);
251c256,262
<
---
>
> if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){
> 如果 (ftell(fp) != MAGIC_DATA_OFFSET) 返回 0;
> }其他{
> 返回 0;
> }
>
- 然后发出make
- 魔术文件(我在 Slackware Linux 12.2 下从 /etc 复制)连接到 libmagic.a 文件,即
cat magic >> libmagic.a
. 魔术的 SHA 校验和是 (4abf536f2ada050ce945fbba796564342d6c9a61 magic),这是魔术的确切数据 (-rw-r--r-- 1 root root 474443 2007-06-03 00:52 /etc/file/magic)系统。
- 这是minifile.c源的差异,应用它并通过再次运行make重建 minifile 可执行文件。
40c40
<magic_read_entries(mh,"magic");
---
> /*magic_read_entries(mh,"magic");*/
它应该工作。如果没有,您将需要通过修改 MAGIC_DATA_OFFSET 来调整库中的偏移量以供读取。如果您愿意,我可以将魔术数据文件粘贴到 pastebin 中。让我知道。
希望这会有所帮助,最好的问候,汤姆。