吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1937|回复: 19
收起左侧

[CrackMe] 萌新第一次用 C++ 写 CM

[复制链接]
Ki_Yo_Mi 发表于 2024-1-22 13:56
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

输入正确密码后提示:

实在看不懂 C++ 的语法,被大佬手撕已经习惯了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
xlln + 1 + 1 我很赞同!

查看全部评分

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

cattie 发表于 2024-1-22 16:15
Ki_Yo_Mi 发表于 2024-1-22 16:02
大佬,把我源码都扒出来了QAQ

用ida就能反编译了,这玩意用到随机数,算出具体的key有点烦
不过给它判断逻辑jmp就能出现cracked了
cattie 发表于 2024-1-22 15:43
[C++] 纯文本查看 复制代码
// 主函数入口
_main(argc, argv, envp);

// 初始化一个名为Block的内存块,大小为24字节
memset(Block, 0, 24);

// 使用printf函数输出提示信息:"Please input password:"
printf((const char *)Block, v39, v3, "Please input password:");

// 使用scanf函数接收用户输入的密码
scanf((const char *)Block, v39, Block, "%[^\n]");

// 加载三个128位的数据块
v4 = _mm_loadu_si128((const __m128i *)&xmmword_140030070);
v5 = _mm_loadu_si128((const __m128i *)&xmmword_140030080);
v6 = _mm_loadu_si128((const __m128i *)&xmmword_140030090);

// 初始化一个字符串为"default",并将其地址和长度存储在v40数组中
strcpy(v41, "default");
v40[0] = (__int64)v41;
v40[1] = 7LL;

// 初始化一些变量和随机数引擎
v33 = 0LL;
v34 = 0LL;
v29 = v4;
v30 = v5;
v31 = v6;
std::random_device::_M_init(Block, v39, v40, v39);

// 如果v40[0]的地址不等于v41的地址,则释放内存块
if ((char *)v40[0] != v41)
    operator delete(Block);

// 获取随机数并初始化一个Mersenne Twister引擎
v7 = (unsigned int)std::random_device::_M_getval((std::random_device *)Block);
v8 = 1LL;
v40[0] = v7;
do
{
    v9 = 0x5851F42D4C957F2DLL * (v7 ^ (v7 >> 62));
    v7 = v9 + v8;
    v40[v8] = v9 + v8;
    ++v8;
} while (v8 != 312);

// 生成312个随机数
v42 = 312LL;
std::mersenne_twister_engine<unsigned long long, 64ull, 312ull, 156ull, 31ull, 13043109905998158313ull, 29ull, 6148914691236517205ull, 17ull, 8202884508482404352ull, 37ull, 18444473444759240704ull, 43ull, 6364136223846793005ull>::_M_gen_rand(
    Block,
    v39,
    312LL,
    v40,
    0x5851F42D4C957F2DLL);

// 使用生成的随机数进行一系列操作
v11 = v40[v42++];
v12 = (((v11 >> 29) & 0x5555555555555555LL ^ v11) << 17) & 0x71D67FFFEDA60000LL ^ (v11 >> 29) & 0x5555555555555555LL ^ v11;
v13 = (0x100 * (unsigned __int128)((((v12 << 37) & 0xFFF7EEE000000000LL ^ v12) >> 43) ^ (v12 << 37) & 0xFFF7EEE000000000LL ^ v12)) >> 64;

// 初始化一些变量和寄存器
v14 = 0LL;
v15 = v13;
v32 = _mm_shuffle_epi32(_mm_cvtsi32_si128(v13), 0);
v29 = _mm_xor_si128(v4, v32);
v30 = _mm_xor_si128(v5, v32);
v31 = _mm_xor_si128(v6, v32);
v33 = v32;
v34 = v32;

