吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1751|回复: 3
收起左侧

[原创] 003-Cruehead-CrackMe-3(Crack练习)

[复制链接]
supercat1 发表于 2022-11-8 12:12
打开Cruehead-CrackMe-3.exe可执行文件

003-Cruehead-CrackMe-3.rar (2.69 KB, 下载次数: 6)

1.png

发现什么内容也没有显示,查一下壳,无壳

2.png

OllyDbg打开文件发现右侧注释调用与操作文件相关的函数,推测与文件有关。

3.png

在入口处打个断点运行程序,通过观察可以看到调用函数CreateFileA,栈帧里也出现CRACKME3.KEY这个文件名。函数结束后做比对,此时eax的值为0,没满足跳转条件再接着运行就直接结束程序了。所以推测eax的值与CRACKME3.KEY的存在有关。

4.png

在相同目录下创建CRACKME3.KEY文件,随便输入几个数1234,重复上一次调试,发现满足跳转条件,继续调试观察后面程序

5.png

发现函数调用后出现了比对,比对错误就会直接跳转到上面的jmp然后跳转到程序结束,那么就破解失败了。所以我查看一下比对内容发现0x4021A0与0x12比对,0x4021A0对应上一条函数中的pBytesRead,0x12,推测pBytesRead是文件字节数等于18。在CRACKME3.KEY中输入18个字节再重新调试。

6.png

成功跳过jnz,调试到下一条函数F7进入函数内

观察代码前两行将ecx和eax归零,然后将地址00402008赋值给esi,给bl赋值0x41。

然后便进入do..while..循环。

先将地址esi赋值给al,然后al与bl进行异或运算后重新赋值al,再将al的值赋值到esi中。

esi加一,bl加一,eax的值(此时eax的值为al)加到0x4020F9。

将al与0做对比,如果相等就结束函数,反之继续。

cl加一,bl与0x4F作比较,如果不为0就继续循环。

结束循环后,将ecx的值赋值给0x402149。

7.png

**总的来说这个函数的作用是:将文件中前14个字符分别与ABCDEFGHIJKLMN进行异或运算,每次异或运算后的结果进行累加作检验和。**

循环结束后退出函数,继续调试,下一条指令将0x4020F9与0x12345678做异或运算,也就是将检验和与0x12345678做异或运算。

8.png

接着运行到下个函数F8进入函数,将esp+0x4赋值给esi,然后esi加0xE,然后赋值给eax。此时eax的值为文件18个字节中末尾的4个字节

9.png
10.png

跳出函数后紧接着就进行了比对,0x4020F9与eax做比对。0x4020F9是异或后的检验和与eax文件末尾4个字节做对比。此时我已经可以分析出程序的算法了。

11.png

**算法过程:将文件中前14个字符分别与ABCDEFGHIJKLMN进行异或运算,每次异或运算后的结果进行累加作检验和。然后将检验和与0x12345678进行异或,最后将检验和异或后的结果与末尾4个字符进行对比,对比正确就成功破解了。**

现在我们来实现一下,在内存窗口找到0x4020F9的位置,数据是B8 57 34 12。

12.png

用UE打开本地CRACKME3.KEY文件,使用16进制编辑修改后4个字节的值,然后保存

13.png

保存后运行程序弹出成功窗口!

14.png

用C语言对算法进行一个简单实现,代码如下:

[C] 纯文本查看 复制代码
#include <stdio.h>
#include <string.h>

void crack_003(const char* in_pwd);
int main(){
          const char *inpwd = "howietung@163.com!";
        crack_003(inpwd);
        return 0;
}
void crack_003(const char* in_pwd) {
        char pwd[0x12] = { 0 };
        char bl = 'A';
        unsigned int sum = 0;/*检验和*/
        memcpy(pwd, in_pwd, 0x12);
        int i;
        i = 0;
        do
        {
                pwd[i] ^= bl;
                sum += pwd[i];
                bl++;
                i++;
                if (!pwd[i])break;
        } while (bl != 'O');
        sum ^= 0x12345678;

        *(unsigned int*)&pwd[0xE] = sum;

        unsigned char* tmp = (unsigned char*)&pwd;

        memcpy(tmp, in_pwd, 14);
        for (int k = 0; k < 18; k++)
        {
       
                printf("%x ", tmp[k]);
        }


运行结果:

15.png

16.png

可以正常破解,就是编码有些问题。

17.png




免费评分

参与人数 1威望 +1 吾爱币 +20 热心值 +1 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2022-11-16 14:29
这个CM有点意思。
cease2e 发表于 2023-3-8 22:18
我在写注册机的时候遇到了一个很奇怪的问题,sum最开始我写的是14 次异或结果的和,这样生成的.key文件是失败的,后面我把sum修改为用户名的和.key文件生成的反而正确了,下面是我注册机的代码,附件是成功的截图

#include <iostream>
#include <fstream>

using namespace std;

int KeyGen()
{
        unsigned char key[18] = { 0 };
        char str1[] = "this is a test";
        int a = 0x41;
        int sum = 0;
        for (size_t i = 0; i < 14; i++)
        {
                int tmp = 0;
                sum += str1[i];
                tmp = str1[i] ^ a;
                if (tmp == 0)
                {
                        break;
                }
                key[i] = tmp;
                //sum += tmp;
                a++;
        }
        // cout << sum << endl;
        sum ^= 0x12345678;
   
        *(unsigned int*)&key[14] = sum;

        // 打开要写入的文件
        ofstream outFile("CRACKME3.key", ios::out | ios::binary);
        if (!outFile)
        {
                cout << "无法打开文件" << endl;
                return 1;
        }
        outFile.write(reinterpret_cast<const char*>(&key), 18);
        outFile.close();
        return 0;
}

int main()
{
        KeyGen();
}
test1.png
cease2e 发表于 2023-3-9 15:42
cease2e 发表于 2023-3-8 22:18
我在写注册机的时候遇到了一个很奇怪的问题,sum最开始我写的是14 次异或结果的和,这样生成的.key文件是失 ...

是我昨天晚上脑袋有点迷糊了,前14个字节存储的是异或后的结果,所以对key中前14次异或结果的和刚好是用户名的和
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 03:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表