2016-10-08 19 views
1

EveryOne。私は時間を得るためにいくつかの関数を呼び出すプロジェクトを持っています。フック時間機能

time_t = time(NULL);私罠が存在するコードを変更せずに、すべてのこの時間funcをフックするが何であるかを

#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 

`

。時間(NULL)やその他の関数を呼び出すと、私が偽造した時刻を返します。

+0

? 'gcc'? –

答えて

1

この種のことが行われる通常の方法は、リンカーに--wrapオプションです。それは次のように機能します。

  1. はなく、代わりにそれtime(...)を、命名の、あなたの置換機能を書くという名前を付け__wrap_time(...)
  2. 交換機能では、元のtime()関数を呼び出す必要がある場合は、実際には__real_time()を呼び出します。
  3. プログラムをリンクするときは、次のオプションを追加してください:--wrap=time。これにより、リンカーは他のモジュールの呼び出しをtime()にリンクして__wrap_time()にリンクしますが、元のtime()関数は__real_time()で呼び出すことができます。

したがって:あなたが使用しているコンパイラとリンカ

// 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) 
0

プロセスの機能をあなたのフックに迂回します。フックするにはdllを注入し、元の関数のエピローグ内でフック関数のアドレスにjmpを追加する必要があります。いくつかの情報があまりにも助けになるでしょう...