// 检查密码输入是否正确
do
{
    if (v29.m128i_i32[v14] != ((unsigned int)v13 ^ *((char *)Block + v14)))
    {
        // 如果密码错误,初始化一些变量并输出错误信息
        v16 = Command;
        v17 = 15LL;
        v18 = _mm_loadu_si128((const __m128i *)&xmmword_1400300A0);
        while (v17)
        {
            *(_DWORD *)v16 = 0;
            v16 += 4;
            --v17;
        }
        v37 = 10;
        v35 = v18;
        v36 = _mm_loadu_si128((const __m128i *)&xmmword_1400300B0);
        goto LABEL_12;
    }
    ++v14;
} while (v14 != 24);

// 如果密码正确,加载一些变量并输出一些信息
v20 = _mm_loadu_si128((const __m128i *)&xmmword_1400300A0);
v21 = Command;
v37 = 10;
v22 = 15LL;
v23 = (char *)&v35;
while (v22)
{
    *(_DWORD *)v21 = 0;
    v21 += 4;
    --v22;
}
v35 = v20;
v16 = (char *)&unk_140030000;
v36 = _mm_loadu_si128((const __m128i *)&xmmword_1400300B0);
do
{
    // 输出一些信息
    printf(
        (unsigned int)&unk_140030000,
        (unsigned int)v39,
        *(_DWORD *)v23,
        (unsigned int)&unk_140030000,
        v15,
        v10,
        v24,
        v25,
        v26,
        v27);
    v23 += 4;
} while (v39 != v23);

// 执行系统命令
LABEL_12:
system(v16);

// 结束随机数生成
std::random_device::_M_fini((std::random_device *)v16);

// 返回0表示程序正常结束
return 0;

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Ki_Yo_Mi + 1 + 1 用心讨论,共获提升!

查看全部评分

头像被屏蔽
落叶回不来 发表于 2024-1-22 15:05
 楼主| Ki_Yo_Mi 发表于 2024-1-22 16:02
cattie 发表于 2024-1-22 15:43
[mw_shl_code=cpp,true]// 主函数入口
_main(argc, argv, envp);

大佬,把我源码都扒出来了QAQ

点评

用ida就能反编译了,这玩意用到随机数,算出具体的key有点烦 版规给它判断逻辑jmp就能出现cracked了  详情 回复 发表于 2024-1-22 16:15
 楼主| Ki_Yo_Mi 发表于 2024-1-22 16:17
cattie 发表于 2024-1-22 16:15
用ida就能反编译了,这玩意用到随机数,算出具体的key有点烦
不过给它判断逻辑jmp就能出现cr ...

那这种该怎么防止呢,把验证密码的逻辑弄得更复杂吗

点评

加VMP之类的强壳,那个也只是减缓分析进程(不过脱壳以后也是这样的) 目前没有绝对安全的阻止措施。  详情 回复 发表于 2024-1-22 16:20
cattie 发表于 2024-1-22 16:20
Ki_Yo_Mi 发表于 2024-1-22 16:17
那这种该怎么防止呢,把验证密码的逻辑弄得更复杂吗

加VMP之类的强壳,那个也只是减缓分析进程(不过脱壳以后也是这样的)
目前没有绝对安全的阻止措施。
 楼主| Ki_Yo_Mi 发表于 2024-1-22 16:23
cattie 发表于 2024-1-22 16:20
加VMP之类的强壳,那个也只是减缓分析进程(不过脱壳以后也是这样的)
目前没有绝对安全的阻止措施。

好的,谢谢大佬指点
怜渠客 发表于 2024-1-22 16:40

没有混淆和vmp,所以分析起来比较清晰

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
 楼主| Ki_Yo_Mi 发表于 2024-1-22 16:46
本帖最后由 Ki_Yo_Mi 于 2024-1-22 16:47 编辑
lianquke 发表于 2024-1-22 16:40
没有混淆和vmp,所以分析起来比较清晰

大佬厉害,不过每次执行都有一个随机数,难道是直接扒了前面那段数组?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-28 04:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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