Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >新160个CrackMe分析-第1组:1-10(上)

新160个CrackMe分析-第1组:1-10(上)

原创
作者头像
极安御信安全研究院
发布于 2022-09-01 11:39:08
发布于 2022-09-01 11:39:08
1.3K0
举报

作者:selph

目录:

•001-前言1

•002-abexcm52

•003-CrueheadCM33

•004-AcidBytes.24

•005-Andrénalin.15


•006-ArturDents-CrackMe26

•007-reg7

•008-Afkayas.18

•009-Boonz-KeygenMe1

•010-ceycey10

6-10(关注下期文章)

1.001-前言

160个CM来自:新160个CrackMe算法分析-001-简介_哔哩哔哩_bilibili

视频课件下载,百度网盘:https://pan.baidu.com/s/1BaROP5e9UbJMSN1sgOOKbA 提取码:z2i6

前言

这位师傅整理了新160CrackMe和配套的逆向视频来帮助新手练习逆向技能,逆向的基础便是阅读反汇编的能力,这正是本练习的核心所在

以前我想过去坚持把160个做完,但没坚持下来,近期总想着每天多多少少做点逆向练习,于是我打算去再次挑战,本次以这个师傅整理的为准进行逆向的练习,去扎实自己的逆向功底

这个师傅提供了逆向的讲解视频,主要是基于OD动态调试分析的以及VB版本的注册机编写

这里我从另一个视角去完成本系列文章:以IDA静态分析为主,x86dbg动态分析为辅,完成程序的调试和分析,使用C++/C# 编写注册机

欢迎有兴趣的童鞋来探讨交流~

本系列难度星级

CM难度评星标准按视频里的走:

算法:

–⭐:明文字符串操作

–⭐⭐:很容易看懂的算法

–⭐⭐⭐:算法复杂但容易看懂,or 算法简单但不容易看懂

–⭐⭐⭐⭐:算法难,看懂难

–⭐⭐⭐⭐⭐:分析不出来,以后回来做

爆破:

–⭐:静态分析就能找到关键跳

–⭐⭐:回追一层,或修改2个点的

–⭐⭐⭐:回追二层以上,或修改超过2个点的

–⭐⭐⭐⭐:回追多层,修改点难找且多

–⭐⭐⭐⭐⭐:暂时无法破解,以后回来做

2.     002-abexcm5

爆破难度:

算法难度:⭐

信息收集

运行情况:输入序列号,输入错误会提示错误并退出程序,这是个验证序列号的程序

查壳:无壳

查字符串:有提示语,疑似硬编码的字符串

查导入表:使用了字符串操作类的函数,以及GetVolumeInformationA函数,不知道序列号生成跟这个有无关系

到现在已经知道了软件大概的运行流程:获取用户输入,对用户输入进行一些处理,然后弹框提示

逆向分析

IDA里选择MessageBoxA函数查交叉引用,跟踪到函数sub_401056中,这是CM的校验逻辑所在:

首先先获取用户输入,然后生成两个字符串:(注释写错了,应该是do-while循环而不是while循环)

然后把刚刚生成的两个字符串拼接到一起,生成序列号,与用户输入进行比对,序列号几乎是硬编码

暴力破解

验证逻辑是:生成序列号,通过与用户输入的比对来进行验证

暴力破解的思路是:修改跳转条件即可,把jz改成jmp即可:

算法分析

注册码生成算法:

#include #include int main() {     char VolumeNameBuffer[MAX_PATH] = { 0 };     DWORD VolumeSerialNumber = 0;     DWORD MaximumComponentLength = 0;     DWORD FileSystemFlags = 0;     int i = 2;     char Series[MAX_PATH] = { 0 };     GetVolumeInformationA(         0,         VolumeNameBuffer,         0x32u,         &VolumeSerialNumber,         &MaximumComponentLength,         &FileSystemFlags,         0,         0);     lstrcatA(VolumeNameBuffer, "4562-ABEX");     do{         VolumeNameBuffer[0]++;         VolumeNameBuffer[1]++;         VolumeNameBuffer[2]++;         VolumeNameBuffer[3]++;     } while (--i);     lstrcatA(Series, "L2C-5781");     lstrcatA(Series, VolumeNameBuffer);     std::cout << Series << std::endl;     system("pause");     return 0; }

效果:

总结

字符串拼接生成序列号,通过判断+跳转进行校验,很简单,没啥好说的

参考资料

–[1] GetVolumeInformationA获取磁盘卷标、文件系统,_上善若水pjf的博客-CSDN博客_getvolumeinformationa

