関数 func が呼び出されるたびに 3 行目をスキップしたいとします。
int func() {
int a = 10, b =20;
a = 25;
b = 30;
return a+b
}
だから毎回40を返すはずです(つまり、3行目a = 25を実行しません)gdbのjmpのようなwindbgに同様のコマンドはありますか?
関数 func が呼び出されるたびに 3 行目をスキップしたいとします。
int func() {
int a = 10, b =20;
a = 25;
b = 30;
return a+b
}
だから毎回40を返すはずです(つまり、3行目a = 25を実行しません)gdbのjmpのようなwindbgに同様のコマンドはありますか?
再び非常に遅い答えですが、アセンブリをいじるのが望ましくない場合は
、条件付きブレークポイントを設定して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:\>
アセンブリに精通している場合は、コマンドを使用してアセンブリを変更できます(つまり、「a = 25;」のオペコードをすべてのNOPに変換します)。これは、NOPを実行したり、命令ストリームを変更したりするときに通常行うことです。
時折、NOP命令のバイトコードが0x90であるという事実に依存し、eコマンドを使用してメモリを編集することがあります(例: "ew @eip0x9090")。これは、コマンドを使用した場合と同じ結果です。
最後に、この操作を頻繁に実行せず、手動で命令をスキップしたい場合は、「現在の命令の設定」GUI操作を使用できます。
http://msdn.microsoft.com/en-us/library/windows/hardware/ff542851(v=vs.85).aspx
これを行う方法を説明するチュートリアルがここにあります。行をスキップするようにオフセットを設定できます: 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