gpt4 book ai didi

Linux:从可执行文件更新嵌入式资源

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:08 24 4
gpt4 key购买 nike

我有一个可执行文件,其中我使用 objcopy 方法嵌入了一个二进制文件资源

objcopy --input binary --output elf32-i386 --binary-architecture i386 data.txt data.o

链接到data.o并使用

extern char _binary_data_txt_start
extern char _binary_data_txt_end

现在是否可以更新可执行文件中的数据?更新的数据可以具有相同的精确大小,我只需要更改一些位即可。

在 Windows PE 文件中,使用 UpdateResource()

非常简单

最佳答案

没什么特别的,也没什么难的。我将在下面给出正确的顺序,但首先让我稍微纠正一下您的嵌入方法。不要显式使用 objcopy,而是使用 GNU LD 来获取 ELF 文件中的正确条目。

让我们开始吧。这是 test-emb.c 文件:

#include <stdio.h>

extern unsigned char data[] asm("_binary_data_txt_start");

int
main (void)
{
fprintf(stderr, "%u, %u, %u\n", data[0] - '0', data[1] - '0', data[2] - '0');
return 0;
}

这是名为 data.txt 的资源

12345678

这是另一个名为 newdata.txt 的资源

98765432

现在编译和链接:

$ gcc test-emb.c -c -m32
$ gcc -o test-emb test-emb.o -Wl,--format=binary -Wl,data.txt -Wl,--format=default -m32

尝试:

$ ./test-emb 
1, 2, 3

现在开始跳舞。第一步:确定数据段的逻辑和物理地址:

$ readelf -S test-emb | grep "\.data" | awk '{print $4}'
080496b8

$ readelf -S test-emb | grep "\.data" | awk '{print $5}'
0006b8

第二步:二进制数据的起始和大小:

$ readelf -s test-emb | grep _binary_data_txt_start | awk '{print $2}'
080496c0

$readelf -s test-emb | grep _binary_data_txt_size | awk '{print $2}'
00000009

第三步:做数学。我们确实需要:找到数据中二进制数据的偏移量,并将其转换为物理起点:

$ echo $((0x080496c0 - 0x080496b8))
8
echo $((0x0006b8 + 8))
1728

第四步:实际替换(计数值为二进制数据大小,taht为9):

cat newdata.txt | dd of=test-emb bs=1 seek=1728 count=9 conv=notrunc

现在再次检查:

$ ./test-emb 
9, 8, 7

一切正常。您可以轻松地将此方法折叠到脚本中,而不是更难使用,即 Windows 下的 UpdateResource,但我想让您了解事情的进展情况。

关于Linux:从可执行文件更新嵌入式资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26649221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com