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