crackme #2 Afkayas.1
2018-01-31 19:46
218 查看
简单描述一下过程,具体的解释就省略了,初次接触crackme的可以选择看上一篇crackme#1,会详细很多~~
首先我们用OD打开Afkayas.1.exe,F9运行一下,任意输入name/serial:
![](https://img-blog.csdn.net/20180131171503488?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
弹框后在OD中F12暂停一下,然后Alt+k查看一下堆栈段:
![](https://img-blog.csdn.net/20180131190302772?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我们看最后一行,调用弹框rtcMsgBox函数,调用这个函数的位置在0040261C处,我们先进入msvbvm50.rtcMsgBox处,在这下一个断点:
![](https://img-blog.csdn.net/20180131190618585?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
那么F9运行,再重新输入一次name/serial,提交验证,程序会停止在弹出结果消息框前,现在程序的状态就应该是完成了验证,计算出了验证结果,只是还没有弹出消息框,这时可以我们去调用rtcMsgBox函数的位置0040261C处看一看:
![](https://img-blog.csdn.net/20180131191615637?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在调用这个函数前以及完成了验证,那么一定存在关键的跳转,判断是往验证结果正确还是错误,而且在上图中,右侧的注释里我们可以看见“Try Again”等字符串,也给了我们关键验证部分在上面的暗示。那么我们向上找附近的条件跳转:
![](https://img-blog.csdn.net/20180131191832502?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
那么在跳转的上面一定有正确serial的计算过程和对我输入的serial进行验证的过程,继续向上分析,在这个过程中主要看堆栈中的值、各寄存器的值以及一些标志性的指令(进行数学运算类的,imul,add等)。
首先我大体观察了一遍现状态下的堆栈里的内容,一般正确的serial计算出来后会存储在内存中,应该可以在堆栈中找到,但是这个程序里我没有找到,猜测是作者刻意在验证完毕后抹掉了。我看了半天也没有看出什么,于是我在上面这部分代码中较为随意的(不能太随意,因为里面存在各种跳转,可能你下断点的地方根本没有执行。。我第一次下的断点就直接被忽略过去了)找了一个地方下了断点,重新运行程序并断下,这次断下再去查看堆栈可以发现程序计算出的正确的serial,输入就能通过啦~
还没有结束,我们还需要些kengen,那就要弄清楚程序计算serial的过程,像上面随意试了几遍下断点的位置后,发现确定不了开始计算serial的代码位置。我选择继续往上看,找到这部分代码的,也就是这个验证函数的起始位置(一般函数都从从push ebp开始)处下断点,然后开始F8单步观察:
![](https://img-blog.csdn.net/20180131193250247?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
单步过程中还是主要看堆栈中的值、各寄存器的值以及一些标志性的指令(进行数学运算类的,imul,add等)。最后发现了关键算法的部分,但是找到不一定能看懂,用F8单步没有进入很多函数的内部,并不知道在这个过程中调用的函数都是什么功能,就会出现这样的情况:F8过一个call后,寄存器eax的值就变了,但是我一开始并不知道这个值的含义,我就用不同的name/serial多试了几次,弄清楚了整个算法过程,如下图,右边有补充的部分中注释:
![](https://img-blog.csdn.net/20180131194221987?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuZXNzYV9qcA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
当我看见寄存器的值中出现了之前在堆栈中发现的正确serial,基本就可以判断计算serial的算法结束了,不放心还可以继续向下单步到结束。
总结一下上面求serial的过程:name的长度 *0x17CFB+name第一个字符的ASCII,然后将这个数转换重字符串,我用C语言写的kengen如下仅供参考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(){
char name[20];
scanf("%s",name);
int len;
len=strlen(name);
int num;
num=len*0x17CFB+name[0];
char str1[30]="AKA-";
char str2[20];
sprintf(str2,"%d",num);
strcat(str1,str2);
printf("The serial is %s\n",str1);
}
首先我们用OD打开Afkayas.1.exe,F9运行一下,任意输入name/serial:
弹框后在OD中F12暂停一下,然后Alt+k查看一下堆栈段:
我们看最后一行,调用弹框rtcMsgBox函数,调用这个函数的位置在0040261C处,我们先进入msvbvm50.rtcMsgBox处,在这下一个断点:
那么F9运行,再重新输入一次name/serial,提交验证,程序会停止在弹出结果消息框前,现在程序的状态就应该是完成了验证,计算出了验证结果,只是还没有弹出消息框,这时可以我们去调用rtcMsgBox函数的位置0040261C处看一看:
在调用这个函数前以及完成了验证,那么一定存在关键的跳转,判断是往验证结果正确还是错误,而且在上图中,右侧的注释里我们可以看见“Try Again”等字符串,也给了我们关键验证部分在上面的暗示。那么我们向上找附近的条件跳转:
那么在跳转的上面一定有正确serial的计算过程和对我输入的serial进行验证的过程,继续向上分析,在这个过程中主要看堆栈中的值、各寄存器的值以及一些标志性的指令(进行数学运算类的,imul,add等)。
首先我大体观察了一遍现状态下的堆栈里的内容,一般正确的serial计算出来后会存储在内存中,应该可以在堆栈中找到,但是这个程序里我没有找到,猜测是作者刻意在验证完毕后抹掉了。我看了半天也没有看出什么,于是我在上面这部分代码中较为随意的(不能太随意,因为里面存在各种跳转,可能你下断点的地方根本没有执行。。我第一次下的断点就直接被忽略过去了)找了一个地方下了断点,重新运行程序并断下,这次断下再去查看堆栈可以发现程序计算出的正确的serial,输入就能通过啦~
还没有结束,我们还需要些kengen,那就要弄清楚程序计算serial的过程,像上面随意试了几遍下断点的位置后,发现确定不了开始计算serial的代码位置。我选择继续往上看,找到这部分代码的,也就是这个验证函数的起始位置(一般函数都从从push ebp开始)处下断点,然后开始F8单步观察:
单步过程中还是主要看堆栈中的值、各寄存器的值以及一些标志性的指令(进行数学运算类的,imul,add等)。最后发现了关键算法的部分,但是找到不一定能看懂,用F8单步没有进入很多函数的内部,并不知道在这个过程中调用的函数都是什么功能,就会出现这样的情况:F8过一个call后,寄存器eax的值就变了,但是我一开始并不知道这个值的含义,我就用不同的name/serial多试了几次,弄清楚了整个算法过程,如下图,右边有补充的部分中注释:
当我看见寄存器的值中出现了之前在堆栈中发现的正确serial,基本就可以判断计算serial的算法结束了,不放心还可以继续向下单步到结束。
总结一下上面求serial的过程:name的长度 *0x17CFB+name第一个字符的ASCII,然后将这个数转换重字符串,我用C语言写的kengen如下仅供参考:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(){
char name[20];
scanf("%s",name);
int len;
len=strlen(name);
int num;
num=len*0x17CFB+name[0];
char str1[30]="AKA-";
char str2[20];
sprintf(str2,"%d",num);
strcat(str1,str2);
printf("The serial is %s\n",str1);
}
相关文章推荐
- WHCTF 2017 逆向题 CRACKME、BABYRE、EASYHOOK 的解题思路
- crackme之018
- crackme之019
- 报错 argument #2 is 'nil' '[not function]' expected
- 160个crackme(1)----Acid burn
- Crackme 1
- Crackme 21
- Crackme 22
- Crackme 23
- Crackme 25
- 对于160个CrackMe之23的分析
- OD破解Crackme1.exe密码
- 使用OllyDbg破解EasyCrackMe
- 硬编码序列号追踪-CrackMe系列1
- 菜鸟逆袭 CrackMe第一弹
- OD断点分类
- LibreOJ β Round #2 B.贪心只能过样例【Dp+bitset优化】
- LibreOJ β Round #2 A. 模拟只会猜题意【前缀和】
- 《PEDIY CrackMe 2007》学习笔记(一) - 序列号 - aalloverred - Taliesin‘s KGM1Tal
- 160个练手CrackMe-005