zoukankan      html  css  js  c++  java
  • 利用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++codeInDevc++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
    ",f);
        Printf("%d",f);
    }

    运行结果是:

     

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

    所以 修改之后的代码是:

    #include <windows.h>
    
     
    
    int main(){
    
     
    
    SendMessage((HWND)0x001607E6,WM_LBUTTONDOWN,0,0);//5 43 F:c++codeInDevc++ForceClick.cpp [Error] invalid conversion from 'int' to 'HWND' [-fpermissive]
    
    SendMessage((HWND)0x001607E6,WM_LBUTTONUP,0,0);
    
    return 0;
    
     
    
    }

    这样就就可以执行了。

     

     

    同样的:

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

     

     

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

    所以变成了这个样子。

     

     

  • 相关阅读:
    C#实现-浏览器UA解析获得手机、系统、浏览器等信息
    C#代码实现-冒泡排序
    C# DateTime 工具类
    net core 3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”
    C#/.Net开发入门篇(3)——console类的输入输出
    C#/.Net开发入门篇(2)——第一个控制台应用程序
    C#/.Net开发入门篇(1)——开发工具安装
    docker 学习笔记(2)--docker file命令
    docker 学习笔记(1)--常用命令
    导出大数据方法。批量导BOM
  • 原文地址:https://www.cnblogs.com/letben/p/5206183.html
Copyright © 2011-2022 走看看