免责声明: 本站所发布的一切技术分析文章、工具、软件(全部来自于互联网收集)仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请与我们联系处理。
前言
某社区成员分析火山开发的程序,实现了点击按钮实现强制性爆破跳转
现在的需求:打开窗口直接就跳进去
分析难点:窗口加载后,必定包含很多重要数据的初始化,万万不能直接就加载按钮触发的函数,很容易崩溃
分析可行的思路:
1.自己写一个dll,导入表注入或者劫持注入dll(社区高级版C语言Windows程序开发有案例)
2.代码实现隐藏主窗口(相关的API 第五章已经做了详细讲解)
3.代码实现模拟点击按钮,发送按键消息(高级版C有代码案例)
4.进去后显示窗口(相关的API 第五章已经做了详细讲解)
以上步骤中,唯一一个大家比较陌生的没有实际场景的应该是3,所以我们对步骤3进行展开陈述
模拟按钮点击
代码流程解析
1.找到目标窗口
2.根据目标窗口句柄找到目标按钮
3.使被操作窗口始终处于激活状态
4.PostMessage发送BM_CLICK消息实现模拟窗口点击
#include <windows.h>
#include <iostream>
int main() {
// 找到目标窗口(替换 "TargetWindowTitle" 为实际窗口标题)
HWND hWnd = FindWindow(NULL, "某软件");
if (!hWnd) {
std::cout << "窗口未找到!" << std::endl;
return 1;
}
// 找到目标按钮(替换按钮的控件ID)
HWND hButton = FindWindowEx(hWnd, NULL, "Button", "登陆");
if (!hButton) {
std::cout << "按钮未找到!" << std::endl;
return 1;
}
// 获取目标窗口的线程ID
DWORD dwTargetThreadId = GetWindowThreadProcessId(hWnd, NULL);
DWORD dwCurrentThreadId = GetCurrentThreadId();
// 绑定输入线程,以便控制窗口焦点
AttachThreadInput(dwCurrentThreadId, dwTargetThreadId, TRUE);
// 激活目标窗口
SetForegroundWindow(hWnd);
SetFocus(hWnd);
// 解除输入线程绑定
AttachThreadInput(dwCurrentThreadId, dwTargetThreadId, FALSE);
// 发送 BM_CLICK 消息,直接触发按钮点击
PostMessage(hButton, BM_CLICK, 0, 0);
std::cout << "按钮已点击!" << std::endl;
return 0;
}
测试程序
VS2019下载(C/C++开发环境)
没有回复内容