- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
问题
我希望将目标文件注入(inject)现有的二进制文件。作为一个具体的例子,考虑一个源 Hello.c
:
#include <stdlib.h>
int main(void)
{
return EXIT_SUCCESS;
}
它可以通过gcc -std=gnu99 -Wall Hello.c -o Hello
编译成名为Hello
的可执行文件。此外,现在考虑 Embed.c
:
func1(void)
{
}
目标文件 Embed.o
可以通过 gcc -c Embed.c
创建。我的问题是如何将 Embed.o
一般地插入到 Hello
中,以执行必要的重定位和适当的 ELF 内部表(例如符号表、PLT、等)打补丁了吗?
假设
可以假设要嵌入的目标文件已经静态链接了它的依赖项。可以假定任何动态依赖项(例如 C 运行时)也存在于目标可执行文件中。
当前的尝试/想法
libbfd
将对象文件中的部分复制到二进制文件中。我在这方面取得的进步是我可以用原始二进制文件的部分和目标文件的部分创建一个新对象。问题在于,由于目标文件是可重定位的,因此如果不先执行重定位,就无法将其部分正确复制到输出中。ld
重新链接。到目前为止,我尝试使用 objcopy
执行转换 objcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o
。显然这并不像我预期的那样工作,因为 ld -o Hello2 Embed.o Hello.o
将导致 ld: error: Hello.o: unsupported ELF file type 2
.我想这应该是预料之中的,因为 Hello
不是目标文件。基本原理(可选阅读)
我正在制作一个静态可执行编辑器,其愿景是允许将任意用户定义的例程检测到现有的二进制文件中。这将分两步进行:
在大多数情况下,我已经完成了步骤 2 所需的工作,但是我在注入(inject)目标文件时遇到了问题。考虑到其他工具使用相同的对象注入(inject)方法(例如 EEL ),这个问题肯定是可以解决的。
最佳答案
如果是我,我会在共享对象 libembed.so
中创建 Embed.c
,如下所示:
gcc -Wall -shared -fPIC -o libembed.so Embed.c
这应该从 Embed.c
创建一个可重定位的共享对象。有了它,您可以通过在运行时设置环境变量 LD_PRELOAD
来强制您的目标二进制文件加载此共享对象(请参阅更多信息 here ):
LD_PRELOAD=/path/to/libembed.so Hello
这里的“技巧”是弄清楚如何进行检测,特别是考虑到它是一个静态可执行文件。在那里,我帮不了你,但这是将代码存在于进程内存空间中的一种方法。您可能希望在构造函数中进行某种初始化,您可以使用属性进行初始化(如果您使用的是 gcc
,至少):
void __attribute__ ((constructor)) my_init()
{
// put code here!
}
关于c - 如何将 'link' 目标文件转换为可执行/编译的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9449845/
我通常从以下位置获取代码:https://www.w3schools.com .这个代码还有一个 Accordion ; 但是,当我使用链接 -> 到 Accordion 时, Accordion 不
我见过的所有 JNI 指南(例如 JNI runtime linking )都建议我将 JNI 库链接到 libjvm.so: $ gcc -I${JAVA_HOME}/include -c -o t
实现以下目标的正确 URL 格式是什么: 使用 Universal Link 在 iOS 上的另一个应用程序中打开 Google map 应用程序。 根据两个坐标设置目的地:纬度和经度,并让用户选择交
我已经查看了 Microsoft 的 MSDN 和整个网络,但我仍然无法很好地了解它是什么。 这是否意味着已完成的程序在执行期间的不同时间加载 DLL,而不是在启动时一次性加载所有 DLL? 我完全偏
我有一个看起来像这样的 css: .browse-link A:link { color: #F6CA4C; text-decoration: none; } .browse-link
当我点击“产品”链接时,它突然指向#link。我怎样才能使它的外观看起来像滚动然后转到产品?请帮帮我。 vStudy function big(x){
我想在保存之前更改从输入字段中获取的值。 params[:link]['url'] = "www.facebook.com/redbull" 现在我只想将“redbull”放入数据库。以下代码失败,因
我正在使用链表编写程序(真是一场噩梦)。 无论如何,该程序的目的是输入 8 个字符,然后让程序将字符打印回给您,并以相反的顺序打印回字符,当然是使用链表。 到目前为止我已经明白了。它有很多错误(我认为
基本上,我删除了 anchor 按钮,因此链接窗口中不应该有指向 anchor 选项的链接。 有什么方法可以删除该下拉选项 ? 最佳答案 想通了 if ( dialogName == 'link' )
我的本地(和远程)SQL SERVER 2005 管理员都声称“允许链接服务器是一个安全问题”并禁止在此处使用它们。 (哈?) 无论如何,有没有办法在没有链接服务器的情况下做类似的事情? SELE
如果我有: linkedlist1= 1,2,3,4; 和 linkedlist2= 5,6,7; 如果我调用: linkedlist2.set(0,9999) 它会更改为 linkedlist2 =
首先,如果这个问题看起来很愚蠢,我很抱歉,但我仍在学习 React 和 html。所以问题是我的 react 代码中有一个按钮标签,它为我提供了一些关于进入我提供的特定链接的逻辑。我的 Button.
我将制作一个文本 block ,这样如果您单击一个单词,它就会被词汇替代品所替换。 例如“fearful-of-cats”是“ailurophobic”的词汇替代品,因为如果您在任何文本中将后者替换为
我有以下代码 Can you click me? 目标是我可以点击“你能点击我吗”框并转到 google 并在包含 div 的任何其他地方
这是一个案例: 默认情况下,如果我点击#2、#3、#4、#5,我将被重定向到#1。 如果我想在没有 #1 激活的情况下点击输入,我该如何修复 CSS? 提前
有没有什么快速的方法可以使 :visited 链接的颜色与链接本身的颜色相同? 例如: * {color:black} a:link {color:blue} a:visited {color:inh
我读到从 iOS 9 开始,引入了通用链接。请解释深层链接和通用链接之间的区别。我的目标是,一个链接将通过邮件发送给客户。让邮件说有一个项目 A 的报价和一个链接。单击链接时 如果安装了该应用程序,则
因此我们需要对 CSS anchor 伪类使用以下顺序 a:link { color: red } a:visited { color: blue } a:hover { color
我组件的当前路径是http://localhost:3000/dashboard/questionnaire/5bf79ff4c45a150015cef7a9在这个组件里面有 Financials 如
我 rsync 目录“Promotion”包含两台具有不同目录结构的机器之间的绝对符号链接(symbolic link)。因此绝对符号链接(symbolic link)在两台机器上都不起作用。为了使它
我是一名优秀的程序员,十分优秀!