我想更改ELF可执行函数调用并替换其参数之一。
可执行文件调用dlopen()函数并将RTLD_NOW作为标志参数传递。
我想将其更改为RTLD_LAZY

最简单的方法是检测此调用的确切位置并替换参数。

我必须在生产环境中执行此操作,所以我只有GNU工具链,gcc,gdb等

评论

您是在谈论永久修补可执行文件或在运行时进行修改吗?

都。在运行时对其进行测试。然后坚持下去。

从理论上讲,LD_PRELOAD是您的朋友,但是鉴于dlopen是在加载程序中实现的,因此这种方法很可能会失败。

#1 楼

最简单的方法是使用gdb。在dlopen函数上设置一个断点,并更改参数(可能在堆栈上传递)。 RTLD_NOW定义为2。只需将其更改为1(RTLD_LAZY)。

总而言之,请参见gdb模式参数的地址。

评论


如何保存它,是否可以从gdb进行?

–烛光
13年8月4日在19:39

您可以使用十六进制编辑器,查找到在GDB中中断的偏移量,然后将1更改为2。

– jvoisin
13-10-26在14:23