如何绕过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" ./你的二进制程序路径
- 先安装libfaketime:
其他可选方案
如果需要调试场景下临时跳过延时,也可以用gdb附加到进程:
- 给clock_nanosleep打断点:
b clock_nanosleep - 每次命中断点后,直接设置返回值并跳过函数执行:
set $rax=0然后jump *$rsp
内容的提问来源于stack exchange,提问作者Yukie_ch
相关产品推荐
相关产品推荐

