假设我想在每次调用时跳过函数func的第3行
int func() {
int a = 10, b =20;
a = 25;
b = 30;
return a+b
}
所以每次它应该返回40(即不执行第3行a = 25) windbg中有类似的命令,比如gdb中的jmp吗?
答案 0 :(得分:6)
又是一个非常晚的答案,但如果搞乱装配不是更好的 设置条件断点以跳过执行一行
在下面的示例中,401034是您不想执行的行 所以在该行上设置条件断点以跳过它
bp 401034 "r eip = @$eip + size of current instruction";gc"
7 在这种情况下gc = go
来自conditionl break
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:\>
答案 1 :(得分: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
答案 2 :(得分: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