这篇文章先要感谢我一位朋友,我对vb和.net不是很熟悉,分析在他的帮助下才完成了,真的非常感谢他的无私帮助
起因
有一天想找一款工具替代TeamViewer搜寻中发现了UltraViewer还挺好用的,所以来分析一下看能不能获取到用户保存的密码
软件:
UltraViewer6.02.008x
过程
下载下来,先查壳
发现加了UPX的壳
直接脱壳,UPX脱壳教程很多,这里不写了
脱壳的时候明显的发现了VB程序的特征
再查壳,确实为VB程序
查看程序界面保存密码的地方
使用VB.Decompiler.pro查看脱壳的VB程序
发现确实存在这个界面
调试这cmdOK 发现根据输入的密码获取了一串HASH值
然后把值保存在
HKEY_LOCAL_MACHINE\SOFTWARE\UltraViewer 中然后把明文密码清除
这是这种软件惯用的手法,可以看到这个键下保存了许多有用的信息
初步分析,这个软件是通过hash比对的方法来对比密码,这样以来想获取明文密码只能通过HASH爆破或者碰撞的方法了
柳岸花明
似乎分析就这样要结束了,但经过查看一遍软件后
发现还有一个自动填充账号密码的功能,这个看起来似乎有搞头,于是前往设置里查看
默认是会储存密码到加密文件的,不过只有三个小时,但是够用了,但目前还不知道储存密码文件的路径,软件里也并没有给出
这里的思路可以用火绒剑监视一下文件创建和写入的过程
找到可疑的位置TempPass.ini
看这样的内容就像被加密过的,大概率是储存密码信息的文件
再查看ConnectionOutHistory.ini
也储存了一些有用的信息
推测这个密码文件是在加载时候就被载入的,可以通过CE内存搜索来确定密码文件载入内存的时间,或者火绒剑,或者直接下打开文件的条件断点
于是我们在初始化里面去找
发现这个函数
调试这个函数
发现了这里,传入了SID,然后获取了一串HASH,这HASH看起来非常像MD5等一下可以作为分析的要点,或者可以用HASH分析工具分析一下,确定是哪种算法
在这里传入了获取的HASH,然后解密了数据
至此,我们定位完成了一半
我们发现一个问题,这种调用都是通过call [edx+0x170] 来调用的,我们来跟踪一些这些函数的位置
跟进去后发现是CLR系统的CLR模块调用的,也就是说这个VB是通过调用.NET的模块,来实现他的函数功能的,这时候我们就需要定位到.NET的函数模块来分析了。有很多办法,我这里记录两个
1.改变传参是其调用时候崩溃,然后定位崩溃。
2.分析文件结构目录和名字综合推断分析,找出相应的.NET模块
这里由于程序本身的.NET.DLL模块不是很多,耐心一点很快就定位好了
发现模块本身加了混淆,使用De4Dot去除混淆
然后使用dnSpy打开
搜索关键字MD5,encrypt,Decrypt 等等,然后在可疑函数下断点,查看传参和返回是否与之前调试的一致,下好断点后直接使用dnSpy调试
最后定位到了,这几个函数
到这里基本就能解密出来了
大概解密流程就是获取SID->GetMD5
,然后读取加密文件,将加密文件和MD5
传入DecryptData
中进行解密,然后返回密文。
在解密代码还原的过程中遇到一个小问题,目前也没有解决,先记录下来
本来我是向直接调用去混淆后的DLL的解密函数来进行解密,没想到用VS新建一个C#控制台工程后,添加了这个DLL为引用,然后VS就自动退出了.
然后我想将DLL使用反射加载进行调用,然后在创建对象(Activator.CreateInstance
)的这一步莫名奇妙的崩溃了,网上搜也找不到相应的答案,遂放弃改成扣代码;
在扣代码的过程中也有一些要注意,可能是反编译的原因,有些名字还原的比较奇怪,但是一般加解密算法来说都不会自己去实现,都是调用系统库,或者某些现成的库,所以在还原代码的时候,善用搜索引擎,就拿当前的例子来说:
GteMD5
没还原前是这样的:
实际上还原后是这样的
这都是网上现成的例子,但是反编译引擎把
stringBuilder.Append(array[i].ToString("x2"));
翻译成了
stringBuilder.Append(array[i].ToString(<Module>.smethod_6<string>(4013354042u)));
如果再去扣<Module>.smethod_6<string>(4013354042u))
,这句话里面的东西就是太复杂,也不应该
同理类推DecryptData
也是如此,简单的话就自己实现,复杂的话就去网上搜搜,看看别人实现的代码,然后思路就有了
这部分已经分析结束了。
这个软件接下来还可以分析,比如,可以通过ID然后输入任何密码来登录,关键就是要找到密码比对的地方然后想个办法来修改,或者生成密码的地方,这部分待续。。。
这里是生成密码的地方