利用C语言强行点击

通常很多情况下,会有这样的事情,就是:

我们在运行某些程序的时候,发现按钮置灰了,比如购买版权或者输入序列号才能够获得访问权限。某个按钮才允许点击。

其实所有的这些东西都是 别的人或者公司利用一些编程语言调用windows的函数,实现的。所以如果我们也能调用windows的函数,那么我们就能够执行一些按钮或者某些东西背后的函数。

自己的mfc还暂时 用不了,不过 可以 试试这个。

调出这个界面,看到有一个置灰的设置按钮。我们可以试着调用这个后面的函数。

/*如何调出来?【在win7环境下】

打开控制面板

点击鼠标。*/

然后利用vs的工具中的spy++ x64。

进入查找窗口。

拖住这个到刚刚鼠标的那个置灰的按钮上面。就可以得到一个句柄。

句柄【在我理解,就是一个话把子,怎么解释,就是,别人说一件事儿,你得顺着往下说才能把话接下来,然后完成你想说的东西。在程序里面,执行到这里,有这样一个句柄,允许我们说话了,我们就从这一点开始,顺着往下说,往往就能得到我们想要的结果】

所以得到了句柄之后。我们可以新建一个工程。

#include <windows.h>

int main(){

    SendMessage(0x001607E6,WM_LBUTTONDOWN,0,0);      SendMessage(0x001607E6,WM_LBUTTONUP,0,0);

    return 0;
}

//在HWND的第一个参数里面输入刚刚的句柄。

//猜测 第二个参数 是 WindowManager_LeftButtonDown,就是窗口管理器左键按钮点下。

//然后左键按钮弹起。

就强制的往刚刚不能执行的函数里面发送了一个信息。前面的引文介绍说,这就是调用了windows底层的一些函数,如果按钮可以点击,则鼠标点击,按钮按下,当需要注册的时候,或者需要序列号的时候我们并没有,就不能点击。但是当我们给他发送一条消息以后,是不是问题就解决了。

如果能编译的话可以看到这样一个结果:

如果编译通不过的话:

5 43 F:\c++codeInDev\c++\ForceClick.cpp [Error] invalid conversion from ‘int‘ to ‘HWND‘ [-fpermissive]

会报这样一个错误。

无效的转换从 int 到 HWND。

句柄里面我们得到了一个001607E6,这是一个16进制的数儿,用以标识一个单元,在这里面就是指定的那个 按钮。每次重新生成都会不一样。说明是每次创建窗口去内存分配的。我们在这里面要把0x001607E6补齐用以标识这是一个内存地址。但是这并不够,这个内存单元实质上,到底是什么呢?他是一个 HWND 类型的东西。

这就涉及到强制类型转换了。

就是 我们能去内存得到一个,得到一个空间。比如int a,这个a没有给初始化,它的结果不想Java里面给一个 0,而是 原来这里面是什么就是什么,再赋值,再把原来的内容覆盖,是这样一个情况。如果这个里面本来就有东西,那么我们可以把这个东西,以任何的形式输出。比如int 比如double,比如什么,我们可以随意把它以任何一种类型输出。

举这样一个例子:

#include <stdio.h>
Int main(){
    Double d = 10.2;
    Double f = 10.2/2;
    Printf("%f\n",f);
    Printf("%d\b",f);
}

运行结果是:

所以可以发现,这串儿数字 在 内存里面是一直存在的,只不过取决于 我们用什么方式输出。那么通用的 刚刚的 001607E6这个 地址里面的东西,也是一直有的,如果用int形式 拿出来的话,就是 这么一堆数儿,编译器会报一个这个 int 并非 是 HWND类型的东西,那么我们去取内容的时候把它变成HWND类型,再交给程序,就可以通过了。

所以 修改之后的代码是:

#include <windows.h>

int main(){

SendMessage((HWND)0x001607E6,WM_LBUTTONDOWN,0,0);//5 43 F:\c++codeInDev\c++\ForceClick.cpp [Error] invalid conversion from ‘int‘ to ‘HWND‘ [-fpermissive]

SendMessage((HWND)0x001607E6,WM_LBUTTONUP,0,0);

return 0;

}

这样就就可以执行了。

同样的:

我们还可以做一些小坏事:

其实并没有那么神奇,就是调用了一下 windows底层的 函数,windows本身利用函数调用了这个地方SetTextA(“确定”);那我们修改一下,它就执行了我们的函数。

所以变成了这个样子。

时间: 2024-07-28 19:21:36

