zoukankan      html  css  js  c++  java
  • 去掉RedisDesktopManager更新提示弹窗-篇2

    去掉RedisDesktopManager更新提示弹窗-篇2

    上篇是去掉了RDM的弹窗,但是也只是仅仅去掉了弹窗。但是请求更新的操作还是存在的,这次我们把请求这个操作过程也给去了,这样就显得稍微完美一点。建议看完上一篇再看这一篇,很多操作这篇不是很详细。

    准备

    • 工具
      • x64dbg
      • 安装好的RedisDesktopManager

    过程

    我们可以用Wireshark看一下,打开选择Wirshark监听上网的网卡(忽略vm虚拟网卡,就以太网有波动那就是它了,双击进去)

    image-20201222213849082

    过滤器设置为http,发现了一个/get-update关键点

    image-20201222214539981

    rdm.exe文件丢到x64dbg搜索字符串 『右键,搜索范围->所有模块->字符串引用』,这次搜索关键字『get-update

    image-20201222215140830

    image-20201222215344803

    上面这些图中的关键字都可以在RDM2020.5的源码Updater::Updater() 方法中找到

    这是从github上扒拉出来的RDM2020.5的源码

    // ============= app.cpp ============
    void Application::OnNewUpdateAvailable(QString& url) {
      QMessageBox::information(
          nullptr, "New update available",
          QCoreApplication::translate(
              "RDM", "Please download new version of RDM: %1")
                  .arg(url));
    }
    
    
    Application::Application(int& argc, char** argv)
        : QApplication(argc, argv),
          m_engine(this),
          m_qmlUtils(QSharedPointer<QmlUtils>(new QmlUtils())),
          m_events(QSharedPointer<Events>(new Events())) {
      // Init components required for models and qml
      initAppInfo();
      initProxySettings();
      processCmdArgs();
      initAppFonts();
      initRedisClient();
    #ifndef RDM_APPSTORE
      initUpdater();
    #endif
      installTranslator();
      initPython();
    }
    
    void Application::initUpdater() {
      // 这个new Updater()调用了Updater::Updater()构造方法
      m_updater = QSharedPointer<Updater>(new Updater());
      connect(m_updater.data(), SIGNAL(updateUrlRetrived(QString&)), this,
              SLOT(OnNewUpdateAvailable(QString&)));
    }
    
    // =============== updater.cpp ===================
    void Updater::requestFinished(QNetworkReply* response)
    {
        if (response->error() != QNetworkReply::NoError
            || response->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200)
        {
            return;            
        }
    
        QString result(response->readAll());
    
        if (!result.isEmpty()) 
        {
            emit updateUrlRetrived(result);
        }
    }
    
    Updater::Updater()
    {
        manager = new QNetworkAccessManager();
    
        QObject::connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(requestFinished(QNetworkReply*)));
    
        QString platform("unknown");
    
        #ifdef Q_OS_WIN32
            platform = "windows"; 
        #endif
    
        #ifdef Q_OS_LINUX
            platform = "linux"; 
        #endif
    
        #ifdef Q_OS_MACX
            platform = "osx"; 
        #endif
        
        QUrl updateUrl(
            QString("http://%1/get-update?version=%2&platform=%3")
                .arg("rdm.dev")
                .arg(QCoreApplication::applicationVersion())
                .arg(platform)
            );
    
        manager->get(QNetworkRequest(updateUrl));
    
    }
    

    看一遍逻辑也是能看清楚的

    Application::Application()

    => Application::initUpdater()

    =>Updater::Updater()

    => 异步请求,请求完之后回调Updater::requestFinished()

    => requestFinished检查返回值不为空 触发

    => updateUrlRetrived(result)

    => 执行槽函数 Application::OnNewUpdateAvailable(QString& url) => 这样MessageBox就出来了

    现在我们可以从源码中看到现在我们00007FF76E8AF439指令在Updater::Updater()构造方法中。

    现在思路就清晰了,nop 掉Updater::Updater() 函数调用,不执行 manager->get(QNetworkRequest(updateUrl));

    00007FF76E8AF439打上断点重新运行,运行到断点处,接着就是看图操作。

    image-20201222222010391

    下面就是调用Updater::Updater() 的地方。我们要nop掉Updater::Updater() 函数。

    image-20201223205154895

    nop后

    image-20201223205304262

    应用补丁到rdm.exe文件上去

    image-20201223205447806

    成果

    abc

    总结

    原本是想从MessageBox弹窗处回溯到调用处。但是调试半天未果,看看源码看样子像是异步调用,可能是有点难度了。

    在第一篇的回复下面看到有人发的一部分源码,所以就去github上面把2020.5的源码给下载了下来,其实看了看帮助不算太大,但是至少知道的大概的执行逻辑。想了想还是从get-update关键字入手。

  • 相关阅读:
    C# 把一个文件夹下所有文件复制到另一个文件夹下 把一个文件夹下所有文件删除(转)
    【总结整理】webGIS学习thinkGIS(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地
    ARCGIS空间叠加分析(转)
    ARCGIS中怎么去除重复的面?(转)
    关于写作赚钱(转)
    【总结整理】WebGIS学习-thinkGIS(三):关于影像金字塔、瓦片行列号、分辨率resolution
    【总结整理】WebGIS学习-thinkGIS(地理常识):
    【总结整理】WebGIS学习-thinkGIS(二):关于level,比例尺scale,分辨率resolution
    【总结整理】AMAP学习AMAP.PlaceSearch()
    logging、hashlib、collections模块
  • 原文地址:https://www.cnblogs.com/pi-laoban/p/14558826.html
Copyright © 2011-2022 走看看