去掉RedisDesktopManager更新提示弹窗-篇2
上篇是去掉了RDM的弹窗,但是也只是仅仅去掉了弹窗。但是请求更新的操作还是存在的,这次我们把请求这个操作过程也给去了,这样就显得稍微完美一点。建议看完上一篇再看本篇,很多操作这篇不是很详细。
上篇传送门
准备
- 工具
- x64dbg
- Wireshark
- 安装好的RedisDesktopManager
过程
我们可以用Wireshark
看一下,打开选择Wirshark
监听上网的网卡(忽略vm虚拟网卡,就以太网有波动那就是它了,双击进去)
过滤器设置为http,正常打开运行RDM
在Wireshark
中发现一个/get-update
请求。
把rdm.exe
文件丢到x64dbg
搜索字符串 『右键,搜索范围->所有模块->字符串引用』,这次搜索关键字『get-update
』
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
打上断点重新运行,运行到断点处,接着就是看图操作。
下面就是调用Updater::Updater()
的地方。我们要nop掉Updater::Updater()
函数。
nop后
应用补丁到rdm.exe
文件上去
成果
总结
原本是想从MessageBox
弹窗处回溯到调用处。但是调试半天未果,看看源码看样子像是异步调用,可能是有点难度了。
在第一篇的回复下面看到有人发的一部分源码,所以就去github上面把2020.5的源码给下载了下来,看了看帮助不算太大,但是至少知道的大概的执行逻辑,最后还是选择从get-update
关键字入手简单点。
成品:链接:https://pan.baidu.com/s/1OkqSD6ClbOTHCU8QVtWFvw 提取码:qdn7