利用C语言强行点击的相关文章

利用C语言实现顺序表

利用C语言实现静态顺序表 //---------- 头文件#include "SeqList.h" -------------------- #pragma once #include<stdio.h>#include<stdlib.h>#include<string.h> #define MAX 100 //------------------ 定义数据类型 ----------------------------typedef int DataT

利用C语言结构体模拟一个简单的JavaBean

利用C语言模拟一个Javabean 仅封装了,“无参构造函数”,“带参构造函数”,"toString方法" #include <stdio.h> struct User{ int ID; char *name; char *password; int age; }; void newUser(struct User *,const int ,const char *,const char *,const int); void printUserInfo(struct Use

利用R语言进行交互数据可视化(转)

上周在中国R语言大会北京会场上,给大家分享了如何利用R语言交互数据可视化.现场同学对这块内容颇有兴趣,故今天把一些常用的交互可视化的R包搬出来与大家分享. rCharts包 说起R语言的交互包,第一个想到的应该就是rCharts包.该包直接在R中生成基于D3的Web界面. rCharts包的安装 require(devtools) install_github('rCharts', 'ramnathv') rCharts函数就像lattice函数一样,通过formula.data指定数据源和绘图

利用R语言进行交互数据可视化

本文是本人受统计之都邀请写的一篇关于数据可视化的文章,感兴趣的同学可以上统计之都去查看. http://cos.name/2016/06/using-r-for-interactive-data-visualization/ 上周在中国R语言大会北京会场上,给大家分享了如何利用R语言交互数据可视化.现场同学对这块内容颇有兴趣,故今天把一些常用的交互可视化的R包搬出来与大家分享. rCharts包 说起R语言的交互包,第一个想到的应该就是rCharts包.该包直接在R中生成基于D3的Web界面.

利用C语言编辑画图程序的实现方法

不知道大家在进行开发县级电网调度自动化系统的时候,是否都会遇到一个问题就是:要绘制一个电力系统一次接线图.大家都应该知道其实电力系统的一次接线图是较为复杂的,如果想要使用一般的编程方法来进行绘制的话,基本上就是行不通的.那么我们应该怎样才可以更加的高效直接呢?今天小编就会给大家介绍一个方法,那就是:利用C语言编辑画图程序的实现方法.希望这篇教程对于大家有所帮助. 一.实现方法 在教程开始之前,小编先为大家介绍一下在编程程序里面早已定义了几个特殊按钮.为什么小编要为大家介绍这几个特殊按钮呢?那是因

利用R语言+逻辑回归实现自动化运营

摘要 逻辑回归是最常见的二分类算法之一,由于是有监督学习,训练阶段需要输入标签,而同时在变量较多的情况下,需要先经过一些降维处理,本文主要讲解如果通过R语言来自动化实现变量的降维以及变量转换,训练,测试,覆盖率以及准确度效果评估,以及生成最终评分配置表,而在标签与训练数据在可以自动化生成的情况下,配置表是能自动生成的.其中每个步骤都有详细的实现代码. 主要步骤 实现细节 1.生成训练数据 如类似下面的格式 lable var1 var2 var3 var4 var5 var6 var7 var8

谷歌工程师利用和语言翻译类似的技术开发出了一个用于翻译图片主题的机器学习算法

将一种语言自动翻译成另一种语言一直以来都是难以攻克的问题.但最近几年,谷歌通过开发机器翻译算法改变了传统的翻译过程,通过谷歌翻译从本质上改变了跨文化翻译交流. 如今,谷歌正在运用同样的机器学习技术将图片转变为文字.其结果就是自动产生能够准确描述图片内容的标题.该技术将用在互联网搜索引擎,图片自动发表,视觉受损者的网页浏览,以及其他更为广阔的领域. 翻译语言的传统步骤是一个更迭的过程 - 从个体单词的翻译开始,然后通过重新排列单词和短语的顺序来提高翻译的准确性.但是近几年来,通过完全不同的方式,谷

利用c语言计算n的阶乘及其求和(多种方法)

计算某一个数的阶乘: #include <stdio.h> int main() { int n,i; scanf("%d",&n); for(i=n-1;i>0;i--) { n=n*i; } printf("%d",n); return 0; } 计算1!+2!+3!+...+10! #include <stdio.h> int  main() { int a,b,c; int sum=0; for(a=1;a<=10

.net C# 利用Session防重复点击防重复提交

<body>    <form id="form1" runat="server">    <div>        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />        <br />        <