首页
社区
课程
招聘
[原创]比特币安全之一 木马钱包盗币原理分析
发表于: 2014-8-15 16:14 16623

[原创]比特币安全之一 木马钱包盗币原理分析

2014-8-15 16:14
16623

  最近比特币的安全问题频发,我本想找个盗取比特币的钱包进行分析,恰巧此时网友smtp在彩云比特论坛发帖揭示莱特币木马钱包,并提供了LTC木马钱包样本,我就逆向了木马钱包的程序,分析了钱包盗取LTC的原理,盗取方式同样可以用于比特币及其他山寨币。
  他在彩云比特论坛发帖地址:http://www.cybtc.com/thread-9367-1-1.html,且提醒大家从官网下载钱包,切莫下载非官网(各种网盘)、没签名的钱包。

一、原理分析

  此LTC木马钱包盗取LTC的方式很简单,查看钱包的接收地址时,隐藏钱包的真实接收地址,显示黑客的LTC地址,当向此接收地址发送LTC时,发送的LTC自然就到了黑客的钱包中,永远到不了这个钱包中。
  验证过程很简单,先安装LTC木马钱包,创建新的接收地址,然后卸载木马钱包,安装LTC官网钱包,查看接收地址,两者显示的地址是不同的,官网钱包显示的是真实地址,木马钱包显示的是黑客的LTC地址。
  钱包中不存在黑客的LTC地址,所以导出私钥失败。官网钱包显示的LTC地址是存在的,可以导出私钥。通过命令dumpprivkey可以验证。
  LTC官网钱包下载地址:https://download.litecoin.org/litecoin-0.8.7.2/win32/litecoin-0.8.7.2-win32-setup.exe,需要科学上网。
  木马钱包显示的黑客的LTC接收地址:
 

  官网钱包显示的真实的LTC接收地址:
 

  两相比较,可以看出显示的LTC接收地址是不同的。

二、钱包显示接收地址

  LTC的代码是开源的,黑客下载了LTC代码,做了些修改,重新编译代码,把程序打包,放到网盘中提供下载,盗取网友的LTC。
  显示钱包的接收地址,LTC与BTC的代码相同,主要是在列表中显示LTC地址,木马钱包通过修改列表中要显示的LTC地址的字符串,来达到隐藏真实地址的目的。
  显示LTC接收地址,主要涉及到2个模块:程序加载时显示接收地址、创建新接收地址。在这里先简单讲解如何在地址列表中显示地址。
  钱包的接收地址保存在是类CWallet的mapAddressBook中,接收地址列表是类AddressTablePriv的QList<AddressTableEntry> cachedAddressTable控件。

1、  程序加载时显示接收地址:
litcoin-qt加载时,在main函数中,创建类WalletModel的对象,在类WalletModel的构造函数中创建类AddressTableModel的对象,然后调用类AddressTablePriv的refreshAddressTable函数。函数refreshAddressTable遍历钱包的地址簿,显示在接收地址列表中。 

2、  创建新接收地址:
在创建新地址对话框确认后,交给类EditAddressDialog的accept函数处理,调用saveCurrentRow函数,调用类AddressTableModel的addRow函数添加新的地址行。
在addRow函数中,调用类CWallet的SetAddressBook函数设置地址簿。
在SetAddressBook函数中,发送NotifyAddressBookChanged信号,在信号处理函数NotifyAddressBookChanged中,调用类WalletModel 的方法updateAddressBook更新地址簿。
在updateAddressBook函数中,调用类AddressTableModel的updateEntry函数,再调用类AddressTablePriv的updateEntry函数,从而把新地址插入到地址列表中。

三、黑客修改的代码

  木马钱包就是修改了类AddressTablePriv的函数refreshAddressTable、函数updateEntry,在显示、插入地址之前修改显示的接收地址。
1、  函数refreshAddressTable
  在调用函数cachedAddressTable.append之前,加入修改显示地址的代码。

2、  函数updateEntry
  当CT_NEW时,在调用函数parent->beginInsertRows之后,在调用函数cachedAddressTable.insert之前,加入修改显示地址的代码。

  黑客的LTC地址一共10个,按照显示、插入地址的顺序,依次显示这10个地址,超过10个地址时,循环显示。
  在木马钱包中定义了一个数组,指向这10个LTC地址。
  在木马钱包中定义了一个整形变量,标识地址索引,显示此索引指向的LTC地址,然后递增,当等于10时,重置为0。
  这是用IDA定位到的地址数组及索引。
 

  实现这块功能对于码农来讲很简单。

  黑客的LTC地址在钱包程序中不是明文保存的,而是经过加密的,显示LTC地址之前需要经过解密。通过逆向分析,其解密方法比较简单,反向操作即是加密。
