首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何挂钩时间函数

如何挂钩时间函数
EN

Stack Overflow用户
提问于 2016-10-08 07:11:41
回答 2查看 397关注 0票数 1

EveryOne。我有一个项目,它调用一些功能来获得时间,例如

time_t t= time(NULL);

代码语言:javascript
复制
#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

`

我的意思是在不改变代码存在的情况下,将所有这些时间挂起func。当它调用time(NULL)或其他func时,它会返回我伪造的时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-08 07:24:17

做这种事情的通常方法是使用链接器的--wrap选项。它的工作方式如下:

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

因此:

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2016-10-08 07:22:08

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39929748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档