没什么技术含量,纯属无聊练练手。
出来XX有大把的时间,看着哪个不顺眼就削谁,那个后两位是星号的彩虹显IP 2.71外挂是最欠扁的。彩虹开发团队可能出于对用户安全的考量,有意隐藏了对方IP的后两位,将其改为星号。
思路:通过字符串格式化模板,找到回显IP格式化函数,然后修改之。
显IP的原理非常简单,说穿了就是API HOOK,有兴趣上网能搜出一大堆的文章。彩虹安装目录下的“CaiHong.dll”文件就是被Hook QQ函数的新函数的模块,说起来有点拗口,也就是说,API HOOK能改变被HOOK函数的执行流程,比如QQ “QQHelperDll.dll”模块中IsLogin函数的参数包含了当前登录的QQ号码、状态以及上下文句柄,那么我们就可以Hook该函数,其他函数在调用该函数时就会先调用我们自己写的函数(通过查看堆栈,我们就能得我们想要的数据),在我们的函数内部再调用原函数以便程序能正常执行下去。说了这么大一堆话,简而言之就是说,“我们自己的函数”就位于“CaiHong.dll”文件中,该文件就是我们今天要削的对象。API HOOK本身并不复杂,但是要找到正确的被HOOK的函数却是一件十分艰辛的苦差事,在此向前辈们致敬。
打开OllyDbg载入CaiHong.dll,查找字符串“%d.%d.*.*”。运气不错!验证了最初的猜测,而且只有一个地方引用该串。将*号修改成任意字符,重新启动彩虹,探测好友IP,看到对方IP已经被修改成了刚才设置的字符。进一步确认了IP回显的工作方式。然后找到引用该串的位置:
1004BC6E 8B45 08 mov eax,dword ptr ss:[ebp+8] ; 对方IP
1004BC71 C1E8 10 shr eax,10
1004BC74 25 FF000000 and eax,0FF
1004BC79 50 push eax ; IP的B位
1004BC7A 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
1004BC7D C1E9 18 shr ecx,18
1004BC80 51 push ecx ; IP的A位
1004BC81 68 3CC50810 push CaiHong.1008C53C ; ASCII "%d.%d.*.*"
该动手修改代码了。首先将"%d.%d.*.*" 改成"%d.%d."%d.%d"。打算将代码放置到该段最后的空隙中,先用一个jmp跳出来,将相应的IP数据入栈后再跳回,详见代码
1004BC71 E9 8AA60300 jmp CaiHong.10086300
1004BC76 90 nop
1004BC77 90 nop
1004BC78 90 nop
1004BC79 90 nop
1004BC7A 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
1004BC7D C1E9 18 shr ecx,18
1004BC80 51 push ecx ; IP的A段
1004BC81 68 3CC50810 push CaiHong.1008C53C ; ASCII "%d.%d.%d.%d"
10086300 33D2 xor edx,edx
10086302 8AD0 mov dl,al
10086304 52 push edx ; IP的D段
10086305 33D2 xor edx,edx
10086307 8AD4 mov dl,ah
10086309 52 push edx ; IP的C段
1008630A C1E8 10 shr eax,10
1008630D 33D2 xor edx,edx
1008630F 8AD0 mov dl,al
10086311 52 push edx ; IP的B段
10086312 E9 6359FCFF jmp CaiHong.1004BC7A ; 跳回原函数
修改后的成果:
下面是已修改好的CaiHong.dll,下载后直接覆盖彩虹安装目录下的同名文件即可。
http://www.namipan.com/d/CaiHong.rar/a5333ee56c34d982beb7cc8578e904462058a462ce690300