-
-
[求助]CrackMe小项目学习——消息死锁问题困境
-
发表于: 2025-10-8 18:30 436
-
首先说明,这是我在GitHub上找到的一个专门供逆向练习的一个小项目,这里分析的是项目里面的第一个、也是最简单的CrackMeOne小程序。
此项目由作者 ripxorrip 在 https://github.com/philip-karlsson/crackmes/releases 上发布。
在DIE里面扫描文件基本信息后确认32位、无加壳等以后运行程序——是一个要求输入用户名和密码的“标准”CrackMe程序,根据经验可能会是根据用户名来推密码,但是现在还不太确定。
其实我在刚开始还走了一点弯路:因为像这类程序肯定是先输入然后再验证的嘛!所以我就想着多次动态调试找到它等用户输入完以后处理输入的那个地方下个断点,然后一分析它的处理过程不就出来了吗!不过呢,最后找到的是个消息处理的死循环(一直循环等输入),每次按下OK表示输入完毕以后就直接跳转到ntdll的位置了,这就导致没办法看到它处理输入的地方。下面这个图就是消息处理循环处的一张截图。
图一
也就是从这里,仅仅靠观察程序运行状况就很难再进行调试。我也尝试在循环那里下条件断点定位最后一次循环,但是确实还是失败了,里面的消息处理很复杂,使用了封装好的函数,一个个分析肯定不现实,所以还是老老实实使用惯用的方法进行索引字符串,既然输入错误时程序没有任何反应,也就是说只有输入正确程序才会有提示,通过这个可能定位到它处理输入的关键字段。
前面都是废话,下面是解决这个小程序的过程。
在OD中右键 -> search for -> all referenenced text strings,发现一个什么什么secret password的成功提示语,点进去下个断点,随便输入点什么按OK键还真来到这一块来处理输入。
结果,居然……是硬编码值。
图二
底下处理了这段硬编码值:
图三
JNZ条件跳转那里,如果CMP比较结果不符就直接返回了:
图四
于是程序就进入了新一轮等待输入中。所以程序的密码就是那串硬编码值,换成ASCII值后就是j5%9lk,甚至和用户名都没关(。﹏。)……
这个程序其实破解还是挺简单的对吧,但是我其实还是想讲一下我之前错误的处理过程,我一直在想,既然这个小程序也是在最后处理那个用户输入,为啥在消息处理那里就找不到通过字符串索引找到的那段代码呢?在那段消息处理的循环中,前期是可以看到一个初始化界面的,但是没有任何按钮,没有任何交互,也就是说,这个函数这里就是负责做初始化,创建窗口初始化按钮等。继续调试,在中间循环的某一次中,底下的任务栏出现了图标,但同时,程序到达了ntdll的中断位置,于是程序卡住了。在这之前,程序在卡住以前最后调用的上图消息处理循环处的00741020地址处的函数。点进去查看:
图五
比较长的一个函数,这里没有截图完整,但是可以看到几个API调用,去Windows官网查一下API可以大概猜测这个函数是处理消息的函数。其实调试刚刚那个循环就可以发现一个奇怪的现象,如果单步执行,程序就会一直循环下去,尝试使用条件断点也不行。但是如果在那个小循环外下一个断点,运行至断点处,程序就会立刻跳转到ntdll处,而且在没看到过程的情况下就完成窗口初始化并等待用户输入,这时如果测试性给程序一个输入并按下OK键,程序只是会到达ntdll的另一个位置,永远找不到处理用户输入的位置。
小循环的关键就是调用图一地址00741020(有ASLR)的函数,所以造成循环结果差异的原因肯定在这个函数中。
图六
在这几行代码中有一个跳转,而跳转的两个分支一个是调用API PeekMessageW,另一个分支是调用API GetMessageW,单步执行时会触发GetMessageW分支使程序阻塞等待。
梳理一下这个逻辑:现在遇到一个处理消息的循环,但是由于调试器总是暂停程序,所以程序就一直收不到来自系统的消息,导致在图一00741020地址的那个函数中一直跳转到GetMessageW的分支那里,一直收不到就一直等待,陷入一个死循环。但是假如我修改寄存器值让它跳出死循环,这个程序又不能完成窗口的初始化,可以试一下,运行到图一循环中的 74 DA JE SHORT CrackMeO.008C1234 语句时把ZF修改一下,跳出循环后窗口里面都没有按钮,再调试到后面时窗口就关闭了。
这样还是有问题,因为循环中间有几条语句并没有执行。所以我又尝试修改了两个API的分支外加那个循环分支,然后在图一 A1 F8729600 |MOV EAX,DWORD PTR DS:[9672F8] 语句处下断点,让程序自己执行那个消息处理函数,这一次就能看到窗口初始化成功了,但是后面再运行还是使窗口关闭了。这就出现一个矛盾,一方面是无法退出的死循环,另一方面又是窗口无法收到信息时出现的一系列错误。
到这里有点解决不了了,等我再去学一下API Hook。
一点个人学习经验分享,欢迎交流、指正。