乐趣区

Crackme-010

Crackme010 的逆向分析

1. 程序观察

程序只有一个输入 Key 值的地方,尝试输入 “123”,程序和 008、009 一样出现的还是德语错误提示,因为这都是一个人制作的小程序。
虽然这个程序标注的是 3 星难度,但是我感觉这个程序和 009 一样,只是稍微有一点不同,难度应该也是 1 星 才对。

2. 简单查壳

无壳。

3. 程序分析

使用 OD 载入程序,搜索字符串

双击进入代码,可以看到,和 009 几乎是一模一样。


程序流程大概就是:

  1. 程序首先求得输入 Key 的长度。
  2. 建立循环,循环次数为 Key 的长度。
  3. 每次取我们输入的 Key 的一个字符。
  4. 将字符转换为 ASCII 再加上 0xA。
  5. 再次转换为字符形式。
  6. 将转换过的字符连接起来。

在最后程序将转换过的字符串和字符串 “kXy^rO|yXomkMuOn*+” 进行比较,如果相同进提示正确,不相同就提示错误。

4. 写出注册机

既然已经知道了转换的步骤,也有了正确的转换后的字符串,那么反推出正确的 Key 就是很简单的了。

#include <stdio.h>
#include <string.h>


int Key()
{char szKey[30] = "kXy^rO|*yXo*m\\kMuOn*+";
    int NameLen = 0;

    NameLen = strlen(szKey);

    for (int i = 0; i < NameLen; i++)
    {szKey[i] -= 0xa;
    }
    printf("%s", szKey);
    return 0;
}

int main(int argc, char* argv[])
{Key();
    return 0;
}

相关文件在我的 Github

退出移动版