您的位置:首页 > 其它

crackme #2 Afkayas.1

2018-01-31 19:46 218 查看
简单描述一下过程,具体的解释就省略了,初次接触crackme的可以选择看上一篇crackme#1,会详细很多~~

首先我们用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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  crackme #2 Afkayas.1