1

以下のような関数を書きます。

void inject_func()
{
    _asm
    {
        push 2
        push 1
        mov eax, 0x0041188E
        call eax
    }
}

デバッグモードでコンパイルすると、次のようになりました。

00F43330 > 55               PUSH EBP
00F43331   8BEC             MOV EBP,ESP
00F43333   81EC C0000000    SUB ESP,0C0
00F43339   53               PUSH EBX
00F4333A   56               PUSH ESI
00F4333B   57               PUSH EDI
00F4333C   8DBD 40FFFFFF    LEA EDI,DWORD PTR SS:[EBP-C0]
00F43342   B9 30000000      MOV ECX,30
00F43347   B8 CCCCCCCC      MOV EAX,CCCCCCCC
00F4334C   F3:AB            REP STOS DWORD PTR ES:[EDI]
00F4334E   6A 02            PUSH 2
00F43350   6A 01            PUSH 1
00F43352   B8 8E184100      MOV EAX,41188E
00F43357   FFD0             CALL EAX
00F43359   5F               POP EDI
00F4335A   5E               POP ESI
00F4335B   5B               POP EBX
00F4335C   81C4 C0000000    ADD ESP,0C0
00F43362   3BEC             CMP EBP,ESP
00F43364   E8 8CE2FFFF      CALL inject_c.00F415F5
00F43369   8BE5             MOV ESP,EBP
00F4336B   5D               POP EBP
00F4336C   C3               RETN

リリースモードで、私は得ました:そして、これは私が欲しかったものです.

00EA17A0 > . 6A 02          PUSH 2
00EA17A2   . 6A 01          PUSH 1
00EA17A4   . B8 8E184100    MOV EAX,41188E
00EA17A9   . FFD0           CALL EAX
00EA17AB   . C3             RETN

私はVS2010がいくつかのデバッグ情報を追加したことを知っています.私が尋ねたいのは、それが追加したものです. Google で検索しましたが、キーワードが間違っている可能性があります。これについて何か知っている人はいますか?

4

1 に答える 1

3

これは、コンパイラによって実装されるセキュリティ チェックの一部です。

既知の値でスタックを埋めることにより、システムはいくつかの上書きを検出できます。不要な場合は、オプションを削除してオフにすることが/RTCsできます。

于 2013-03-02T11:56:46.210 に答える