0

関数の長さを取得するために、次のように、空の関数を使用して各関数の終了位置をマークしています。

void f()
{
    printf("ooga\n");
}
__declspec(noinline, naked) void f_end() { __asm { nop } };

f の長さを取得するには、f_end - f を減算し、パディングとして使用される INT3 をデクリメントします。

しかし、別の機能を追加すると:

void g()
{
    printf("booga\n");
}
__declspec(noinline, naked) void g_end() { __asm { nop } };

f_end() と g_end() は 1 つの関数にマージされているように見えます (OllyDbg の逆アセンブリを調べることで確認できます)。各関数を独自のものにすると、それは起こりませんが、これらが大量に必要になります。

これを防ぐためにフリックできる最適化スイッチはありますか?

Visual Studio のメニューで利用可能な設定をざっと見て (f_end と g_end が完全にスキップされないようにするには、/OPT:NOREF を設定する必要がありました)、optimize("", off) を試してみましたが、役に立ちませんでした。

ありがとう

4

2 に答える 2

1

コンパイラを気にせずに、物事を少し簡単にする方法を次に示します。

#define FUNC_END(funcname)                             \
__declspec(noinline, naked) void funcname ## _end () { \
    funcname ## _end();                                \
}
于 2013-06-09T20:22:40.543 に答える