xiaoyu2032 发表于 2022-5-5 11:42

练习笔记之160Crackme-010

# 160CM-010

## 1.破解过程

  这道题看难度提示为“★★★”,以为会是一道难题,结果VB Decompiler打开一看,发现和009基本相同,只是算法不同。爆破就不搞了,分析了一下算法,也比较简单,就是输入的字符串每个字符ASCII码加10后的字符串与“kXy^rO|*yXo*m\kMuOn*+”比较,相同就成功,完全没有三星的难度。

  VS中开搞,码入代码:

``` Cpp
#include "stdafx.h"
#include <Windows.h>
#include<stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char key = "kXy^rO|*yXo*m\kMuOn*+";
    char code = "";
    int i;
    for (i=0;i<strlen(key);i++)
    {
      code = key - 10;
    }
    printf("字符串为:%s \n",key);
    printf("注册码为:%s \n",code);
    system("pause");
    return 0;
}
```

  运行后,得到结果如下:

  输入文本框,点击OK,发现居然没成功。然后,OD调试、VB Decompiler重新反编译。。。一顿操作猛如虎,结果还是没发现问题出在哪里,算法看起来没有任何问题,一度怀疑vbaVarTstEq函数是不是不光比较字符串内容,还要变量体的数据类型代码完全相同,因为一个是08,一个是8008,但是程序代码里面根本没有修改变量体数据类型的其他操作。
  瞎忙活了半天,结果还是在打印出来的字符串中发现了问题,因为打印出来的字符和输入到程序代码里面的字符"kXy^rO|*yXo*m\kMuOn*+"相比,少了一个“\”。呃……,这才想起“\”在C语言好像是有特殊含义的转义符。
  在字符串中增加一个“\”,新的算法代码如下:

``` Cpp
#include "stdafx.h"
#include <Windows.h>
#include<stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char key = "kXy^rO|*yXo*m\kMuOn*+";
    char code = "";
    int i;
    for (i=0;i<strlen(key);i++)
    {
      code = key - 10;
    }
    printf("字符串为:%s \n",key);
    printf("注册码为:%s \n",code);
    system("pause");
    return 0;
}
```

  编译,运行。

  复制注册码输入文本框,确定,成功!


## 2.总结

  这道题实际感觉应该比009还简单一些,但因为粗心大意,碰到一个比较SB的问题,也花费了不少时间。

- C语言中,单引号、双引号、反斜杠都是特殊的字符,不能直接表示,需要在前面加一个反斜杠。

snake88 发表于 2022-5-5 13:39

厉害了,实在是厉害!

iloveasdl 发表于 2022-5-6 08:11

感谢分享,学习了

linliisnotme 发表于 2022-5-6 11:08

重温学习

taxuewuhen 发表于 2022-5-8 18:41


重温学习
页: [1]
查看完整版本: 练习笔记之160Crackme-010