3.     003-CrueheadCM3

爆破难度:⭐⭐

算法难度:⭐⭐

信息收集

运行情况:是一个空白界面,可能要经过某些操作才能让内容显示出来

查壳:无壳

查字符串:看到了一些提示语

查导入表:除去窗口绘制,消息循环用到的函数,这里还出现了文件操作相关函数,可能跟文件有关,结合上面的字符串搜索信息,应该需要一个CRACKME3.KEY的文件

逆向分析

根据之前对文件进行静态的信息收集之后,这个文件操作很可疑,就从文件操作函数CreateFileA去搜索交叉引用看看这里在干嘛

首先打开名为CRACKME3.KEY的文件,然后读取其中的内容保存到缓冲区

然后判断读取的字节数如果是0x12就往下走,对读取到的内容进行一顿操作,然后通过某种计算方法进行校验,然后把校验结果保存在al里入栈了

然后经过一段窗口创建的操作之后,在进入消息循环之前,做了这样一个校验,校验文件内容是否正确,正确就弹框提示,正是通过刚刚pushal进行校验的

暴力破解

整个校验流程最后还是通过判断+跳转进行执行的,暴力破解老样子,直接修改跳转条件即可:

前面还有个判断读取到的内容是否为0x12字节,把那个跳转也nop改掉即可,这里就不演示了

算法分析

这里的校验算法主要是这几行:

这里调用了两个自写的函数,首先是sub_401311:这里计算一个前14字节的校验和,然后对前14字节依次与ABCD...进行异或操作,将异或的结果保存起来,校验和也保存起来

然后是下一个函数sub_40133C:就是取后4字节出来

现在这个校验算法已经清晰了起来:

计算一个校验和,校验和与0x12345678进行异或,得到的结果与输入里的最后4字节进行比较

对输入的前14字节进行异或操作,异或后的结果作为参数去调用显示验证成功提示框

那么序列号的生成就是:

a.随便输入一个14字节的字符串作为用户名

b.对这14字节依次异或ABCD...,保存起来

c.对校验和异或0x12345678,然后拼接到异或结果后面,即可完成生成

注册码生成算法:

#include #include void generateSeriesFile(const char* in_pwd) {     char pwd[0x13] = { 0 };     int i;     char var_bl = 'A';     unsigned int sum = 0;     memcpy(pwd, in_pwd, 0x13);     i = 0;     do {         sum += pwd[i];         pwd[i] ^= var_bl;         i++;         var_bl++;         if (!pwd[i])break;     } while (var_bl != 'O');     sum ^= 0x12345678;     *(unsigned int *)&pwd[0xE] = sum;     for (int k = 0; k < 18; k++)     {         unsigned char* tmp = (unsigned char*) & pwd;         printf("%02x ",tmp[k]);     }     HANDLE hFile = CreateFileA("CRACKME3.KEY", GENERIC_ALL, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);     DWORD retNum = 0;     WriteFile(hFile, pwd, sizeof(pwd), &retNum, NULL);     CloseHandle(hFile); } int main() {     const char *pwd= "helloworld@qqq.com";     generateSeriesFile(pwd);     system("pause");     return 0; }

效果:

总结

序列号算法和校验依然很简单,这里有意思的是:这个程序的校验逻辑位于窗口进入消息循环之前,校验行为发生在了软件正常运行之前,根据校验结果再选择是否正常运行程序

参考资料

–[1] ASCII码一览表,ASCII码对照表 (biancheng.net)

–[2] setz_ccboby的博客-CSDN博客_setz指令

4.     004-AcidBytes.2

算法难度:⭐

爆破难度:⭐

脱壳难度:⭐

信息收集

运行情况:

依然是序列号验证,输入序列号点击Check,会显示提示信息

查壳与脱壳:

出现壳了,Die查出来是Upx压缩壳

对于Upx壳使用ESP定律即可完成脱壳,过程相当简单,这里简述一下就不截图演示了:

a.运行到OEP,运行到pushad的下一行(执行这个指令只有esp的值会被修改)

b.在内存中查看esp指向的地址,对该地址下访问硬件断点,然后运行,此时会运行到popad指令的下一行,是跳转到真正OEPjmp,跳转过去

c.使用Scylla进行Dump和修复PE,得到脱壳后的程序

再次查壳验证:

查字符串:

有点帮助的字符串是这些,是验证提示信息

查导入表:

没有什么特别的点,看起来都是图形界面相关的内容,程序使用MessageBoxA弹窗提示

调试分析

