逆向工程技术对网络安全的意义
一、前言概述
逆向工程是一门网络安全行业重要的技术,很多人比较关心这门技术的学习方法和应用场景,这篇文章我阐述下自己的看法。今天翻老硬盘找到十年前的一篇涉及逆向技术的文章,感觉对介绍逆向工程技术的学习方法和应用场景有些参考价值。
二、文章背景
逆向工程技术是游离在正统计算机教学之外的一门学问,由于学习门槛较高,产出成效较慢,所以网络安全行业虽然普遍认可这门技术的重要性,但在学习方法和如何应用方面并未达成相对统一的意见。我个人对这门技术的关注和实践已超过了十五年,在这项技术的学习和应用方面,我是这么看的:
1、逆向工程技术的学习方法
逆向工程技术不是一门单独的学问,不是说能看懂汇编语言、会用调试器就算学会了。也不是说会脱壳、会分析病毒、会打pwn就算会了。这门技术的任务弄明白未知的计算机程序运行原理包括实现细节,在此过程中,需要积累对目标程序足够多的知识。如果没有这些基础知识的支撑,那距离实际应用会差非常远。
2、逆向工程对网络安全的应用价值
目前网络安全行业对逆向工程的应用场景主要停留在几方面:一是病毒分析,用于开展病毒防护;二是挖掘二进制程序漏洞;三是CTF比赛中的逆向题和pwn题。如果仅就这三方面来说,那无疑对技术的应用限制较大。
从我的经验看来,掌握这门技术的最大意义在于使人具备了对未知事物的掌握,随着对系统底层、恶意代码、各种程序实现的分析掌握,我们在看待任何计算机事物的过程中,可以具备跟别人不一样的视角,这种不断接近事物真相的过程,是解决重大网络安全难题必不可少的基础。所以,逆向工程是一门基础学问,即使网络安全从业人员仅对它进行关注和学习,这本身就是非常大的价值。
下面是大约十年前给黑客防线投稿的一篇文章,今天忽然看到,拿出来发网上聊以纪念吧。
三、打造迅雷会员VIP客户端特权
迅雷很早就开通了会员服务,付费会员可以享受特色服务,其中会员客户端特权,可以享受屏蔽所有广告、更换皮肤的功能,这些都是基于客户端实现的,这里讲解如何实现开通这些功能。要实现这些功能,有很多方法,这里讲解一个便利稳定的思路:注册一个普通用户登陆,修改服务器反馈给本地状态信息,把本账户伪装成vip用户,以实现以上功能。
我这里分析的是迅雷5.8.14.706版本,别的版本跟这个不尽相同,尤其最新版本修改比较大,但原理一样的。首先说一下这个版本迅雷的调试,动态调试可以用OllyDbg,加载的时候要注意,迅雷启动时候由shell程序Thunder.exe进行初始化,然后启动迅雷主程序 Thunder5.exe,启动时候会有一个类似 “/bd3d6584” 的参数,这个参数是根据当前时间计算出来的,由于启动参数与时间有关,所以每次启动时候参数可能不同。如果进行分析,需要注意这一点。下面进入正题,找到会员状态切入点,然后伪造虚假会员。
点击迅雷顶部的个人中心菜单,如图1,会看到用户信息状态,这些菜单项根据当前用户的登录情况、账户权限情况来显示是否可用。如果没有登陆迅雷会员,则登录菜单就可以用,如果已经登陆,则该菜单不可用。现在随便注册一个迅雷会员,登陆进去,可以看到各菜单项情况:注销菜单、升级至vip会员可以用,因为已经处于登陆状态,但会员特权菜单仍然不能用,因为现在还不是vip,没法享受会员特权。现在研究一下这些菜单项是根据什么来设置是否有效的,尤其是会员特权项是根据什么状态来设置的。
以下代码流程是根据对Api函数 EnableMenuItem 下断点观察上层返回处得出的,这个函数的作用是修改菜单项的有效性。下面有的代码不是位于迅雷主模块,因此代码地址与环境有关,也就是不同电脑调试可能不同:
//获取某菜单项的状态,根据状态,设置其是否有效
2313DFC4 call 2313CE10 ; 获取当前菜单项状态
2313DFC9 test eax, eax
2313DFCB je short 2313DFDD ; 如果无效则跳转
2313DFCD push 1 ; 设置菜单项是否有效的参数
2313DFCF mov eax, dword ptr [ebp+10]
2313DFD2 mov ecx, dword ptr [eax]
2313DFD4 mov edx, dword ptr [ebp+10]
2313DFD7 push edx
2313DFD8 call dword ptr [ecx+C] ; 设置菜单项有效
2313DFDB jmp short 2313DFEB
2313DFDD push 0
2313DFDF mov eax, dword ptr [ebp+10]
2313DFE2 mov ecx, dword ptr [eax]
2313DFE4 mov edx, dword ptr [ebp+10]
2313DFE7 push edx
2313DFE8 call dword ptr [ecx+C] ; 设置菜单项无效
上面的虚函数 call dword ptr [ecx+C] 用来设置菜单项状态,进入以后关键代码为:
//这里是修改菜单项属性的地方,第一个参数为1表示本菜单项有效,为0表示本菜单项无效。
004A02D2 push dword ptr [esp+8] ; 参数为1表示菜单有效,为0表示菜单无效
004A02D6 call dword ptr [eax] ; MFC42.2616_CCmdUI::Enable
上面的代码段1,里面有获取菜单项状态的地方,也就是:call 0x2313CE10,这个函数会获取到我们关心的会员权限菜单状态,点击 “个人中心”菜单,可以拦截到 0x2313DFC4 : call 0x2313CE10位置,拦截到第9次时候(因为会员权限菜单为第8个子项目),进入 call 0x2313CE10函数,如下:
2313CE65 call 231359A0
2313CE6A mov ecx, eax
2313CE6C call 23133B70
2313CE71 jmp 2313CFCC
进入第2个函数 call 0x23133B70,里面有个虚函数: 0x23133BAD : call dword ptr [eax+C],这个函数代码如下:
234B7BC3 mov eax, dword ptr [esp+4] //获取菜单结构指针
234B7BC7 cmp dword ptr [eax+E8C], 2 //判断本结构是否有效
234B7BCE je short 234B7BD7
234B7BD0 mov eax, 80004004
234B7BD5 jmp short 234B7BE6
234B7BD7 movzx eax, byte ptr [eax+540] //获取本菜单是否有效标记
234B7BDE mov ecx, dword ptr [esp+8]
234B7BE2 mov dword ptr [ecx], eax
234B7BE4 xor eax, eax
234B7BE6 retn 8
上面 0x234B7BD7 : movzx eax, byte ptr [eax+540] 这处代码获取本菜单是否有效标记,我这里内存位置如下:
//这个字节标记会员权限菜单是否有效
0B3C9524 00
然后对这个内存字节下硬件写断点,研究下什么时候将此处设置为00的。下断点完毕后,重新点击登陆用户,拦截在这里:
//这里是 XLUser 模块:
234C0A77 mov al, byte ptr [edi+15C] ; 获取菜单状态
234C0A7D pop ecx
234C0A7E pop ecx
234C0A7F mov byte ptr [esi+54C], al ; 写入菜单状态,如果al为0表示菜单 ;无效,为1表示有效
正常情况下al肯定为0,因为我的账户不是vip,因此将上面进行修改,令al为1:
//修改为
234C0A77 xor eax, eax ; 获取菜单状态
234C0A79 inc eax
234C0A7A nop
234C0A7B nop
234C0A7C nop
234C0A7D pop ecx
234C0A7E pop ecx
234C0A7F mov byte ptr [esi+54C], al ;写入菜单状态,如果al为0表示菜 ;单无效,为1表示有效
上面修改是基于XLUser.Dll模块,为了防止有些人不劳而获,相关BIN码就不写了。这样就可以模拟一个虚假的vip用户了。会员特权菜单项也可以用了,如图:
这时再点击工具栏的会员中心按钮,设定自己的广告配置和皮肤设置,选择点击生效,就可以实现自己的配置了,效果如图:
不过这样模拟的只是虚假vip用户,凡是与服务器相关的功能,比如快速升级等仍然不可用的,所以建议大家在有条件的情况下选择购买vip服务,支持迅雷发展!
四、文章总结
这是很久以前一个有趣的小实验,毫无疑问在这个实践的过程中,可以增加对目标软件实现原理的理解,同时对这类问题提出独特的改进意见。这种基础技能,也是我从事网络安全行业所应该具备的。