逆向破解一个简单的crackme
一、打开软件,熟悉功能很奇怪,没有注册按钮,随便输入账号密码也不会有反应
二、查壳
发现没有加壳,并且是使用Delphi编写的,Delphi编写的程序可以使用DeDeDark反编译工具查看详细信息
使用DeDeDrak工具查看:
双击模块名:
发现Panel1窗口有两个点击事件,一个是单击事件,一个是双击事件
过程的CKM中可以看到单击事件、双击事件等事件触发的入口点RVA,先保存下来,到时候进入OD的时候可以参考,但是尝试单击或者双击程序的窗口,发现还是没有反应。目前仍然没有太大的思路,先进去od分析看看先吧。
三、使用OD调试程序
右键搜索一下,看看没有没什么敏感字符串
进来果然发现敏感字符串:
双击进入:此时应该查找关键跳转,看看是什么条件下才会跳转到“恭喜恭喜,注册成功”
先向上翻,翻到
push ebp
mov esp,ebp的地方,也就是函数开始的地方,从函数头开始一步一步分析
函数开始的地方:细心的人可能会发现,这个函数的开始地址457FB8就是上面DeDeDrak工具得到的双击事件入口点
继续向下分析,找关键跳转和关键CMP
发现关键跳转:JNZ跳转直接越过“恭喜恭喜,注册成功”,说明如果JNZ成立,那么就验证失败了
尝试暴力破解,验证是不是关键跳转,在JNZ处下断点,修改标志寄存器Z为1
输入账号88888888,密码99999999,单击或者双击灰色窗口
发现果然破解成功:
也就是说如果0x85和比较成功了,JNZ才会跳转到成功的界面。
进一步分析算法:在上面提到的函数开始位置下断点,单击灰色窗口,OD里面断下来了
经过分析,得到如下注释的分析结果
看起来下面这段框框像是核心算法,但是我们需要关注的是关键代码CMP,只有这个关键CMP比较成功了,下面才会跳转到成功的页面,但是这一堆算法中并没有涉及到的算法,而关键比较的内容是和0x3E,这里就很懵逼,上面的一堆循环算法和我们需要的内容并没有半毛钱关系,猜测可能是作者给下的一个坑。目前的任务还是要关注是怎么赋值的,这样才知道他是怎么完成核心算法的。
关键CMP和跳转
但是问题来了,怎么定位到这个位置呢?怎么查看这块内存是怎么变化的呢?我们知道,这个位置一定是会变化的,当我们输入了正确的账号密码,他就会被赋值为0x85,此时,验证就会通过。但是目前没有办法定位到这块内存,那么我们可以尝试定位一下0x85:
找到一个将0x85赋值给一块内存的指令,双击跟进去查看
发现下图:
也就是说要想成功给赋值0x85的话,那么CMP DWORD PTR DS:,0x3E这条指令必须要比对成功,同理,右键查找所有常量0x3E
发现:
双击跟进去查看:
0x3E要想成功赋值到的话,JNZ必须不能跳转。
向上翻,找到
push ebp
mov ebp,esp
也就是函数的起始位置,下断点(其他断点清理掉,只留下这一个断点),尝试分析这段函数
下完断点之后,发现不管是单击还是双击都没有反应,很奇怪,按理说不应该,理一下上面分析的逻辑:
①比对和0x85,只有比对成功了才会跳转到成功的界面
②查找是怎么被赋值成功0x85的
③只有和0x3E比对成功后才会将0x85赋值给
④0x3E赋值给的前一条指令JNZ必须不能跳转
按理说应该没问题的,如果单击或者双击不会触发的话,那程序又怎么验证呢我们输入的账号密码呢?但是为什么不会断下来呢?
尝试重新启动程序,点击重新运行
一样,输入账号88888888注册码99999999
此时发现,当注册码输入的时候,OD就断下来了,由此判断这个程序的功能是只要输入了注册码,马上就触发响应事件,细心的人也会发现,这个函数的入口点457C40就是DeDeDark工具获取的chkcode入口点。
由此解决了断点的问题,继续向下分析
由此判断,整个程序的正确注册码是:黑头Sun Bird+字符串(账号长度+5)+dseloffc-012-OK+字符串(账号)
我们输入的账号是:88888888,注册码为:黑头Sun Bird13dseloffc-012-OK88888888
验证一下:黑头Sun Bird13dseloffc-012-OK88888888
验证一下账号为1111能否成功:
账号:1111
注册码:黑头Sun Bird9dseloffc-012-OK1111
验证成功,说明分析是正确的。
注册机的写法就不写上来了,无非就是获取输入的账号,再获取账号长度,账号长度+5,再拼接起来
这个程序有个坑:如果在单击事件处下了断点,那么双击灰色窗口也不会进入双击响应事件,会被单击响应事件截取了,所以设置断点的时候,需要将多余的断点清理掉,需要在哪里断就设置在哪里的断点。
总结:
①分析是否有加壳,是什么语言编写的
②若是Delphi语言编写的,可以使用DeDeDrak分析,有助于我们OD分析
③当无从下手的时候,可以从尝试搜索字符串、搜索CreateWindow、MessageBox、GetDlgItemTwxt、GetWindowText等常用函数方法,DeDeDark中的事件入口点等下断点寻找突破口,本篇内容是从搜索字符串突破。
④进入函数后,寻找关键点,比如关键跳转、关键对比等,想方设法的定位到核心函数或核心指令
⑤有些时候可能会遇上混淆的代码,看不懂的可以先跳过,重心侧重于核心代码
**** Hidden Message *****
非常不错啊,感谢楼主无私的共享精神! 有没有这个文件,我也学一下
页:
[1]