问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
深入探索软件注册机制:从硬编码到软编码
漏洞分析
在软件破解的过程中,硬编码和软编码是两种常见的手段。硬编码指的是将注册信息直接写入软件的源代码或者可执行文件中,通常较为简单直接,但容易被逆向工程师发现和破解。而软编码则是将注册信息通过算法或者其他加密手段动态生成,使得破解变得更加困难。本文将从硬编码和软编码两个方面展开讨论。
前言 -- 软件注册机制是软件开发中常见的一个环节,它旨在确保用户合法购买软件并获得使用权限。然而,对于一些不法分子而言,破解软件成为了一种挑战和乐趣。本文将深入探讨软件注册机制,从硬编码到软编码,从而揭示其中的奥秘。 在软件破解的过程中,硬编码和软编码是两种常见的手段。硬编码指的是将注册信息直接写入软件的源代码或者可执行文件中,通常较为简单直接,但容易被逆向工程师发现和破解。而软编码则是将注册信息通过算法或者其他加密手段动态生成,使得破解变得更加困难。 本文将从硬编码和软编码两个方面展开讨论。首先,我们将介绍硬编码的破解方法,包括前置引导、断点设置、追踪分析和验证猜想等技术。其次,我们将深入探讨软编码的原理,包括前置反思、断点设置以及对算法进行分析等方法。通过对这些技术的介绍和分析,读者将能够更加全面地了解软件注册机制及其破解方法。 除此之外,我们还将补充讨论一些相关的话题,如程序检查输入框、MessageBox浙点等。这些内容将有助于读者更深入地理解软件破解的过程和技术。 程序GUI ----- 程序和用到的代码附件获取,切记不要本机运行! Name:`Acid burn.exe` 信息收集 ---- 首先老一套,熟悉程序,此程序要破解两个 ![image-20240513213555493](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-dbba59d900f37e0fb9258186c6dba7095dd50f6a.png) 硬编码Serial ![image-20240513213406345](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-6a867009c68393849c1608c61c47ed1d9191f5b9.png) 软编码,编写注册机 ![image-20240513213539097](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-285a18dc6b70c41d81377629388033287589a11a.png) Crack ----- ### 硬编码 #### 1.前置引导 这里面我测试过,发现对`GetWindowTextA`进行断点无法中断,因此参测可能是存在`TranslateMessage`函数,对消息进行翻译。 因此我们有这样一个思路 1. 先对`TranslateMessage`进行断点,设置条件记录断点 2. 再内存中搜索我们输入的`False-Serial`,在这个内存地址设置内存断点。 #### 2.断点设置 现在OD导入函数,然后我们要先运行程序,点击Serial,将我们要输入的`FSerial`输入,在这停下,返回OD设置断点。 这里我使用OD的Command来快速设置函数断点,然后我们在BreakPoint窗口,点击设置的断点,右键 -->在反汇编窗口中跟随(或者直接双击) ![image-20240513215522739](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-64de474695ede7df9eb9dd183bd931cafdbf2eb7.png) 然后我们在这个函数内部断点位置,将其改为条件记录断点。 条件:`MSG==202`,202代表的是鼠标左键抬起时中断,记录MSG的值 ![image-20240513215805708](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-7670ddbcba1e47e4165b68f5487eba49dbc61e1d.png) 设置过断电后,我们在来点击注册按钮,此时函数会中断 ![image-20240513215917028](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-827592e397e18323f776cf49364411d6a437b286.png) 然后我们在`Memory Map`内存窗口,来搜索我们输入的的`FSerial : Aking`。 PS :要开启区分大小写 ![image-20240513220044395](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-cfd22ef49c3abf925dee43ab8b198514e1905b52.png) 在Aking的内存地址设置内存访问断点 ![image-20240513220200665](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-be84b3b54e3534bf07159a7ced3794c8620d75a3.png) 然后我们在把我们设置的条件记录断点给删除,F9运行,然后我们发现函数中断在`0x77D33566`地址 ![image-20240513220308021](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-6b28a62abe5354d601de689641bbc46cc790e9ce.png) #### 3.追踪分析 接下来分析汇编指令,当执行到`0x77D3356F`时,FSrial已经被完全复制过去,然后我们在复制过去的地址设置硬件访问断点。 PS: 一次只能存在一个内存断点。 ![image-20240513220824244](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-c42a52cba5ad2bbf188a23e7e4359d7d18525f11.png) 设置过后,F9继续运行,发现程序中止在`0x00403A27`。 此时,我们发现一个新的字符串`Hello Dude!`,猜测这是TSerial。 ![image-20240513221127105](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-526dd8967b8a277ea6bd0c3ab4ab0d4c50ab9d2a.png) 我们继续汇编指令,发现一个比较语句,我们跟着跳转分析。 ![image-20240513221318666](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-bd054d7c87471f682301c3ae9fd11d1848f52476.png) 跳转至0x00403A85,继续分析 ![image-20240513221550560](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-790f6a68ffe7d5e7f5f6fe819d3e2d02ff27856a.png) 执行返回语句,继续分析,发现关键字符串 - `Failed!`:是注册错误时,弹窗的title - `Try Again!!`时注册错误时弹窗的内容 ![image-20240513221730121](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-3e3cd00e4d90e7ecc3e7dd0416cf1f96feb812b9.png) #### 4.验证猜想 因此我们可以猜想`Hello Dude!`是我们要寻找的硬编码 验证猜想 ![image-20240513222036130](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-f2ac9c5c52edc4c7f6028607c0e130518d8a591c.png) #### 补充点 ##### 程序检查输入框 这是我在破解后突然领悟到的(--。 前面我们在`GetWindowBoxA`函数设置断点不成功,有这样一种可能,即一直在检测输入框内容,当我们输入后,他已经在内存中了 ![image-20240513222722105](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-790f044da882e9b09792e8062f4040da6d2874d4.png) ##### `MessageBox`断点 我们也可以设置`MessageBoxA`断点,这个函数是可以中断 ![image-20240513222941758](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-300e04e57ea0ce600f7cdf6fbed35abd70423c77.png) 可以通过这个函数来进行追踪。 ### 软编码 #### 1.前置反思 这个程序,先开始时按照正常流程分析的,,一步步跳转,一步步分析,发现这个程序来回跳转。比较麻烦,所以有时候我们可以尝试逆向分析,直接通过结果语句往前面看,也许会更加省时省力。 #### 2.断点设置 这次换一个新奇的使用来追踪函数。 首先导入OD,F9运行程序,当我们输入`Name/Serial`是,当弹窗时,在此停下(不点击确定键) ![image-20240514133038947](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-7dff8dd2fdd6a5a3a8b2be5dac16534ddc5ef27d.png) 返回到OD,F12暂停程序,`Alt + K`,调用堆栈窗口。 在调用堆栈窗口,我们发现两个`MessageBoxA`,这时候分析地址,第一个地址为77D5082F这个地址明显太大,不在模块的领空,不是的。第二个地址为0042A1AE,和00400100地址非常接近。 右键 -->显示调用 ![image-20240514142220135](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-328d6f5e76a5349f99b4d4767040a7868fdb000c.png) 查看分析其汇编语句,未发现跳转和特殊字符 在函数调用和这个程序段的守住 `0x0042A170`设置断点 ![image-20240514143341761](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-e675ee571838708f93a9e388be5173a1a60bdc8a.png) 然后我们F9运行,重新注册,点击`Check it Baby!`,程序在我们设置断点的位置暂停。 我们发现一些有趣的地方,在堆栈窗口,发现几个有趣的字符串 ![image-20240514144031776](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-605be89c0faf66aeed7db2fe08275e33d47c282e.png) 我们继续追踪,查看这段代码是由哪个程序调用的,堆栈区,点击`0x0042FB37`,右键 --> 反汇编窗口中跟随。 汇编窗口时我已调转过的,我们又发现有意思的字符串。 两个注册校验后的弹窗信息 ![image-20240514144347962](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-9e92b2e44a7d3c51bebcf6a0924049c6b42549ab.png) 阅读分析其汇编指令,我们发现一个关键跳转`JNZ jnz short 0042FB1F`和关键Call`call 004039FC`,跳转是由这个Call来决定跳哪。 ![image-20240514144545627](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-be51e507ce3dbcb28b8f8545000c4b195ccb7076.png) 我们继续往上阅读汇编指令,借助OD注释,我们发现,前面出现的有趣字符,`CW-5330-CRACKED`是在`0x0042FAF3`后出现的, 到此我们可以猜测,`CW-5330-CRACKED`是我们`Aking`对应的 Serial。 PS:这里可以自行验证。 且`0x0042FAFE`的call指令是用来对比我们输入的`666666`和Serial`CW-5330-CRACKED`进行对比。 ![image-20240514145134909](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-966fcef6aae7978695cf9ce49a5f0253736de354.png) #### 3.Name算法分析 继续往前分析,我们发现有个关键跳转,且又有一个失败时的窗体信息,我们回顾我们程序,由硬编码验证,这里实际上就是硬编码的。 ![image-20240514145902398](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-7b9806a23dad8da85cc9888036b7acab935337f1.png) 关键的地方来了,我们分析jmp跳转语句下的指令,在这里,可以在`0x0042FA79`设置断点,然后重新运行。 逐步分析,通过汇编语句和内存中的地址,我们分析到, 将Name的第一个字符HEX值 ✖0x29再✖2, 我们计算一下`A`计算后的值 ```php 0x41 \* 0x29 \* 2 \= 0x14D2 0x14D2 \= 5330 ``` ![image-20240514150252105](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-2e995e34270197b4ca4088c66bf917cc90a4d5dc.png) 这时,继续对比我们前面的`CW-5330-CRACKED`,我们已经知道5530表示的是我们计算后的十进制数,当然也有是巧合,实际上就是其算法,有兴趣的同学可以在`0x0042FACD`这里面继续跟从查看 ![image-20240514151150892](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-3b62ac9f741e63fd54ca5a7bf36382988814dfdc.png) 5530在程序中的算法是这样. PS 这里面为了省事,我直接把`A`计算后的结果带入了 ```php #include <iostream> using std::cin; using std::cout; using std::endl; int main() { int num \= 0x14D2; char r\_num; while (num) { r\_num \= num % 0xA + 0x30; if(r\_num \>=0x3A) r\_num +=0x7; num /= 0xA; cout << r\_num << " "; } } ``` ![image-20240514152146518](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-2bd8b50aff1a9b58271ab22aeeda4eebd09ee807.png) 然后逆序拼接 #### 注册机 PS:这里面要求Name的长度>=4,忘给分析了 ```php #include <iostream> #include<string> #include<vector> using std::cin; using std::cout; using std::endl; using std::string; using std::vector; int main() { string Name; int hex\_Num; cout << "Name : "; while (true) { std::getline(cin, Name); if (Name.size()<4) { cout << "The name must contain at least 4 characters : " ; continue; } hex\_Num \= Name\[0\]; if (hex\_Num \>= 32) //可以自行修改范围 hex\_Num \*= 0x29 \* 0x2; cout << "Serial: "; cout << "CW-" << hex\_Num << "-CRACKED" << endl; break; } return 0; } ``` `space111:CW-2624-CRACKED` space表示空格。 ![image-20240514153243390](https://shs3.b.qianxin.com/attack_forum/2024/05/attach-068ed7bddd181d4559e3efeaa1596021db7ac6e2.png) 结语 -- 通过本文的阅读,读者将对软件注册机制有一个更加全面和深入的理解,同时也能够了解到一些常见的破解技术和防御方法。希望本文能够对读者有所启发,同时也能够为软件开发和安全领域的研究提供一些参考。
发表于 2024-05-31 09:00:01
阅读 ( 29607 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
请先
登录
后评论
Yu9
9 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!