menu 牢记自己是菜
动态调试CrackMe160 练习1
213 浏览 | 2020-04-08 | 阅读时间: 约 4 分钟 | 分类: crackme160 | 标签:
请注意,本文编写于 235 天前,最后修改于 235 天前,其中某些信息可能已经过时。

0x1 前言

有一说一,今天已经是周三了,才开始写第一篇文章的原因绝对不是因为我懒或者是又开始疯狂打游戏了。事情的起因是在逛论坛的时候,偶然发现了我一直想买,师傅一直推荐的《加密与解密》的电子书。反正不要钱,我就把我很久很久没有用过的iPad拿出来,用于专门阅读这本书。结果一开始阅读,我就有一种相见甚晚的感觉。主要是实体书太可怕了,他太厚了导致我不太想看,但是不吹不黑,这应该是我有史以来见到的关于逆向的参考书中最适合我(菜鸡)的一本。讲的十分的详细,我阅读的时候,很多之前遇见的问题,那些只知道如何解决方法但是不知道原理的问题,这里都做出了很详细的解答。在到达第二章的时候,主讲动态调试与静态调试,在阅读的时候我就发现了先辈们留下来的好玩游戏(CrackMe)。所有这些程序都是注册机,从简单到复杂,主要就是锻炼一个逆向手的动态调试能力,与汇编代码分析能力。于是我就准备慢慢的玩一下这些游戏。


0x2 游戏开始

首先我们先打开程序,观察一下程序。首先我们运行程序后会出现一个弹窗,上面写的应该是简介之类的话吧。然后再确定之后,我们进入到了这个程序的主界面。有三个按钮,分别对应着一个两个注册码,和一个退出按钮。一个注册码是固定注册码,一个是由姓名生成的的注册码的验证。我们主要研究第二个验证码的破译。

所以我们先明确一下自己这次的任务:

  • 去除程序垃圾弹窗
  • 完成注册码的算法分析
    至于注册机的编写我觉得暂时没有必要研究,所以先放一放。然后就是书中提到的暴力破解方法,我不太想试因为没有办法提升自己动态分析的能力。所以最后就选择了这两个任务。

0x3 去除垃圾弹窗

首先我们应该确定关键代码在哪里,这里有两个方法确定。由于windows系统是一个建立在消息上的操作系统,所以如果要出现弹窗,必定会调用API函数。而且在OD里面有快速为API函数打上断点的插件,我们可以通过插件为这些函数打上断点。要是不太清楚程序类型的话,就用最笨的方法,那就是在所有可能用来弹窗的API函数开始处都打上断点,一点一点的去试。既然是做逆向一定要有耐心。在命中断点之后,我们在栈中可以看见返回地址,我们就可以定位到这个函数被调用时运行到的地址。其次就是另一种方法,在OD中插件里面是支持直接搜索字符串的功能,我们可以直接使用这个插件去搜索我们需要的字符串。我们可以直接定位到这个垃圾弹窗压栈时的汇编代码。


我们来到这个堆栈,观察这个函数执行方式,发现整个汇编只有push压栈,和call所以这个应该是也是一个函数,被一个地方调用跳转至此的。所以我们还是老方法,找到原先的汇编代码,分析一下,发现在调用前面有一个判断跳转的判断,正好就可以跳过这个弹窗函数(大概就是作者留下的后门吧)。我们在这个地方打上断点,从新运行程序,命中断点后,我们将z标志位进行修改,让跳转实现,我们发现我们越过了垃圾弹窗,直接进入了程序。所以我们在这里的修改方式也就很明确了,我们可以将这个jez修改为jmp就完成了强制跳转。

0x4 分析注册算法

在我们完成垃圾窗口去除之后,我们就进入了最主要的工序--注册算法分析。首先我们要做的是定位关键函数,同样的我们可以使用字符串搜索的方式定位到关键函数。上下波拉波拉找到push函数,发现OD已经告诉你这是一个完整的函数了。所以打上断点,这里就应该是我们的算法的关键代码。

我们在这里要一条一条逐句分析一下我们的注册机到底在干嘛。总的来说,就是上半部分判断输入的用户名是否符合规则,下半部分是对用户名的第一位的一个算法。附上具体流程。

还有就是,在主要过程加密完成之后,还有几个函数完成了注册码的连接操作,在栈中你都可以看见注册码。可能这个就是为啥这个是第一题的原因吧。

0x5 总结

动手完成了一次动态分析,学到的东西还是蛮多的。并且明确了一个问题就是在分析逆向程序的时候,一定要耐心,无论是汇编还是伪代码。逆向永远都是一份在痛苦中获得快乐的游戏,加油ljzjsc。

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!