首页 > 技术文章 > windbg简单破解密码

adair-blog 2021-06-04 11:46 原文

玩windows开发的朋友应该对windbg都很熟悉,它主要的作用就是调试,调试啥?调试你的程序,为啥需要调试?其一就是解决隐晦的一些Bug,比如我的程序运行一段时间之后,性能直线型下降或者退出等等,其二通过调试,可以让程序员更好的理解代码,写出健壮高效的代码,达到天人合一的境界。
 
程序今天主要简单说说通过windbg简单破解.NET桌面程序的一些私密信息,包括登陆密码和数据库连接字符串。程序很简单就是Winform写的一个简单登陆,登陆成功之后,访问数据库获取信息显示到桌面,看图:
 
就是一个简单的登陆界面,一个文本框,一个密码框,两个按钮,一个登陆和取消,就是这么简单。再看下代码。
 
private void btnLogin_Click(object sender, EventArgs e)
        {
            SqlConnection sqlConnection = new SqlConnection("Server = .;Database =  test111;User ID = sa;Password = sa@123456;");
            sqlConnection.Open();
            SqlCommand sqlCommand = new SqlCommand($"select * from Blogs where  id={textBox1.Text} and url='{textBox2.Text}'", sqlConnection);
            var d = sqlCommand.ExecuteScalar();
            if (d !=null)
            {
                Form2 form2 = new Form2();
                form2.Show();
            }
            else
            {
                MessageBox.Show("Login fail");
            }
        }

 

代码也非常简单,不要去纠结哈,逻辑还是简单说下吧,获取用户名和密码到数据库里面查,如果有匹配,就弹出另外一个窗口,如果没有就弹出消息框,登陆失败,这里有个细节,我看过有些代码登陆,通过用户名去查,把该用户的信息返回回来再比对密码,这是一个比较不安全的做法,因为大大降低了破解的难度。最后看一下目标平台,客户端一般情况下会被编译成X86平台,看图。
好了程序准备工作就到这吧,直接编译发布。
 
windbg,我们直接通过windbg去调试刚刚发布的exe,这里我通过Open Exe,直接打开可执行程序的方式,当然windbg支持很多种方式,Attach Exe、Open Dump、Kernel Debug等等。看图。
 
上面涂鸦的部分是因为有我的名字,所以涂鸦了,此时我们的程序是被windbg Breaking住了,也就是我们的程序此时是被阻塞住的,假死状态,这是windbg用户态调试模型的机制,此时我们在命令栏输入G,看下效果。
 
 
在输入完G命令之后,相应的模块被加载,窗口也弹出来了。此时我们看下UI线程的调用堆栈。
 
 
执行了main函数,以及在做windows消息循环,到这一步,后面的处理主要是思维了,也就是怎么切入,拿到我们需要的信息?调试调试,不就是下断点吗?那么这个断点怎么下?这个的观察了,打开登陆窗口,随便输入一个用户名密码,看看能不能找到切入点。
 
如果密码错误,弹出了登陆失败的消息框,那么我们是不是可以以它为切入点,打断点?先试试哈,看下当前线程的调用堆栈。
 
 
发现没有?有个btnLogin的Click方法,长的很像登陆方法,我们通过扩展命令!U看下它的反汇编代码,注意到这里一般都是猜啊,所以调试或者逆向是个细活烧脑的活,看反汇编代码。
 
 
看到么?一条mov指令,伪代码就是A=B,然后call了一个函数,当然这段汇编我是看到了字符串,如果没有需要到内存里面搜索出这段字符串地址,再下断点,我们直接在此处通过bp下一个断点,再GO看下是否命中该断点,随意输入一个用户名密码点击登陆,果不其然命中了断点,此时我们通过!dso查看当前调用栈上面所有托管对象的信息,看图。
 
 
发现没有?我们的连接字符串SqlConnection对象,离我们实现目标越来越近了,再通过!do命令,显示该对象的信息。
 
我们熟悉的connectionString字段终于浮出水面了,并且在托管堆上也分配了空间,继续探索。
 
看到没?这就是我们要找的链接字符串,有了它我们是不是可以直连数据库,即便有权限控制,至少我们有读写权限吧。
 
总结可能有朋友会说,连接字符串我硬编码在代码里面,我需要调试吗?我直接反编译不可以吗?是可以啊,一般情况下,这种配置文件都会通过统一的地方管理,比如redis、zookeeper、阿波罗等等,你反编译还有效果吗?这里我只是举个例子。上只是通过扩展命令调试.NET程序,如果是调试MFC、QT等非托管程序那就是另一个世界了。但是不管你怎么调试或者逆向,思维显的尤为重要,因为大部分时候你的猜,反复验证,当然也离不开底层执行原理和汇编代码。最后介绍几款逆向软件,全球著名的动态分析工具Cheat Engine简称CE,我相信只要是接触过破解的朋友肯定都用过它,曾经是游戏修改的终结者,游戏厂商最恨的一款逆向调试工具,它能轻松修改内存数据甚至代码注入还可以DLL注入,最称赞的地方就是UI的操作性,还有一个X64dbg工具,这个工具界面长的像OD,功能也比较类似,并且开源,在github上面有36k的start。有时候真想吐下糟,前端真好,连字符、字节、编码、字符集都不知道是何物,居然还是“大神”级别的,后端真苦,网络也要懂、硬件也要懂、运维也要、业务也要,好了就到这吧。
 

推荐阅读