[CrackMe]160个CrackMe之002

吾爱破解专题汇总:【反汇编练习】160个CrackME索引目录1~160建议收藏备用

一、逆向分析之暴力破解

  暴力破解,对于这种具有提示框的,很好定位。

  定位好之后,爆破其跳转语句,就能达到破解目的。

  当然,我们之后还会分析其算法写出注册机。

 

  1)点击OK,弹出标题上的对话框。此时点击暂停(不要关闭对话框),然后跳转到 K窗口。

    可以看出其栈的调用顺序,最下面的位于 0x40000(EXE)模块内,为用户区代码。

    点击“显示调用”,跳转过去,查看用户区的汇编代码。

    [CrackMe]160个CrackMe之002_第1张图片

   2)往上看,字符很明显。

    [CrackMe]160个CrackMe之002_第2张图片

   3)其跳转结构就是 if else,找到关键跳转点,如图地方使用爆破即可。

    [CrackMe]160个CrackMe之002_第3张图片

 

二、逆向分析之算法分析

  暴力破解,难度比较低,显然不能满足我们的预期。我们的目标是分析其算法写出注册机。

  分析前需要具备一个意识:在2)中我们找到一串疑似生成的serial并验证成功,假设该为十进制字符串,那么我们在olldbg中看到的就是为十六进制的数字。

    0x77148 = 487752,所以需要对 77148 这个数字敏感。

  

  1)查看其跳转时的 IF 条件。

   如下图,使用 test si,si;je xxx 进行跳转。翻译过来就是“若si为0,则跳转到xxx(错误显示区)”

   我们继续往上观察,上面两个函数依次是 __vbaFreeStrList,__vbaFreeObjList,这属于释放对象的函数,因此忽略。

   再往上看,我们发现其存在一个 __vbaStrCmph函数,其是字符串比较函数,且返回值给esi,有大概率可能是“将serial与用户输入进行对比”

   [CrackMe]160个CrackMe之002_第4张图片

  2)在__vbaStrCmp函数处下断点,观察其传入参数。        

    

    一个类似serial,和一个用户输入,我们下面验证一下。

    [CrackMe]160个CrackMe之002_第5张图片

   很明显正确,我们再换一组数据,其后面数字发生变化,我们有理由怀疑 "AKA-"是常量,后面的才是真正的变量。

    

   其根据用户输入计算,下面我们就来寻找这个计算。

  3)寻找 代码生成算法。

    警告:不要再从 __bvaStrCmp算法往上分析,而是找到用户输入的往下分析。

       因为你从下往上,无法确定到底是哪一环生成的,这种排除法很容易出错。

         虽然从上往下,你可能丢掉了输入点,但是你只要看到用户输入,说明并没有被计算,那么你所找的也就不重要了,根据这点来继续分析也可以找到算法。

     我们直接跳到 该函数入口 "push ebp"处,虽然分析的代码有点长,但我们只要盯紧 “CPU区、寄存器区、栈区” 三个部分,单步分析,找到用户名 "abcde" 即可。

     这样想其实也不是那么的难。

    

   4)查找到其 serial算法:

    如图,这是从函数头步一直按F8第一次见到用户输入的字符串 "abcde"

    [CrackMe]160个CrackMe之002_第6张图片

    算法分析:其首先获取用户输入的长度(__vbaLenBstr),然后该值乘以0x17CFB(0x402420处),之后获取用户输入name的第一个字符(a),调用rtcAnsiValueBstr函数获取其ASCII码,最后与前面结果相加。

    5*0x402420+0x61('a') = 0x77148,该值正好与我们前面假设的完全相符,则说明这就是该值的正确算法。

    下面会调用某些函数将其转换为十进制的UNICODE,然后与 "AKA-"进行拼接,最后调用 strcmp 函数进行验证显示结果。

 

三、解题感悟:

  1. 找到serial算法本身就需要具有一定思路,像上面所强调的,找到if语句判断的条件,之后不要从下往上推,而是从上往下推。
  2. 一般这类题不会太复杂,不要陷入很深的函数出不来,那往往说明你分析错了。

 

 

    

    

 

     

 

你可能感兴趣的:([CrackMe]160个CrackMe之002)