宽带拨号连接密码恢复原理
前段时间我的ADSL密码忘记了,但幸好还保存在拨号连接里面,于是我到网上找了些星号密码显示工具,可惜不起作用。后来找到一种名为Dialupass的工具,这家伙不负我所望,把密码给我还原出来了 (用的Dialupass v2.42,我的系统是Windows XP) 。抱着浓厚的兴趣,我决定深入研究。略有收获,愿与大家共享。
Dialupass星号密码显示之谜
看上去,Dialupass是非普通的星号密码显示工具,那它的原理是什么呢?上Google查了一番,没找到相关资料。一生气便抄起家伙——Windbg,准备把它大卸八块。郁闷的是,用Windbg加载后,密码就不能还原出来了,显示的是星号。换替补Ollydbg上场,情况依旧。怪了,莫非这小工具有Anti-Debug功能?当时只是一丝怀疑,因为实在不相信这样的小工具作者会花心思来保护。
小知识:
Windbg工具:
Windbg是微软开发的免费源码级调试工具。可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
Anti-Debug技术:
Anti-Debug,即反跟踪技术。防止 Cracker 用 SoftICE 之类的调试器动态跟踪,分析软件。反跟踪技术一般是具有针对性的,即针对某种调试器的反跟踪,而不能防止所有的调试器跟踪。
在用S-ICE跟踪的过程中,发现有这么一个调用:GetProcAddress(xx, “IsDebugPresent”)。原来真的有Anti-Debug功能,好在比较简单。统计了一下,总共有五处进行了Anti-Debug检查。
OK,情况查明了,便换回Windbg来调试。在Windbg里面有这么一个断点可绕过Anti-Debug检测:bp KERNEL32!IsDebuggerPresent “g poi(esp);r eax=0;g”。
花了些时间跟踪了一下,把Dialupass恢复密码的流程都搞清楚了。这小程序猫腻还挺多的,总结如下:
1. 关键函数不直接调用,而是用LoadLibraryA和GetProcAddress来获取函数地址后再CALL;
2. 函数名是经过编码的,反汇编后看字符串是看不到的;
3. 关键地方一概用花指令来迷惑你和反汇编软件。