先贴个动画
前言
大概在08年左右,有一款酷炫到炸的软件摆在我面前,我玩了好久。do!do!do!... 这寂静深夜里的急促的敲门声,总能换回一句”神经病啊!半夜不睡觉“。
在网上搜索了一番,发现我坛有的下载。然后就下载试了一下,果然用不了。
余下内容为无聊的研究,请选择性观看。
本章涉及内容
逆向分析
先对老程序入手,逆向一下看看有什么发现。
VB写的,无壳。直接拖VB Decompiler,可以看到一行关键代码,使用SendMessage的方法来发送消息的。不过现在很显然的已经无法使用了。
老方法炮制,使用Spy++监视消息
抓取多次切换状态的消息,发现并没有任何特殊的消息。可以看出这种通讯方式可能已经被废弃掉了。
上层实现,使用AutoHotKey编写自动化脚本
这个大概是最初级的吧,模拟鼠标按键,完了就能实现反复的上下线了,操作的速度的话一般比手速来的快。
[Actionscript3] 纯文本查看 复制代码 #1::
i=0
loop{
click 1100,996 right
click 962,713
click 1100,996 right
click 936,649
i++
if i>50
return
}
return
代码是这样的,具体坐标请自行根据屏幕大小修改。
速度基本满意,但作为一个技术控,这种实现显得有点LOW。发网上显得会很没面子?而且还不能后台轰炸并且做一些其他的事
中上层,尝试让菜单一直显示
这样的好处就是按键模拟的速度能够快很多,虽然没有成功,但是还是要讲解一下过程,凑一下字数。
核心代码是这样,Hook ShowWindow,不知道为什么TIM也inline hook了这个API,需要先恢复,并且重新Hook不然会造成不稳定。
ShowWindow参数为隐藏的,就跳过,使其不隐藏即可。效果如下
结果这些菜单并按不了,使用AccExplorer可以查看菜单的详细参数,不过意义不大。
底层抓包回放攻击
(这边跳过中层的逆向啥的,先讲底层是因为由底层来下断点获取关键代码更快速更方便。)
按照扣扣一贯的尿性,常用UDP作为通讯,并且使用TEA16进行加密。因为UDP的特殊性,并不需要长连接保持通讯,很方便的可以伪造数据包,所以很可能可以成功。
先用Wireshark抓包,找到关键封包。然后使用Python 2.7写个简易的UDP程序,连接服务器,回放。
(本来是想用WPE的,结果软件打不开,难道不兼容WIN7?)
演示程序如上,运行后即可看到TIM已隐身,测试完毕,说明可行。后面的将会使用GCC(C-Free)深入,Python的话并不是很适合操作二进制数据。
然后用C语言重写了下,并且实现了上下线切换。数据包发送间隔200ms声音更连续,发送太快话服务器可能会拒绝。
服务器拒绝之后,TIM的通讯会自动转变成http或者https通讯,以增加通讯的可靠性和安全性,其实只是个假象。
实际的话,其实还是原来类似的协议。从版本号来看只是版本稍微有些差异,封包的组成基本是一致的。通讯协议也并不是http或者https,顶多算是个使用了80/443端口的TCP协议。
TCP包的伪造可以使用RAWSOCKET或者libPCAP,这边只提一下,暂不深入了,有兴趣的话可以自行尝试。
中层实现,关键CALL
对sendto下断点,这边强调上面的UDP程序。对UDP程序有了解的话,就会知道sendto这个API是UDP协议专用的。
我们只需要对这一个API下断点就能得到关键地址。断到后然后再返回几次就来到了这个地址。
通过这个关键CALL可以得到一些关键的参数如下:
[Asm] 纯文本查看 复制代码 IM.DLL+1DEEB0
在线 10
离开 30
隐身 40
忙碌 50
一开始我尝试使用Cheat Engine来获取隐身0,上线1这样的值。结果并分析不出来,因为TIM并没有使用常规的小数值。
跟进这个CALL(IM.DLL+1DEEB0 ),可以看到是一个创建包的过程。可以看到包的详细组成,和Wireshark上的模版显示的可以对照上。
调用这个CALL,能想到最简单的自然是注入shellcode,然后创建远程线程。
使用FASM编译一段调用,然后接下来你懂的! |