吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2061|回复: 7
上一主题 下一主题
收起左侧

[CrackMe] (C++20) - 基于语言标准的crackme (最终版比肩VMP壳)

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

本帖最后由 sakura-galaxy 于 2026-1-20 11:56 编辑

大家好,
这个是C++20系列的crackme,总共有三个crackme,不同于简单加壳或混淆的crackme,这个系列希望通过C++的一些语言特性与代码逻辑实现。
整个系列开放源代码在github/Tokisaki-Galaxy/crackme99 ,如果没有思路可以去看看源代码。接下来时间会在站内放出制作思路。
破解目标是密钥或者输入任意字符达到验证成功。三个crackme均存在密钥,并且密钥很简单可以被短时间暴力碰撞出来。

另外全系列crackme难度跨度较大(具体是beta到gamma,难度跨度非常大),Gamma版本已经几乎达到了商业VMProtect的水平。

Alpha版本
设计上是系列最简单的crackme,但是只喜欢F10的宝宝会疯的。
(其实设计上有点荒谬的233)
在破解的时候,若看到stdxxx就不要再往下追了,是C++标准库。
Alpha版本的目标不同于其他版本,最好可以实现逆向自定义字节码并绕过编译时字符串加密(如果目标是混过关,只是考验基本功)
困难点在于
内部的 VM 调度器使用协程实现。线性执行流被粉碎成堆分配的帧,使标准的“单步跳过 (F10)几乎不可能
一打开 IDA,会看到一堆乱七八糟的 STL 符号(std::_Visit_helper, std::coroutine_handle),代码量比实际逻辑大 50 倍。
Alpha 版本的真正威力不在于它的校验算法多难,而在于通过 C++20 特性建立了一道不同于其他crackme的理解障碍

Beta版本
设计上论坛上一些高手能达到的水平,新手可能完全没有头绪。
困难点在于
挑一些能说的,还有一些要自己发现才好玩。
标准的控制流图几乎完全失效,没有if-else判断,几乎都是throw/catch处理
里面有某些反调试方法


Gamma版本
这个系列的终极形态
设计时候没有想过有人能不参考源代码纯解出来(不过也有可能有大佬没考虑到,其实夸张了),理论上应该是密码学安全的。强度应该与VMProtect类似。
这个完全是炫技的东西。
困难点在于
多态指令流,代码-数据纠缠(指令不以静态形式存在于二进制文件中)
无崩溃执行,即使输入错误的密钥,VM 也会在安全沙箱内执行“垃圾”逻辑。没有任何崩溃来帮助你定位错误。

全系列无壳,Alpha和Beta版本如果还给出pdb就太简单了,所以只在Gamma版本给出pdb。(如果能不参考pdb和源代码解出来那真的是超级无敌厉害了)
希望大家玩得开心,一会发教程。

以下是x64版本




以下是x32版本


如果无法访问论坛附件链接下载,也可以通过github的release下载(github/Tokisaki-Galaxy/crackme99)

本帖子中包含更多资源

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

x

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
BrutusScipio + 1 + 1 用心讨论,共获提升!
156608225 + 2 + 1 用心讨论,共获提升!
jaffa + 1 谢谢@Thanks!
hewok + 1 + 1 用心讨论,共获提升!

查看全部评分

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

沙发
wangnet 发表于 2026-1-19 17:05
赞一个,感谢~·

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
bian96 -15 + 1 警告:CM区等技术板块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

3#
techliu 发表于 2026-1-20 11:14
学习一下

免费评分

参与人数 1吾爱币 -15 违规 +1 收起 理由
bian96 -15 + 1 警告:CM区等技术板块禁止回复与主题无关非技术内容,违者重罚!

查看全部评分

4#
化身千万 发表于 2026-1-20 13:12
本帖最后由 化身千万 于 2026-1-20 13:16 编辑

有趣有趣,得从源代码学习一下你对cpp 20 的用法了,开开眼界
——————
源代码已经看了,的确感触良多,编译期的计算,居然能影响这么多东西,学无止境啊

————
最后,请问一下你源代码中虚拟机这一块该怎么理解?对于虚拟机我一点都不了解,其他的都看明白了
5#
 楼主| sakura-galaxy 发表于 2026-1-20 13:46 |楼主
本帖最后由 sakura-galaxy 于 2026-1-20 13:48 编辑
化身千万 发表于 2026-1-20 13:12
有趣有趣,得从源代码学习一下你对cpp 20 的用法了,开开眼界
——————
源代码已经看了,的确感触良 ...

写C++20的这个crackme是感觉,好多人还抱着老旧的知识和标准,对软件保护仅限于普通的虚拟机保护和加壳保护,基本上没怎么重视纯代码逻辑上的玩法,想让大家看看纯粹从逻辑上能玩到什么程度。
另外大致解释一下虚拟机,这里的虚拟机(crackme和软件保护领域),不同于java和vmware那种,不是为了跨平台或者兼容,而是为了让代码变得不可读。(附带效果是运行缓慢)
相当于你发明了一门谁也听不懂的外星语言(自定义字节码 OpCode)。并且写了一个翻译官(虚拟机解释器 Dispatcher)。程序运行时,翻译官拿出一张写满外星语的纸,翻译一句,执行一句。这就导致破解者虽然能看到“翻译官”在干活,但他不知道“外星语”每个词是什么意思。他必须先查出这门语言的语法(逆向 ISA 指令集),才能理解程序在做什么。

三个版本的crackme虚拟机也有强度差异
Alpha:混淆执行流。利用协程让你找不着翻译官在哪。
Beta对抗调试器。利用异常和时间检测,实现一调就错,一看就断。
Gamma:数学性闭环。
如果想知道更多虚拟机的东西,比如每个版本的虚拟机里面具体技术细节(干了什么),等我有时间完整写个文章来找你

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
化身千万 + 1 + 1 好的,关注你了
evea + 1 + 1 谢谢@Thanks!

查看全部评分

6#
BrutusScipio 发表于 2026-1-22 00:47
sakura-galaxy 发表于 2026-1-20 13:46
写C++20的这个crackme是感觉,好多人还抱着老旧的知识和标准,对软件保护仅限于普通的虚拟机保护和加壳保 ...

有栈协程应该容易调试?
自定义翻译这个问题的话,密文够多总会发现一些规律,除非每次加入某个随机值初始化
7#
 楼主| sakura-galaxy 发表于 2026-1-22 09:18 |楼主
BrutusScipio 发表于 2026-1-22 00:47
有栈协程应该容易调试?
自定义翻译这个问题的话,密文够多总会发现一些规律,除非每次加入某个随机值初 ...

对的,你对于密文和明文可能是一一对应的破解思路很对!所以在后面版本里面,尤其是gamma版本里面,加入了动态对应,加密方式与输入相关。类似恩格斯密码机那种,让每一个密文在第一次对应add,第二次就对应cmp,第三次可能就对应jmp,完全无法静态分析对应关系。
8#
156608225 发表于 2026-1-24 16:34
这里协程也被当作一种复杂的jmp来使用了,跟利用异常跳转的意思差不多
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-5-13 02:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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