1

IATパッチメカニズムを使用してHeapAllocへのすべての呼び出しをフックするメモリ追跡アプリケーションを作成しています。アイデアは、HeapAllocへのすべての呼び出しをキャプチャし、コールスタックを取得することです。

ただし、現在、DBGHELPAPIを使用してコールスタックを取得する際に問題が発生しています。dbghelpdll自体がMSVCRTdllにリンクしており、この依存関係により再帰呼び出しが発生することがわかりました。ターゲットアプリケーションからの呼び出しのいずれかに対してコールスタックを取得しようとすると、dbghelpはMSVCRTから内部的にHeapAllocを呼び出すメソッドを呼び出します。また、MSVCRTにパッチを適用しているため、無限ループが発生します。

誰かがこの問題に直面してそれを解決しましたか?この行き詰まりから抜け出す方法はありますか?

4

3 に答える 3

3

これは、関数インターセプトコードの標準的な問題です。共有メモリライブラリが情報をログに記録する必要がある一方で、共有メモリを使用してログレベルの情報を保存するログライブラリでも同様の問題が発生しました。

私たちがそれを修正した方法はあなたの状況に適用できると私は信じています。

インターセプトコードでは、インターセプトの最中であるかどうかを示す静的フラグを維持します。インターセプトが呼び出され、フラグが設定されていない場合は、フラグを設定してから、DbgHelpの呼び出しを含め、現在行っていることを実行してから、フラグをクリアします。

フラグが設定されているときにインターセプトが呼び出された場合は、他の処理を行わずにバックエンドのHeapAllocコードのみを呼び出します(無限再帰の原因であるDbgHelpの呼び出しを含む)。

(擬似コード)の線に沿った何か:

function MyHookCode:
    static flag inInterceptMode = false
    if inInterceptMode:
        call HeapAlloc
        return
    inInterceptMode = true
    call DbgHelp stuff
    call HeapAlloc
    inInterceptMode = false
    return

function main:
    hook HeapAlloc with MyHookCode
    : : :
    return
于 2009-05-11T05:32:40.220 に答える
0

GlowCodeのようないくつかの実際のメモリ追跡製品を使用するのはどうですか?

于 2009-05-11T05:30:55.150 に答える
0

Deviare API Hookを使用すると、多くの問題があるAPIを使用せずに、完全なスタックトレースを取得できます。

于 2010-11-15T20:02:46.897 に答える