我想在SetTimer函数上休息一下,看看哪些组件使用什么值来记录哪些计时器。这可能吗?
答案 0 :(得分:15)
是的,你可以这样做。首先确保为调试器设置了public symbols。
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>
阿公顷!它的调试符号是NtUserSetTimer:
0:000> bp user32!NtUserSetTimer
在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)]
如果我们进入那个电话,那么我们就会降落在这里:
_NtUserSetTimer@16:
759977D5 mov eax,123Dh
759977DA mov edx,7FFE0300h
759977DF call dword ptr [edx]
759977E1 ret 10h
因此要在Visual Studio中设置断点,必须在断点中使用context operator。从菜单中选择:Debug - &gt;新断点 - &gt;在功能中断,然后输入:
{,,user32.dll}_NtUserSetTimer@16
答案 1 :(得分:2)
Here's a walkthrough, with screenshots。请注意,对于VS2008 +,你不需要输入修饰的函数名称(也许这就是之前描述没有直接解决的原因?你的平台/ IDE是什么?)。
[编辑:]您肯定需要公共MS符号才能在二进制文件中找到Win32 API。最短的路线是工具/选项/调试/符号,然后将“http://msdl.microsoft.com/download/symbols”粘贴到“pdb位置”。强烈建议 - 但不是必须 - 为下载的pdb设置本地缓存(第一次pdb加载可能需要几分钟),根据您的需要,您可能应该取消选中“仅在手动加载符号时搜索上述位置”。加载所有符号时会有一些启动延迟,但您不必追逐user32.dll(或任何dll保存您想要破解的功能)并手动加载其pdb。