2018年,是公认的区块链大年。随着区块链的经济价值不断升高,促使不法分子利用各种攻击手段获取更多敏感数据,“盗窃”、“勒索”、“挖矿”等,下面小编就开给大家分析下木马钱包盗币原理。
最近比特币的安全问题频发,我本想找个盗取比特币的钱包进行分析,恰巧此时网友smtp在彩云比特论坛发帖揭示LTC木马钱包,并提供了LTC木马钱包样本,我就逆向了木马钱包的程序,分析了钱包盗取LTC的原理,盗取方式同样可以用于比特币及其他山寨币。
一、原理分析
此LTC木马钱包盗取LTC的方式很简单,查看钱包的接收地址时,隐藏钱包的真实接收地址,显示黑客的LTC地址,当向此接收地址发送LTC时,发送的LTC自然就到了黑客的钱包中,永远到不了这个钱包中。
验证过程很简单,先安装LTC木马钱包,创建新的接收地址,然后卸载木马钱包,安装LTC官网钱包,查看接收地址,两者显示的地址是不同的,官网钱包显示的是真实地址,木马钱包显示的是黑客的LTC地址。
钱包中不存在黑客的LTC地址,所以导出私钥失败。官网钱包显示的LTC地址是存在的,可以导出私钥。通过命令dumpprivkey可以验证。
二、钱包显示接收地址
LTC的代码是开源的,黑客下载了LTC代码,做了些修改,重新编译代码,把程序打包,放到网盘中提供下载,盗取网友的LTC。
显示钱包的接收地址,LTC与BTC的代码相同,主要是在列表中显示LTC地址,木马钱包通过修改列表中要显示的LTC地址的字符串,来达到隐藏真实地址的目的。
显示LTC接收地址,主要涉及到2个模块:程序加载时显示接收地址、创建新接收地址。在这里先简单讲解如何在地址列表中显示地址。
钱包的接收地址保存在是类CWallet的mapAddressBook中,接收地址列表是类AddressTablePriv的QListcachedAddressTable控件。
三、黑客修改的代码
木马钱包就是修改了类AddressTablePriv的函数refreshAddressTable、函数updateEntry,在显示、插入地址之前修改显示的接收地址。
1. 函数refreshAddressTable
在调用函数cachedAddressTable.append之前,加入修改显示地址的代码。
2. 函数updateEntry
当CT_NEW时,在调用函数parent->beginInsertRows之后,在调用函数cachedAddressTable.insert之前,加入修改显示地址的代码。
黑客的LTC地址一共10个,按照显示、插入地址的顺序,依次显示这10个地址,超过10个地址时,循环显示。
在木马钱包中定义了一个数组,指向这10个LTC地址。在木马钱包中定义了一个整形变量,标识地址索引,显示此索引指向的LTC地址,然后递增,当等于10时,重置为0。
对于上述几种情况在一定程度上可以采用修改注册表,使用第三方的一些任务管理器来停止任务,重新启动进入命令行模式来手工清除木马,使用一些专杀。