4

CreatFile win32呼び出し(私の場合はCreateFileW)とその戻り値をダンプするためのピンツールを作成しました。次のようになります。

/* ... */

VOID Image(IMG img, VOID *v)
{
    RTN cfwRtn = RTN_FindByName(img, "CreateFileW");
    if (RTN_Valid(cfwRtn))
    {
        RTN_Open(cfwRtn);

        RTN_InsertCall(cfwRtn, IPOINT_BEFORE, (AFUNPTR)CreateFileWArg,
        IARG_ADDRINT, "CreateFileW",
        IARG_FUNCARG_ENTRYPOINT_VALUE, 0,
        IARG_END);
        RTN_InsertCall(cfwRtn, IPOINT_AFTER, (AFUNPTR)CreateFileWafter,
        IARG_FUNCRET_EXITPOINT_VALUE, IARG_END);

        RTN_Close(cfwRtn);
    }
}

/* ... */

VOID CreateFileWArg(CHAR * name, wchar_t * filename)
{
    TraceFile << name << "(" << filename << ")" << endl;
}

VOID CreateFileWafter(ADDRINT ret)
{
    TraceFile << "\tReturned handle: " << ret << endl;
}

それは興味深い結果をもたらします。たとえば、既存のファイルを開くだけで他に何もしない小さなプログラムでは、次のようになります。

CreateFileW(file.txt)
    Returned handle: 0
CreateFileW(file.txt)
    Returned handle: 0x74
    Returned handle: 0x74

たくさんの異常。1.)実際に2つの呼び出しがあるのはなぜですか?2.)私が間違っていなければ、CreateFileは決して0を返さないはずです。3。)2回目の呼び出しの後、2回(?)を返します。

また、 CreateFileWを1回直接呼び出す単純なc ++プログラムをインストルメント化しようとしましたが、その結果は次のようになります。

CreateFileW(file.txt)
    Returned handle: 0
CreateFileW(file.txt)
    Returned handle: 0xffffffff
    Returned handle: 0xffffffff

開こうとしたファイルが存在しなかったので、戻り値(-1 == INVALID_HANDLE_VALUE)は少なくとも正しいです。

何か案は?前もって感謝します!

4

2 に答える 2

2

さて、しばらくして、私はついにこれらの問題の原因を突き止めました。

0のように見える戻り値について:

PINのドキュメントには次のように書かれています。

注:IPOINT_AFTERは、各戻り命令をルーチンに組み込むことによって実装されます。ピンはすべての返品指示を見つけようとしますが、成功は保証されません

戻り値で関数のアドレスをダンプすると、CreateFileWから0が返されないことがわかります。これは、CreateFileWが呼び出す別の関数から返されます。PINのこの誤った動作は、CreateFileWメソッドを独自のバージョンでラップすることで修正できます(パラメーターのダンプ、元の関数の呼び出し、戻り値のダンプ)。

1つだけではなく2つの関数呼び出しについて:

私のシステムでは、CreateFileWがまったく同じ名前のKernelbase.dllの関数を呼び出していることがわかりました。私はルーチンをその名前でインストルメント化したので、これは正しい動作です。kernel32.dllに対してイメージ名をチェックすると、これが解決されました。

于 2013-03-02T21:33:14.840 に答える
1

不確かな中間レベル(ホストされているライブラリ)の1つではなく、システムコールレベルでキャッチすることをお勧めします。Windowsでは、システムコール番号とインターフェイスは公式には公開されていませんが、とにかく簡単に見つけることができます。

于 2015-09-14T21:55:30.347 に答える