You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绕过ELF二进制程序中使用CLOCK_REALTIME的clock_nanosleep延时?

存在多种可落地的方法跳过该二进制程序的clock_nanosleep延时逻辑,以下是对应你思路的实现方案:

方案1:LD_PRELOAD劫持libc调用(推荐)

这个方案匹配你「阻断time.h库调用」的思路,因为目标程序是动态链接到libc.so.6的,我们可以通过LD_PRELOAD机制优先加载自定义的同名函数,直接跳过真实延时逻辑:

  • 编写自定义函数源码fake_sleep.c:
#define _GNU_SOURCE
#include <time.h>

int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *req, struct timespec *rem) {
    // 直接返回成功状态,完全跳过延时
    return 0;
}
  • 编译为动态库:
    gcc -shared -fPIC fake_sleep.c -o fake_sleep.so
  • 运行目标程序时注入该动态库即可:
    LD_PRELOAD=./fake_sleep.so ./你的二进制程序路径

该方案无需修改原程序、无系统副作用,对stripped的动态链接二进制完全兼容,是优先选择的方案。


方案2:修改CLOCK_REALTIME计时逻辑

这个方案匹配你「修改时钟源计时」的思路,有两种实现方式:

  • 手动修改系统时间:直接将系统时间向后调整超过延时总长度,使用CLOCK_REALTIME的clock_nanosleep会检测到目标时间已到达,直接返回。该方案会影响全局系统时间,不推荐日常使用。
  • 使用libfaketime工具:通过LD_PRELOAD注入faketime库,在不修改全局系统时间的前提下,自定义程序可见的时钟流速:
    • 先安装libfaketime:apt install libfaketime(Debian/Ubuntu系)
    • 运行程序时设置时间加速倍率:
      LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 FAKETIME="+10000x" ./你的二进制程序路径

其他可选方案

如果需要调试场景下临时跳过延时,也可以用gdb附加到进程:

  • 给clock_nanosleep打断点:b clock_nanosleep
  • 每次命中断点后,直接设置返回值并跳过函数执行:set $rax=0 然后 jump *$rsp

内容的提问来源于stack exchange,提问作者Yukie_ch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:51:01