这个程序的传参方式比较特别,根据查阅资料[1],前三个数据保存在eax,edx,ecx寄存器里,超过三个参数部分放在堆栈传递

这里以字符串作为入口进行突破,搜索字符串Congrats!...的交叉引用,找到按钮控件的处理例程:

首先是注册了SEH异常链,然后获取用户输入

接下来就是比较+弹窗三连:

输入字符串和硬编码字符串进行对比,如果相同,就弹窗提示成果

如果不相同,就判断是否输入的有内容,如果无内容,提示输入为空,否则提示输入错误

暴力破解

直接Nop掉关键跳即可:

算法分析

硬编码密码,无算法效果:

总结

处理该CM的要点就是脱壳,脱壳之后就是硬编码判断跳转,算是个入门级脱壳练习

参考资料

–[1] Delphi的参数传递约定以及动态参数个数(转载笔记) - 不得闲 - 博客园 (cnblogs.com)

5.     005-Andrénalin.1

算法难度:⭐

爆破难度:⭐

信息收集

运行情况:

功能就是输入密码,然后验证

查壳与脱壳:

无壳,是 VB 编写的 GUI 程序,需要使用 VB 反编译工具进行逆向分析

调试分析

对于 VB 程序,可以使用 VB Decompiler 进行逆向,本例验证逻辑较为简单,估计主要是练习

破解

硬编码校验密码,直接输入即可

效果:

总结

