我可以从Visual Studio立即窗口调用Win32 API吗?
我正在调试一个C ++ Win32应用程序,我想从该进程的上下文中调用一个任意的Win32 API,就好像该程序运行了这行代码:
DestroyWindow(0x00021c0e);
但是进入立即窗口会给出:
CXX0017: Error: symbol "DestroyWindow" not found
编辑:使用函数的全名{,,user32.dll}_NtUserDestroyWindow@4
,我可以使用立即窗口来了解我的意思,并显示函数的地址:
{,,user32.dll}_NtUserDestroyWindow@4 0x76600454 _NtUserDestroyWindow@4
但当我尝试调用它时,会发生这种情况:
{,,user32.dll}_NtUserDestroyWindow@4(0x00021c0e); CXX0004: Error: syntax error
甚至可以像这样从立即窗口调用C函数,还是我咆哮错误的树?
一旦你有了函数地址(正如你在更新的问题中所做的那样),你可以尝试将它转换为函数指针并调用它:
(*(BOOL (*)(HWND))0x76600454)((HWND)0x00021c0e)
第一部分将地址转换为BOOL (*)(HWND)
,它是一个指向函数的指针,该函数接受HWND
参数并返回BOOL
。 然后,取消引用并调用函数指针。 确保参数正确,否则会发生不好的事情。 在64位系统上, HWND
可能是64位,因此您可能无法将参数作为int
传递。
编辑:查看完整故事的评论。
我认为问题是C ++ EE在解决DestroyWindow的上下文时遇到了问题。 请尝试以下方法
{,,user32}DestroyWindow(0x00021c0e);
我不确定方法调用语法是否支持这种限定条件(过去只用于转换)。 但它值得一试。
编辑您可能需要也可能不需要添加! 关闭后}。 这已经有一段时间了,因为我已经使用了这种语法,而且我经常将它与等效的windbg混淆。
我想出了一个解决方法,但我仍然希望让立即窗口工作。
解决方法是:
- 获取函数的地址,如问题所示
- 使用Disassembly窗口转到该地址,并在那里放置一个断点
- 对应用程序执行某些操作以使其调用
DestroyWindow
-
将调用堆栈备份到
DestroyWindow
的调用者,如下所示:6D096A9D推ecx
6D096A9E call dword ptr ds:[6D0BB4B8h] -
在
push ecx
指令上放置一个断点,并清除DestroyWindow
上的断点 - 点击继续,再次对应用程序执行某些操作以使其调用该代码
- 记下
ecx
的值 - 将调试器中的
ecx
值更改为所需的值,然后跳过push/call
- 恢复
ecx
的值并使用Set Next Statement返回push
,然后继续
它很长,但它确实有效。 它假设您可以随意调用应用程序相应的API。