5

関数 func が呼び出されるたびに 3 行目をスキップしたいとします。

int func() {
     int a = 10, b =20;
     a = 25;
     b = 30;
     return a+b
}

だから毎回40を返すはずです(つまり、3行目a = 25を実行しません)gdbのjmpのようなwindbgに同様のコマンドはありますか?

4

3 に答える 3

6

再び非常に遅い答えですが、アセンブリをいじるのが望ましくない場合は
、条件付きブレークポイントを設定して1行の実行をスキップします

以下の例では、401034 は実行したくない行な
ので、その行に条件付きブレークポイントを設定してスキップします。

bp 401034 "r eip = @$eip + size of current instruction";gc"
この場合gc = go、条件ブレークから7

jmptest:\>dir /b
jmptest.c

jmptest:\>type jmptest.c
#include <stdio.h>
int func()
{
    int a = 10 , b = 20;
    a = 25;
    b = 30;
    return a+b;
}
int main (void)
{
    int i , ret;
    for (i= 0; i< 10; i++)
    {
        ret = func();
        printf("we want 40 we get %d\n",ret);
    }
    return 0;
}
jmptest:\>cl /nologo /Zi jmptest.c
jmptest.c

jmptest:\>dir /b *.exe
jmptest.exe

jmptest:\>cdb -c "uf func;q" jmptest.exe | grep 401
00401020 55              push    ebp
00401021 8bec            mov     ebp,esp
00401023 83ec08          sub     esp,8
00401026 c745fc0a000000  mov     dword ptr [ebp-4],0Ah
0040102d c745f814000000  mov     dword ptr [ebp-8],14h
00401034 c745fc19000000  mov     dword ptr [ebp-4],19h
0040103b c745f81e000000  mov     dword ptr [ebp-8],1Eh
00401042 8b45fc          mov     eax,dword ptr [ebp-4]
00401045 0345f8          add     eax,dword ptr [ebp-8]
00401048 8be5            mov     esp,ebp
0040104a 5d              pop     ebp
0040104b c3              ret

jmptest:\>cdb -c "bp 401034 \"r eip = 0x40103b;gc\";g;q " jmptest.exe | grep wan
t
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40
we want 40 we get 40

jmptest:\>
于 2014-05-10T09:19:45.670 に答える
3

アセンブリに精通している場合はコマンドを使用してアセンブリを変更できます(つまり、「a = 25;」のオペコードをすべてのNOPに変換します)。これは、NOPを実行したり、命令ストリームを変更したりするときに通常行うことです。

時折、NOP命令のバイトコードが0x90であるという事実に依存し、eコマンドを使用してメモリを編集することがあります(例: "ew @eip0x9090")。これは、コマンドを使用した場合と同じ結果です。

最後に、この操作を頻繁に実行せず、手動で命令をスキップしたい場合は、「現在の命令の設定」GUI操作を使用できます。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff542851(v=vs.85).aspx

于 2012-05-07T14:18:07.797 に答える
2

これを行う方法を説明するチュートリアルがここにあります。行をスキップするようにオフセットを設定できます: http://cfc.kizzx2.com/index.php/tutorial-using-windbg-to-bypass-specific- functions-windbg-kung-fu-series/を実行し、レジスタeipをこの値に設定します。

また、ブレークポイントを設定し、コマンドをブレークポイントに入れて同じことを行うこともできます: http://japrogbits.blogspot.co.uk/2010/01/using-breakpoints-to-skip-function-in.htmlおよび別のブログ: http://www.shcherbyna.com/?p=1234.callを使用して同じことを達成することもできます: http://blogs.msdn.com/b/oldnewthing/archive/2007/04/27/2292037 .aspx

于 2012-05-07T15:24:08.037 に答える