5

假设我想在每次调用函数 func 时跳过第 3 行

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

所以每次它应该返回40(即不执行第3行a = 25)windbg中是否有任何类似的命令,如gdb中的jmp?

4

3 回答 3

6

又是一个很晚的答案,但如果不宜弄乱汇编,请
设置一个条件断点以跳过执行一行

在下面的示例中,401034 是您不想执行的行,
因此在该行上设置条件断点以跳过它

bp 401034 "r eip = @$eip + size of current instruction";gc"
7在这种情况下gc = go从条件中断

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命令来更改汇编(即将“a = 25;”的操作码转换为所有 NOP)。当我想 NOP 退出或以其他方式更改指令流时,我通常会这样做。

偶尔人们会依赖NOP指令的字节码是0x90这一事实,使用e命令来编辑内存(例如“ew @eip 0x9090”)。这与使用a命令的结果相同。

最后,如果您不经常执行此操作并且只想手动跳过指令,您可以使用“设置当前指令”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 回答