本例没什么难度,主要是告诉初学者,对于 VBCSharp 这类的托管程序,可以使用专门的反编译软件进行代码还原分析逻辑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Protocol Buffers [protobuf]
Protocol Buffers,简称protobuf,是一个强大的序列化工具,它不仅仅是用于数据存储或RPC数据交换的格式。以下是关于protobuf的一些基本信息。
猫头虎
2024/04/09
2120
Protocol Buffers [protobuf]
Protocol Buffers 开发者指南
欢迎来到 protocol buffers 的开发者指南。protocol buffers 是一个语言中立,平台中立针对通讯协议,数据存储和其他领域中对结构化数据进行序列化的扩展方法。
HoneyMoose
2019/07/25
5940
Protocol Buffers vs Swagger: 为什么Google选择设计Protocol Buffers?
在现代分布式系统中,接口定义和数据序列化是两个至关重要的组件。Protocol Buffers(protobuf)和Swagger(OpenAPI)是两种广泛使用的技术,它们在功能上有一定的重叠,但各有优劣和使用场景。本文将详细比较这两者,并讨论Google为何设计了Protocol Buffers。
运维开发王义杰
2024/06/25
2850
Protocol Buffers vs Swagger: 为什么Google选择设计Protocol Buffers?
深入protobuf(Protocol Buffers)原理:简化你的数据序列化
Protocol buffers 是⼀种语⾔中⽴,平台⽆关,可扩展的序列化数据的格式,可⽤于通信协议,数据存储 等。Protocol buffers 在序列化数据具有灵活、⾼效的特点。
Lion 莱恩呀
2024/11/04
7.3K0
深入protobuf(Protocol Buffers)原理:简化你的数据序列化
gRPC & Protocol Buffers
gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。
Helloted
2022/06/08
8350
gRPC & Protocol Buffers
强大的序列化工具:Protocol Buffers
Protocol Buffers 为结构化数据的序列化向前兼容,向后兼容,提供了语言中立、平台无关、可扩展机制的途径。类似JSON,但比JSON更小、更快。
Yuyy
2022/09/21
2.2K0
Protocol Buffers 简介
本文档的 Protocol Buffer 的中文文档使用的是 Asciidoctor 进行编排的
HoneyMoose
2019/07/24
5770
Protocol Buffers 简介
简单介绍 protocol buffer
本文介绍了Protocol Buffers的基本概念、使用场景、优点以及实现原理。重点讲解了如何在C++中使用Protocol Buffers进行序列化和反序列化操作。最后提供了参考资料链接,以帮助读者深入学习。
ke1th
2018/01/02
1.3K0
Google Protocol Buffers 数据交换协议
protobuf(Protocol Buffers)是Google推出的一个结构化数据交换协议,用于传递自定义的消息格式,可用于同一台机器的进程间、不同设备进程间的数据传递。protobuf是一种语言无关、平台无关、高效、扩展性良好的语言,提供了一种将结构化数据进行序列化和反序列化的方法。
Yano_nankai
2018/10/08
1.4K0
Google Protocol Buffers 数据交换协议
protobuf 语法 与 protocol-buffers 的使用
protocol-buffers 是 node.js 平台对支持 protobuf 封装的三方模块,下面的例子都通过 protocol-buffers 的使用来说明。
WahFung
2020/08/24
8390
ASP.NET Core中使用Protobuf从入门到实战
一、Protocol Buffers简介和特点 1、Protocol Buffers简介 ProtoBuf (Google Protocol Buffer)是由google公司用于数据交换的序列结构化数据格式,具有跨平台、跨语言、可扩展特性,类型于常用的XML及JSON,但具有更小的传输体积、更高的编码、解码能力,特别适合于数据存储、网络数据传输等对存储体积、实时性要求高的领域。 2、Protocol Buffers特点 XML、JSON是目前常用的数据交换格式,它们可读性较好。但
跟着阿笨一起玩NET
2021/01/29
2.2K0
GRPC: 理解Protocol Buffers和gRPC的基本概念和使用方法
Protocol Buffers(简称protobuf)是由Google开发的一种灵活、高效的结构化数据序列化方法。它类似于XML或JSON,但具备更小、更快、更简单的特点。protobuf主要用于定义数据的结构,然后生成用于解析和序列化数据的代码。这些代码可以用于各种编程语言,如Java、C++、Python、Go等。
运维开发王义杰
2024/06/25
7500
GRPC: 理解Protocol Buffers和gRPC的基本概念和使用方法
Protocol Buffers 在前端项目中的使用
公司后端使用的是go语言,想尝试用pb和前端进行交互,于是便有了这一次尝试,共计花了一星期时间,网上能查到的文档几乎都看了一遍,但大多都是教在node环境下如何使用,普通的js环境下很多讲述的并不清楚,于是把自己的采坑之路总结一下,希望能让给大家提供一些参考。
吴裕超
2018/08/01
6.8K0
Protocol Buffers 在前端项目中的使用
protocol-buffers简介
执行安卓 自动化测试开的时候,需要安装一个库 protocol-buffers,这个库强大的。来看看这么使用,是做什么的?
叉叉敌
2019/08/16
5900
Protocol Buffers C++入门教程
protobuf(Protocol Buffers )是Google的开源项目,是Google的中立于语言、平台,可扩展的用于序列化结构化数据的解决方案。官网见:here,源码见:github。
恋喵大鲤鱼
2018/08/03
13.2K0
Protocol Buffers C++入门教程
Google Protocol Buffers三两事【知识笔记】
小结:根据上图测评,序列化后的空间开销与解析性能上,Avro与Protobuf不相上下独占鳌头;另外根据“Protobuf协议介绍及性能实测”文中测评来看,报文在几千个字节以内,Protobuf与JSON/XML并没有太大优势,而hessian2表现更优秀;当报文大小超过10万字节,Protobuf性能是XML的3倍,是JSON的2倍,Hessian2的2倍;当报文大小超过10万字节,序列化后的字节大小约XML的1/4,约JOSN的1/2,约Hessian2的1/3;高性能原因Protobuf优化的二进制消息格式,JSON/XML是文本描述的;适用于性能要求高的RPC调用。
瓜农老梁
2020/04/07
1.1K0
Google Protocol Buffers三两事【知识笔记】
搞定Protocol Buffers (上)- 使用篇
因为工作中gRPC使用非常频繁,而gRPC的默认序列化编码采用的也是Protocol Buffers。业界也盛传其效率及其高效:
用户3904122
2022/06/29
5.2K0
搞定Protocol Buffers (上)- 使用篇
造轮子系列之Protobuf
作为一个程序猿,对造轮子这事情可以说是情有独钟,几乎程序猿内心都存在一个梦想是去将开源的技术都实现一遍,所有从本篇开始,我会开一个造轮子系列。
zhuanxu
2019/05/15
8910
造轮子系列之Protobuf
Go 语言中使用 Protocol Buffers
当前流行微服务框架,gRPC和Protocol Buffers 是 Go 的微服务框架常用的框架。
张云飞Vir
2020/04/09
1.4K0
GRPC: Protocol Buffers 3 语法与使用探讨
Protocol Buffers(简称Protobuf)是一种语言中立、平台中立、可扩展的序列化数据结构的方式。它由Google开发,是一种类似于XML和JSON的数据交换格式,但具有更高的效率和灵活性。在本文中,我们将详细探讨Protocol Buffers 3的语法和使用方法。
运维开发王义杰
2024/06/25
3020
GRPC: Protocol Buffers 3 语法与使用探讨
相关推荐
Protocol Buffers [protobuf]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档