加密时,遍历LTC地址的34个字符,以0x32(‘2’)、0x3C(‘<’)、0x57(‘W’)这3个字符为分界点,根据字符所在的不同范围,进行加减3操作。
  解密时进行反向操作。
  加解密规则:
(1)  当字符大于等于0x0,且小于等于0x32(‘2’),加密时字符加3,解密时字符减3。
(2)  当字符大于0x32(‘2’),且小于等于0x3C(‘<’),加密时字符加3,解密时字符减3。
(3)  当字符大于0x3C(‘<’),且小于等于0x57(‘W’),加密时字符减3,解密时字符加3。
(4)  当字符大于0x57(‘W’),加密时字符加3,解密时字符减3。
  规则⑴、⑵相同,可以合并,不明白为啥分开。

  黑客的10个LTC地址的明文、密文如下表:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
谢谢分享心得!
比特币是土豪用的  ;)
2014-8-15 16:31
0
雪    币: 2
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错 ~ 顶一个
2014-8-15 16:42
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持~~~
2014-8-15 21:51
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有源码 这还用分析
2014-8-15 23:18
0
雪    币: 97
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
比特儿刚刚被盗了价值1000W的虚拟币。。。
2014-8-15 23:38
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
7
有同事玩比特币
2014-8-15 23:38
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哥哥好生厉害
2014-8-15 23:47
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
没有人关注比特币的安全,我写个这个,以此抛砖引玉,让大家对比特币安全有个了解。
2014-8-16 00:10
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
有源码的确有很大帮助,可以很快的想通黑客在哪些做了哪些手脚,但还是需要逆向分析才能更全面、更准确的知道黑客的全部所作所为,比如:LTC地址的加密、共10个LTC地址等等,这些都是分析所得,只凭源码猜测,是很难了解全部的。
2014-8-16 11:34
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
11
兄弟,看来你也读过源码了,我想问个问题,钱包秘钥丢了能找回吗
2014-8-16 14:39
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
钱包分:本地钱包、在线钱包、硬件钱包、脑钱包等几种,如果是官方提供的bitcoin-qt这种钱包,丢了找不回来。如果是在线钱包,看钱包网站关于私钥的保存方式了,如果仅仅在客户端有保存,丢了肯定找不回来了,如果网站服务器端有保存密钥,那有可能找回来。至于硬件钱包、脑钱包等,没怎么研究,不好说。
2014-8-16 14:58
0
雪    币: 7885
活跃值: (2285)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
期待楼主更多文章。
2014-8-16 17:04
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
14
就是本地钱包,本地验证
2014-8-16 17:31
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
本地钱包,丢了就找不回来了,私钥、地址是配对的,用加密算法生成的,不能反推的,最好导出私钥,做成纸钱包(二维码),这张纸保存好,有个备份。且不要让别人知道私钥,知道私钥就可以获取你的币了。
2014-8-16 17:36
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个就是换换标签的事情而已了
2014-8-17 03:22
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
不是换标签,是换标签的字符串!
2014-8-17 10:35
0
雪    币: 11075
活跃值: (17602)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
路过,帮顶啊,比特币应该有一点前途吧
2014-8-17 13:11
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这样都有人中招??????????????????????????????????
2014-8-19 09:56
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
很多刚入行的小白,不知道从官网下载,以为网盘的也行,结果很容易中招。
2014-8-19 13:45
0
雪    币: 195
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
火眼金睛哪!
2014-8-20 13:13
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
22
本地钱包盗币方式很多,这只是我分析的很多种中的一种,回头我会总结本地钱包的各种黑客盗币方式!
2014-8-21 10:46
0
雪    币: 237
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
比特币的客户端软件始终是比特币的安全体系中最弱的一环。
2014-9-29 17:35
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我在国外的black网站被盗了几千价值RMB的BTC,好想哭
2014-10-10 09:08
0
雪    币: 98
活跃值: (76)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
25
同情你。你既然是做安全的,怎么还会丢呢?没尝试找回来吗?
2014-10-13 18:16
0
游客
登录 | 注册 方可回帖
返回
//