如何挂钩时间功能

时间:2016-10-08 07:11:41

标签: c++ linux windows api

大家。我有一个项目调用一些函数来获取时间,如

  

time_t t =时间(NULL);

#ifndef _WIN32
    timespec ts;
    if( -1 == clock_gettime(CLOCK_MONOTONIC,&ts) )
        GenErrnoErr()
    return uint64( ( ((uint64)ts.tv_sec*1000 + (uint64)ts.tv_nsec/1000000) - m_uBaseTime ) * ms_dTimeRatio ) ;
#else
    LARGE_INTEGER uTime;
    QueryPerformanceCounter(&uTime);
    return uint64(  ( uint64(uTime.QuadPart/CFrequency::Instance().Get().QuadPart) - m_uBaseTime ) * ms_dTimeRatio );
#endif

`

我将wana挂钩所有这些时间func,而不更改代码存在。当它调用时间(NULL)或其他函数时,它返回我伪造的时间。

2 个答案:

答案 0 :(得分:1)

完成此类操作的常用方法是使用链接器的--wrap选项。它的工作原理如下:

  1. 编写替换函数,但不要将其命名为time(...),请将其命名为__wrap_time(...);
  2. 在您的替换功能中,如果您需要拨打原始time()功能,请实际拨打__real_time();
  3. 链接程序时,请添加以下选项:--wrap=time。这将使链接器将任何其他模块的调用链接到time()__wrap_time(),但仍然允许通过time()调用原始__real_time()函数。 / LI>

    因此:

    // Need this to satisfy the compiler
    extern time_t __real_time(time_t *seconds);
    
    time_t __wrap_time(time_t *seconds) {
        if (seconds==NULL) {
            return 0;
        } // if
        return __real_time(seconds)
    } // __wrap_time(seconds)
    

答案 1 :(得分:0)

将过程中的函数绕过钩子。您需要注入一个dll来挂钩它,并在原始函数结尾中的钩子函数地址中添加一个jmp。更多信息也会有所帮助......