因为一些学生(包括我)的宿舍在校外,因此无法使用外网进入图书馆访问SCI、IEEE、知网等,这严重阻挡了我的学术热情,于是学校提供了一个VPN软件,学生能够通过它正常访问这些学术资源,这个软件界面如下:
虽然程序已经记住了正确的密码,但由于我忘了我输入的密码是什么,所以突发好奇,想获取这个密码,于是先用spy++看一下,能不能获取到,显然是不能:
好,既然不行,那我就用OD吧,先查一下壳,没有壳:
OD直接载入,运行程序,输入错误的密码,会提示:
好,既然要弹框,那我就对对话框函数下断,但是居然不行,不仅是MessageBox不行,GetDlgItem也不行。
然后我又换了种方法:找登录按钮的响应事件。
这个程序查壳信息是VC++ 6.0编译的,那么需要确定是VC++还是MFC;从模块窗口里可以看到,有mfc42.dll这个模块:
所以这个程序是用MFC写的,双击进入这个模块,输入MFC程序的按钮事件特征码:83 E8 0A。
结果只有一条,如下:
很不巧的是,搜出来的结果并不符合以往的经验,下面是正确的样子:
所以这个方法又舍弃了。
我决定搜索字符串了,哈哈。右键、中文搜索引擎、智能搜索,看看有没有“登录失败”的字符串。
这时就发生了灵异的事件:
前几次调试,搜索的时候,直接能在智能搜索里找到“登录失败”的字符串,然后往后分析差不多就完成了。结果后来准备写笔记的时候,重头开始调试一遍,结果智能搜索搜不到这个字符串了!我重新试了好几次,都找不到。难道我白分析了?
后来,我就乱试,看看OD里还有什么与字符串搜索有关的功能,结果发现一个:右键、查找、所有参考文本字符串。
我使用这个功能后,惊奇的发现了“登录失败”字符串了!
这下我涨经验了,智能搜索不到的字符串能在参考文本字符串里搜到,也许大家都知道,不怕大牛们喷。
好,找到这个字符串后,双击进入,发现左边有个红色线条,说明上面的代码就是重点:
接下来就是重点代码的分析了:
如图所示,序号❶处的call就是客户端发送登录信息到服务器,然后recv后就会返回,如果输入密码错误,这个call就会返回0,如果返回1就说明密码正确。
这个call的返回值就直接影响了序号❷处的跳转,如果返回0,那么计算出来的跳转目的地址就是图中的长线跳转,若跳,则会走向失败!如果返回1,则计算出来的目的地址就是这个jmp下面的一条指令,继续走下去,就会在序号❸处发现用户输入的所有信息:用户名+密码+校验码。
这下就差不多达到目的了,能够知道自己以前输入的密码是什么了,即便忘了也不用去使用找回密码等功能,一切靠自己自力更生。这也是个神奇的程序,能把正确的密码显示出来,可见极其不安全呐。
有人可能会说你调试的时候输入了错误的密码,而且也勾选了记住密码选项,那么程序就记住了你的错误密码,那最后根本运行不到上图中的❸处啊。没关系,这个程序重启的时候记住的还是原来正确的密码,这个就给我们破解提供了方便了。。。
接下来贴一下序号❶的call,跟进去看看,它里面大概是什么功能:
上面的代码就是客户端程序将用户输入的登录发送给服务端,至于怎么验证那是服务端的事情,我们的目的通过逆向客户端就能达到。
最后也有个意外的发现,运行这个程序的时候,进程列表里有个类似服务的字样:
该不会服务端程序也在我机器上吧?这留到下次分析吧。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-10-4 07:41
被BenBenWen编辑
,原因: