ron*_*nag 9 c debugging winapi breakpoints
我想在SetTimer函数上休息一下,看看哪些组件用什么值注册了哪些定时器.这可能吗?
i_a*_*orf 16
是的,你可以这样做.首先确保为调试器设置了公共符号.
SetTimer存在于user32中,但这就是它导出的内容.最简单的方法是使用命令行调试器NTSD.我们需要它的真实名称,所以在user32中查找匹配的符号:
0:000> x user32!*timer*
759992b9 USER32!NtUserValidateTimerCallback = <no type information>
759977d5 USER32!NtUserSetTimer = <no type information>
759e4f13 USER32!NtUserSetSystemTimer = <no type information>
759993bf USER32!NtUserKillTimer = <no type information>
Run Code Online (Sandbox Code Playgroud)
啊,哈!它的调试符号是NtUserSetTimer:
0:000> bp user32!NtUserSetTimer
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中,您可以通过编写一个简单的临时程序,然后设置断点并右键单击并选择"转到反汇编"来确定SetTimer的位置:
int _tmain(int argc, _TCHAR* argv[]) {
SetTimer(NULL, 0, 0, NULL);
004113BE mov esi,esp
004113C0 push 0
004113C2 push 0
004113C4 push 0
004113C6 push 0
004113C8 call dword ptr [__imp__SetTimer@16 (418338h)]
Run Code Online (Sandbox Code Playgroud)
如果我们进入那个电话,那么我们就在这里:
_NtUserSetTimer@16:
759977D5 mov eax,123Dh
759977DA mov edx,7FFE0300h
759977DF call dword ptr [edx]
759977E1 ret 10h
Run Code Online (Sandbox Code Playgroud)
因此,要在Visual Studio中设置断点,您必须在断点中使用上下文运算符.从菜单中选择:Debug - > New Breakpoint - > Break at Function,然后输入:
{,,user32.dll}_NtUserSetTimer@16
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3162 次 |
| 最近记录: |