franz去除挖矿代码

0x00 介绍

Franz是一款聚合多种聊天工具的应用,鉴于鹅厂对linux支持感人,franz也算是一款不错的微信客户端了.
然而,使用franz的过程中,经常发现其高CPU甚至高GPU占用,并导致笔记本风扇狂转,开始没有太多注意,直到后来我尝试在自己电脑运行了xmrig门罗挖矿工具,发现CPU使用率很有特点:1核2虚拟线程,一个加一个减,持续波动,2线程CPU使用率加和维持在100%.
CPU高占用时,恰好也符合这个特征,使用glances查看资源占用,发现是franz在高占用CPU资源.
既然franz是开源软件,虽然我对js可谓是一窍不通,但从源码中找到并移除掉挖矿功能也许还是可以的.

0x01 源码分析

首先在github clone源码到本地.
根据对门罗的了解,十有八九用的coinhive的服务,于是在代码中全文搜索coin,结果如下.

~/softwares/franz/franz$ grep -r coin
src/lib/Miner.js: script.id = 'coinhive';
src/lib/Miner.js: script.src = 'https://coinhive.com/lib/ch2.min.js';
src/lib/Miner.js: document.querySelector('#coinhive');
src/i18n/locales/ca.json: "settings.recipes.nothingFound" : "Ho sentim, però cap servei coincideix amb el terme cercat.",

看起来挖矿代码是引用的coinhive接口主要在Miner.js中.
再搜索Miner,看看在何处引用.

~/softwares/franz/franz$ grep -r Miner
src/models/User.js: @observable isMiner = false;
src/models/User.js: this.isMiner = data.isMiner || this.isMiner;
src/lib/Miner.js:export default class Miner {
src/lib/Miner.js: console.info(`Miner: battery is not charging, setThrottle to ${this.options.throttle}`);
src/stores/AppStore.js:import Miner from '../lib/Miner';
src/stores/AppStore.js: this._handleMiner.bind(this),
src/stores/AppStore.js: this._handleMinerThrottle.bind(this),
src/stores/AppStore.js: _handleMiner() {
src/stores/AppStore.js: if (this.stores.user.data.isMiner) {
src/stores/AppStore.js: this.miner = new Miner('cVO1jVkBWuIJkyqlcEHRTScAfQwaEmuH');
src/stores/AppStore.js: _handleMinerThrottle() {
src/containers/settings/AccountScreen.js: stopMiner() {
src/containers/settings/AccountScreen.js: isMiner: false,
src/containers/settings/AccountScreen.js: stopMiner={() => this.stopMiner()}
src/containers/ui/SubscriptionFormScreen.js: isMiner: true,
src/i18n/locales/el.json: "subscription.mining.line3" : "Εφόσον ο Miner είναι ενεργός, θα έχετε απεριόριστη πρόσβαση σε όλα τα χαρακτηριστικά του Franz Premium Supporter.",
src/i18n/locales/de.json: "subscription.mining.line3" : "So lange der Miner aktiv ist, hast du unbegrenzten Zugang auf alle Franz Premium-Supporter Funktionen.",
src/components/settings/account/AccountDashboard.js: stopMiner: PropTypes.func.isRequired,
src/components/settings/account/AccountDashboard.js: stopMiner,
src/components/settings/account/AccountDashboard.js: {user.isMiner && (
src/components/settings/account/AccountDashboard.js: onClick={() => stopMiner()}
src/components/settings/account/AccountDashboard.js: {!user.isPremium && !user.isMiner && (
Binary file .git/index matches

看起来主程序在src/stores/AppStore.js中,打开该文件,发现使用类Miner创建对象的代码this.miner = new Miner();,可知挖矿程序都在miner对象内,仔细阅读miner有关的代码,发现启动挖矿的语句

this.miner.start(({ hashesPerSecond }) => {
   this.minerHashrate = hashesPerSecond;
});

使用/* */注释掉该句,编译得到新的应用程序,运行,使用若干天都没有报异常,也没有挖矿程序后台运行情况再发生.
编译好的release在这里(https://github.com/zhezh/franz/releases )

0x02 感想

随着数字加密货币价格的飙升,越来越多的应用和网站开始使用偷偷挖矿这种方式赚钱,对于个人来说,了解相关知识,甚至动手试试挖矿获得直观感性了解还是挺有必要的,如果不是之前挖过门罗并且了解过coinhive,我应该也不会想到franz会使用这种手段盈利.其github的issue里很多人提出高资源占用的问题,但只有极少人猜到是在挖矿,主动去改代码解决问题的尚没有发现.