【发布时间】:2016-02-10 07:18:09
【问题描述】:
我试图在表面上实现的目标似乎相对简单:破解 Windows 安装程序以在没有任何用户输入的情况下运行。
不幸的是,我没有 msi,并且使用静默安装标签运行安装程序不会产生任何结果。我还研究过将 .exe 包装成 .msi,但会导致死胡同。
然后,我想既然安装程序毕竟是一个windows程序,也许我可以向它发送鼠标点击和键盘敲击。
但是,我做不到。简短的测试程序运行没有错误,但复选框仍未选中。
我用其他程序测试了这个方法并且它有效。我的猜测是,要使 SendMessage() 工作,必须构建应用程序来侦听和响应消息?
接下来,我想我可以使用 SendInput() 函数强制发送鼠标点击
int _tmain(int argc, _TCHAR* argv[])
{
HWND handle = (HWND)0x008105CC;
GetWindowRect(handle, &rec);
double x = rec.left;
double y = (rec.top + rec.bottom) / 2;
LPARAM lparam = MAKELPARAM(x, y);
SetCursorPos(x, y);
INPUT input;
input.type = INPUT_MOUSE;
input.mi.dx = 0;
input.mi.dy = 0;
input.mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP);
input.mi.mouseData = 0;
input.mi.dwExtraInfo = NULL;
input.mi.time = 0;
SendInput(1, &input, sizeof(INPUT));
return 0;
}
但是,那也失败了!再一次,我测试了在另一个应用程序中检查另一个复选框,它起作用了。所以,我很困惑为什么发送点击(我期望它会独立于特定程序进程)在所有程序中都不起作用???
【问题讨论】:
-
在理想情况下,你会弄清楚安装程序做了什么,然后重新打包
-
实际上在测试您是否正确地动态确定 HWND 时?
-
另一个问题是如果安装程序运行提升,那么你需要运行你的程序提升(否则它将无法交互)。
-
如果安装程序正在提升运行,UIPI 将阻止消息,除非安装程序明确允许消息通过(它可能不会这样做):“较低权限的进程不能:... - 将消息或 PostMessage 发送到更高权限的应用程序窗口。这些应用程序编程接口 (API) 会返回成功,但会默默地丢弃窗口消息。" 请参阅 Windows Integrity Mechanism Design
-
话虽如此,您可以考虑改用 UI 自动化。因为你已经有了
HWND,所以使用AccessibleObjectFromWindow()来检索复选框的IAccessible接口,然后调用它的accDoDefaultAction()方法。复选框的“默认操作”是切换其复选标记的状态。
标签: winapi visual-c++ windows-installer