160个crackme 001 Acid burn

寒假无所事事,哈哈,肝crackme。话不多说:


delphi无壳(噗嗤)

开始界面如下(之前还有一个弹框,待会再破):


左边一个serial/name的注册形式,右边是单serial注册,od直接上。

拖入od后先运行,点开左边serial/name:


name输testname,serial输testserial,再check一下


果然是错的,这时候在od里f12暂停一下,按下alt+k看堆栈:


有一个来自主程序的messagebox调用,右键显示调用

发现来到一个函数结构:

可以清楚的看出这是一个显示窗口的函数,那么调用它的必定牵涉到注册的判断,我们点击函数的头部分:


这里有很多调用,我们一个一个看。


1. 右键转到0042A279,没发现什么有用的东西(其实是下了个断点怎么都运行不到,估计是显示什么特殊情况的。


2. 右键转到0042F4EA处的调用:

发现也是一个函数,结构有点复杂,把程序拖入ida,转到0042F4EA的位置

运气不错,一来就看见了关键跳。那就改一下试试吧。

关键跳的位置是0042F4E5,如果nz就跳,那可以直接在od里右键nop掉。

果然单serial的注册爆破成功了。

3. 右键转到0042F797


下面这段话有点熟悉=.=,就是刚进程序的那个找死弹窗(误


那就nop掉那个call吧

然后惊喜的发现报错了=.=。原因应该是那个push导致堆栈不平衡了。防治要从娃娃抓起,在00F784的push那下断点,运行一下:


发现是返回到00425643,follow一下:


把此处42563Dnop掉。果然找死弹窗消失。


4. 右键转到0042FA6F


发现是一个失败弹窗,结构有点复杂,ida看一下:


两个判断,古董级crackme应该没啥坑,直接把上面0042FA5A处的jge改jmp,0042FB03处跳转nop掉。

此时点serial/name的注册发现成功。

至此,爆破小组工作完毕。



算法

来来来,注册算法了解一下(误

一共两个注册,一个单serial注册如上是在0042F4EA:


发现主判断是调用了函数004039FC,ida进入发现非常复杂。在0042F4D0处下断点发现eax和edx是分别存放输入的serial和一个字符串“Hello Dude!",那么猜测004039FC是比较函数,然后把Hello Dude!输入serial栏,果然正确。(毕竟新手cm)


再来看serial/name的注册,位置是在0042FA6F:


一共两次验证,静态分析太吃力,在函数头0042F998处下断跟踪一下。

跟踪发现很坑= =,这个cm在算法部分做了一些毫无意义的乘法迷惑人,其实serial就是CW-(取账号最后一位的ASCII*82)-CRACKED(在跟踪过程中有一个特别复杂的函数其实是用来16进制转10进制的,需要注意)

至此肝完=.=

猜你喜欢

转载自blog.csdn.net/qq_21201963/article/details/79334166