CFree注册码及破解过程【转】

article/2025/9/10 15:43:58

C-Free官网: http://www.programarts.com/

‍C-Free 5.0真是一个很棒的编程软件,可今天用着用着却让我注册,下面的注册码分享给大家:

用户名:tianfang

电子邮件:quart@163.com

注册码:2NnUqd3shO2agta0xNjcusfK1LXO

继续享用这个软件吧!‍

====================================================================


 [转贴] C-Free V3.5.2 注册算法分析

今天在DFCG论坛上闲逛时无意中看到一个国产C/C++编译器,C-Free V3.5.2,随手下载只是想看看注

册算法,没有使用,不知道功能如何。

[Cracker] : prince

[时间] : 2005.01.28

[声明] : 只做技术交流,不做商业用途,如果你手头宽裕并喜欢这个软件的话请支持正版软件。

[E-mail] : Cracker_prince@163.com

[软件说明] :

C-Free是一款基于Windows的C/C++集成化开发软件(IDE)。利用本软件,使用者可以轻松地编辑、编

译、连接、运行、调试C/C++程序。特别地,这款软件对于C/C++的学习者非常容易使用,是迅速提高C/C++水平

的好帮手。当然,C/C++高手也会在其中找到许多惊喜的功能。
C-Free包含下列主要特征:

支持MinGW编译器和C/C++解释器Ch 

集成化的调试环境

工程管理

可定制的语法加亮编辑器

智能输入(大大地提高代码输入效率)

函数列表

集成化的C/C++库函数帮助

快速创建控制台、窗口和DLL应用

借助工程模板创建自己想要的工程类型

完善的查找替换功能

可定制的代码模板

支持Window图形界面应用的开发

对话框资源编辑器

[保护方式] : 机器码 + 序列号

[限制方式] : 次数限制 (10 次试用 )

[外壳保护] : ASPack 2.12

[编译器/语言]: Borland C++ 1999 / C++

[下载地址] :http://www.programarts.com/cfree_ch/index.htm


ASPack 2.12 脱壳很简单,ASPackDie也可以轻松对付。无自校验,脱壳后可直接运行。注册情况:机

器码给出,输入用户名prince和序列号8764321,确定,提示重启验证。
说到重启验证,最简单最直接的就想到注册表,确认一下,打开注册表搜索用户名prince,果然找到

在\HKEY_LOCAL_MACHINE\SOFTWARE\C-Free\3.5下,同样列在其中的还有我们输入的假码87654321和我机器上的

机器码(MachineCode)2781318776。这下我们就可以确定了软件确实是通过注册表来进行重启验证的。目标如此

明确,载入脱壳后的程序,下断点RegQueryValueA,恩?没有,再下RegQueryValueExA,呵呵,可以了。F9运

行,马上被断下,看堆栈,ValueName = "layout text",不是我们想要的,继续F9,注意断点不能取消,因为

后面的对注册表的读取还是要靠这个函数,再次断下,还不是,再运行...,大约81次,堆栈中显示ValueName

= "MachineCode",这就是要读取机器码了,注意。再次F9,断在读取RegistryCode也就是假码的地方,呵呵,

敏感。再接下来是读取UserName,即用户名。到这里,计算注册码的准备工作就做完了,可是在那里计算的呢

?作者在软件启动的时候将所有的配置信息连同机器码,用户名和注册码一起读出,而且也没有读出后立即计

算注册码继续比较,这就给我们定位注册码计算造成了困难。这个时候我们该怎么办?两个办法,一个就是下

面都进行单步跟踪,直到找到关键函数为止,毕竟软件在启动前肯定会计算注册码的;另外一个办法就是在内

存中搜索假码然后下内存断点,这个方法倒是即快又方便,但是要掌握时机,具体什么时候搜内存要看代码的

动作。我通常都是先搜内存,不行的话只好一步一步的单跟了,做Cracker要有耐心。当你在堆栈中看到

ValueName = "EditorTabWidth"的时候,小心,呵呵,我们到了藏有宝藏的秘密入口了。

----------------------------------------------------------------------------------------
00419654 |.>MOV WORD PTR DS:[EBX+10],4B8
0041965A |.>MOV EDX,unpacked.005DAA4C ; ASCII "EditorTabWidth"
0041965F |.>LEA EAX,DWORD PTR SS:[EBP-620]
00419665 |.>CALL unpacked.0058D308
0041966A |.>INC DWORD PTR DS:[EBX+1C]
0041966D |.>MOV EDX,DWORD PTR DS:[EAX]
0041966F |.>MOV EAX,ESI
00419671 |.>CALL unpacked.004E936C
00419676 |.>MOV ECX,DWORD PTR DS:[EDI]
00419678 |.>MOV EDX,2
0041967D |.>MOV DWORD PTR DS:[ECX+A0C],EAX
00419683 |.>LEA EAX,DWORD PTR SS:[EBP-620]
00419689 |.>DEC DWORD PTR DS:[EBX+1C]
0041968C |.>CALL unpacked.0058D520
00419691 |.>MOV ECX,DWORD PTR DS:[EDI]
00419693 |.>MOV BYTE PTR DS:[ECX+8F4],0
0041969A |.>MOV EAX,DWORD PTR DS:[EDI]
0041969C |.>INC DWORD PTR DS:[EAX+8F0]
004196A2 |.>CALL unpacked.00462F18 ; 取机器码送EAX
004196A7 |.>MOV DWORD PTR SS:[EBP-764],EAX
004196AD |.>MOV WORD PTR DS:[EBX+10],98
004196B3 |.>MOV EDX,DWORD PTR DS:[EDI]
004196B5 |.>MOV ECX,DWORD PTR DS:[EDX+8E4]
004196BB |.>CMP ECX,DWORD PTR SS:[EBP-764]
004196C1 |.>JNZ unpacked.00419772
004196C7 |.>LEA EAX,DWORD PTR SS:[EBP-884]
004196CD |.>PUSH EAX ; /Arg2
004196CE |.>MOV EDX,DWORD PTR SS:[EBP-764] ; |[EBP-764]==机器码
004196D4 |.>PUSH EDX ; |Arg1
004196D5 |.>CALL unpacked.00462F70 ; \关键CALL,跟进
004196DA |.>MOV WORD PTR DS:[EBX+10],4C4 ; 上面的这个CALL计算真码,存放在EAX中(哎!又是明文

)
004196E0 |.>ADD ESP,8
004196E3 |.>LEA EDX,DWORD PTR SS:[EBP-884] ; 真码地址送入EDX
004196E9 |.>LEA EAX,DWORD PTR SS:[EBP-624]
004196EF |.>CALL unpacked.0058D308
004196F4 |.>INC DWORD PTR DS:[EBX+1C]
004196F7 |.>MOV EDX,DWORD PTR DS:[EAX]
004196F9 |.>MOV EAX,DWORD PTR DS:[EDI]
004196FB |.>MOV EAX,DWORD PTR DS:[EAX+8E8] ; 假码送入EAX,呵呵,准备比较了哦
00419701 |.>CALL unpacked.004ECED4 ; 比较函数,嘿嘿。
00419706 |.>TEST EAX,EAX
00419708 |.>LEA EAX,DWORD PTR SS:[EBP-624]


----------------------------------------------------------------------------------------

我们要找算法的计算过程,所以004196D5 处跟进:

----------------------------------------------------------------------------------------
00462F70 /$>PUSH EBP
00462F71 |.>MOV EBP,ESP
00462F73 |.>ADD ESP,-0C
00462F76 |.>XOR EDX,EDX
00462F78 |.>PUSH EBX
00462F79 |.>PUSH ESI
00462F7A |.>PUSH EDI
00462F7B |.>MOV EBX,25 ; EBX=0x25
00462F80 |.>MOV ECX,DWORD PTR SS:[EBP+8] ; [EBP+8]==机器码
00462F83 |.>XOR ECX,90909090 ; 机器码异或90909090,ECX==35571EE8
00462F89 |.>MOV EAX,ECX
00462F8B |.>DIV EBX ; 上面异或的结果除以25
00462F8D |.>MOV EAX,EDX ; 余数送EAX
00462F8F |.>CMP EAX,11 ; 余数同0x11比较
00462F92 |.>JGE SHORT unpacked.00462F97 ; 大于等于就直接压栈准备函数调用
00462F94 |.>ADD EAX,11 ; 否则余数+0x11,然后再入栈
00462F97 |>>PUSH EAX ; /Arg3 余数入栈
00462F98 |.>LEA EDX,DWORD PTR SS:[EBP-C] ; |
00462F9B |.>PUSH EDX ; |Arg2
00462F9C |.>PUSH ECX ; |Arg1 上面异或结果入栈
00462F9D |.>CALL unpacked.005861F0 ; \跟进
00462FA2 |.>MOV ECX,DWORD PTR SS:[EBP+C]
00462FA5 |.>ADD ESP,0C
00462FA8 |.>MOV ESI,ECX
00462FAA |.>XOR EAX,EAX
00462FAC |.>LEA EDI,DWORD PTR SS:[EBP-C]


----------------------------------------------------------------------------------------

00462F9D 处继续跟进:

----------------------------------------------------------------------------------------
005861F0 /$>PUSH EBP
005861F1 |.>MOV EBP,ESP
005861F3 |.>MOV EAX,DWORD PTR SS:[EBP+10]
005861F6 |.>MOV EDX,DWORD PTR SS:[EBP+8]
005861F9 |.>CMP EAX,0A ; 余数同0A比较
005861FC |.>PUSH 61
005861FE |.>SETE CL ; 条件为假,所以CL清零
00586201 |.>AND ECX,1
00586204 |.>CMP EAX,0A ; 仍然同0A比较
00586207 |.>PUSH ECX
00586208 |.>PUSH EAX
00586209 |.>MOV ECX,DWORD PTR SS:[EBP+C]
0058620C |.>PUSH ECX
0058620D |.>JNZ SHORT unpacked.00586213
0058620F |.>MOV EAX,EDX
00586211 |.>JMP SHORT unpacked.00586215
00586213 |>>MOV EAX,EDX
00586215 |>>PUSH EAX ; |Arg1
00586216 |.>CALL unpacked.00586160 ; \跟进
0058621B |.>ADD ESP,14
0058621E |.>POP EBP
0058621F \.>RETN


----------------------------------------------------------------------------------------

没有结果,00586216处继续跟进:

----------------------------------------------------------------------------------------
00586160 /$>PUSH EBP
00586161 |.>MOV EBP,ESP
00586163 |.>ADD ESP,-24
00586166 |.>PUSH EBX
00586167 |.>PUSH ESI
00586168 |.>PUSH EDI
00586169 |.>MOV EDI,DWORD PTR SS:[EBP+10] ; [EBP+10]为前面压栈的余数
0058616C |.>MOV ESI,DWORD PTR SS:[EBP+8] ; [EBP+8]为机器码异或90909090的结果
0058616F |.>MOV EBX,DWORD PTR SS:[EBP+C]
00586172 |.>CMP EDI,2 ; 余数同0x2比较
00586175 |.>JL SHORT unpacked.005861C4 ; 小于跳
00586177 |.>CMP EDI,24 ; 同0x24比较
0058617A |.>JG SHORT unpacked.005861C4 ; 大于则跳
0058617C |.>TEST ESI,ESI
0058617E |.>JGE SHORT unpacked.0058618C
00586180 |.>CMP BYTE PTR SS:[EBP+14],0
00586184 |.>JE SHORT unpacked.0058618C
00586186 |.>MOV BYTE PTR DS:[EBX],2D
00586189 |.>INC EBX
0058618A |.>NEG ESI
0058618C |>>LEA ECX,DWORD PTR SS:[EBP-24] ; 下面为关键循环
0058618F |>>/MOV EAX,ESI ; ESI==机器码异或结果
00586191 |.>|XOR EDX,EDX ; EDX清零
00586193 |.>|DIV EDI ; 将上面异或结果除以压栈的余数
00586195 |.>|MOV BYTE PTR DS:[ECX],DL ; 上面计算的余数的一个字节写入内存
00586197 |.>|INC ECX
00586198 |.>|MOV EAX,ESI
0058619A |.>|XOR EDX,EDX
0058619C |.>|DIV EDI
0058619E |.>|MOV ESI,EAX ; 又做了一次相同的计算,商送入ESI
005861A0 |.>|TEST EAX,EAX ; 直到EAX==0为止
005861A2 |.>\JNZ SHORT unpacked.0058618F ; 不为0则继续循环
005861A4 |.>JMP SHORT unpacked.005861BD
005861A6 |>>/DEC ECX
005861A7 |.>|MOV AL,BYTE PTR DS:[ECX] ; 内存[ECX]的值送入AL
005861A9 |.>|CMP AL,0A ; 同0A比较
005861AB |.>|JGE SHORT unpacked.005861B5 ; 大于等于跳到下面进行另外的计算
005861AD |.>|ADD EAX,30 ; 该值加上0x30
005861B0 |.>|MOV BYTE PTR DS:[EBX],AL ; 这个值就是注册码的第i个值,写入内存保存起来
005861B2 |.>|INC EBX ; 继续下一步
005861B3 |.>|JMP SHORT unpacked.005861BD
005861B5 |>>|ADD AL,BYTE PTR SS:[EBP+18] ; 上面如果大于0A,则加上[EBP+18]==61,
005861B8 |.>|ADD AL,0F6 ; 再加上0F6
005861BA |.>|MOV BYTE PTR DS:[EBX],AL ; 作为注册码的第i个值写入内存
005861BC |.>|INC EBX
005861BD |>> LEA EDX,DWORD PTR SS:[EBP-24] ; 取地址[EBP-24]
005861C0 |.>|CMP ECX,EDX ; 比较是否结束循环
005861C2 |.>\JNZ SHORT unpacked.005861A6 ; 没有结束则继续
005861C4 |>>MOV BYTE PTR DS:[EBX],0
005861C7 |.>MOV EAX,DWORD PTR SS:[EBP+C]
005861CA |.>POP EDI
005861CB |.>POP ESI
005861CC |.>POP EBX
005861CD |.>MOV ESP,EBP
005861CF |.>POP EBP
005861D0 \.>RETN


----------------------------------------------------------------------------------------

呵呵,过程清晰明了吧?第一次循环:机器码异或0x90909090的结果除以前面求得的压栈的余数,然后这个过

程的余数写入内存保留,商作为下一次循环的变量继续循环。第二次循环:将第一次循环中写入内存的值逆序

读取出来,同0xA比较,小于就直接加上0x30,作为注册码的第i个字符写入内存;大于等于则加上61,再加

0xF6,取低字节作为注册码的第i个字符写入内存。用户名没有参与计算。也不知道我说明白了没有,还是看程

序来得直接,C源码的注册机:

-----------------------------------------------------------------------------------------

//#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"


int main(int argc, char* argv[])
{
char chKey[128] = {0};
unsigned int unXORCode, unRemainder, unQuotient, unTmp, unMachineCode;
printf("Please Key in the Machine Code:\n");
scanf("%d", &unMachineCode);

unXORCode = unMachineCode ^ 0x90909090;
unRemainder = unXORCode % 0x25;
unQuotient = unXORCode;
if (unRemainder < 0x11)
{
unRemainder += 0x11;
}

int i;
i = 0;
while (unQuotient != 0)
{
unTmp = unQuotient % unRemainder;
unQuotient /= unRemainder;
if (unTmp >= 0xa)
{
unTmp = unTmp + 0x61 + 0xf6;
unTmp &= 0x0ff;
chKey[i] = unTmp;
}
else
{
chKey[i] = unTmp + 0x30;
}
i++;
}
printf("Key is: \n");
while (i >= 0)
{
printf("%c", chKey[i]);
i--;
}
printf("\n");

return 0;
}


http://chatgpt.dhexx.cn/article/c6JwGsS5.shtml

相关文章

迅雷API:实现文件下载

今天到迅雷公司的SDK文档网站上逛了逛&#xff0c;竟然发现它们已经提供了完备的API接口&#xff0c;我心中不禁大喜&#xff0c;但是SDK资料中的原版开发文件已经很难找到了&#xff0c;幸运的是我在github上搜索到了所需的文件&#xff0c;在这里我已经打包完毕&#xff0c;点…

spring boot结合FastDFSClient做下载文件注意事项

spring boot结合FastDFSClient做下载文件注意事项 1.后台下载方法走完后&#xff0c;前端页面浏览器一直没出现下载框。 2.ie浏览器兼容问题。 下面的FastDFSClient类依赖fdfsclient-jar-with-dependencies.jar包 下面是后台代码。 // An highlighted block /*** 下载* retu…

导入.dmp文件的操作及一些简单错误解决

一、如何导入.dmp文件 打开cmd&#xff0c;输入命令&#xff1a;imp 用户名/密码实例名 filedmp文件路径 fully 二、出现报错 解决方法&#xff1a; 1、先查看dmp文件的版本号 2、查看当前Oracle的版本 在sqlplus中使用命令&#xff1a;select * from v$version; 效果&#…

VC++实现打开文件和打开所在文件夹的功能(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)

迅雷任务出错怎么办,如何解决迅雷任务出错

如果极速迅雷WIN10打不开或者闪退&#xff0c;到文件安装目录的program下&#xff0c;修改thunder.exe 为其他名字即可 例如 迅雷.exe 很多朋友在使用迅雷下载文件时提示“任务出错”这种情况。下面方法可能不适用于所有情况 我的是极速迅雷。 第一种方法 1.打开迅雷&#…

关闭迅雷更新到新版本的提示

每次打开迅雷都会自动检查是否是最新版本&#xff0c;如果不是最新版本&#xff0c;迅雷会一直重复弹窗弹出更新到新版本的提示&#xff1a; 解决方案 简介&#xff1a;迅雷提示升级是因为每次迅雷主程序启动时都会同时启动一个叫XLLiveUD.exe的程序&#xff0c;这个程序会检…

迅雷软件一直出现崩溃问题的常见解决方法

迅雷是很多人必备的下载软件&#xff0c;但是现在的迅雷功能越来越臃肿&#xff0c;所以经常出现崩溃的情况&#xff0c;那么如何解决迅雷崩溃的问题呢&#xff1f;本文将介绍常见的几种解决方法。 解决方法 方法一 利用360软件管家查看有什么问题&#xff0c;如果还是没有问题…

MATLAB2018a解压文件损坏,文件解压失败与压缩文件文件已经损坏的解决办法

压缩文件以减少文件大小和提高传送速度的特点而广受用户欢迎&#xff0c;压缩文件时一般需要电脑安装压缩软件。我们在解压的过程中电脑有的时候会提示&#xff1a;此解压失败或压缩文件文件已经损坏&#xff1f;下面小编就为大家整理了解压文件出错常见解决办法。 解决办法1&a…

java 内部错误2753_重新安装java出现错误的解决方法

之前手贱&#xff0c;没有从控制面板删除jre&#xff0c;而是把其目录下的文件永久删除。结果引起注册表出错&#xff0c;再重新安装的时候不停地提示错误&#xff0c;经历了三个错误。。折腾了挺久的。现在把它写下来给大家参考 1.第一次想重新安装却一直提示“已安装”&#…

LWIP的大文件下载数据错误

前段时间在做stm32 web下载文件的功能&#xff0c;遇到了一个问题。使用不同的浏览器下载得到的文件数据有所差异。通过具体分析发现使用谷歌和迅雷下载得到的文件是正确的&#xff0c;而使用360&#xff0c;搜狗之类的浏览器得到的文件数据会丢失一个包的数据&#xff0c;而丢…

用迅雷或者IDM下载下载百度网盘文件方法

百度网盘限速让大家在下载资料时很头疼&#xff0c;今天分享一个利用插件快速下载百度网盘里的资料。 连接网址&#xff1a; http://www.cnplugins.com/office/tampermonkey/download.html 参考网址&#xff1a; http://www.cnplugins.com/tool/baiduyun-tampermonkey.html…

Qt 之 模仿迅雷 根据Url获取文件信息——下

一、简述 在上篇 Qt 之 模仿迅雷 根据Url获取文件信息——上 文章中简单介绍了一下几个版本迅雷的界面变化,同时展示了这两天模仿迅雷新建任务窗口做的一个小例子。在这一篇中将讲解如何实现迅雷新建任务窗口。 首先简单看一下效果图。 二、代码之路 看代码之前需要看一下Q…

node 实现文件下载,web打开迅雷下载文件

node实现文件下载 方法一&#xff1a; const express require(express); const router express.Router(); const fs require(fs); const path require(path); const {errorMsg} require("../../util/apiUtils");router.get(/:fileName, async (req, res) >…

迅雷有linux版本吗,迅雷 - Linux Wiki

出自Linux Wiki 提示:此文已超过 7 年(2853 天)未更新,如发现内容过时或有误,欢迎改进:) 虽然迅雷至今仍未开发出Linux版本,不过借助 Wine 运行的迅雷已能实现其基本的功能。 迅雷离线 目前Linux下最佳使用迅雷方案就是迅雷离线配合Linux下的下载工具aria2 、wget,速度可达…

用迅雷打开php文件,迅雷下的php文件怎么打开啊?

simith666的回答&#xff1a; PHP文件是在服务器端执行的脚本文件&#xff0c;用不同文本编辑器打开即可。步骤如下&#xff1a; 1、首先找到php文件所在文件夹&#xff1a; 2、右键单击需要打开的php文件&#xff0c;弹出右键菜单中选择打开方式&#xff1a; 3、在打开的方式的…

核主成分分析方法(KPCA原理篇)

&#xff08;1&#xff09;方法的基本思想是&#xff1a;对样本进行非线性变换&#xff0c;在变换空间进行主成分分析来实现在原空间的非线性主成分分析&#xff1b; &#xff08;2&#xff09;算法步骤&#xff1a; ① 通过核函数计算矩阵&#xff0c;其元素为。其中和为原空…

主成分分析法PCA(一):算法原理

一&#xff1a;算法概述&#xff1a; 主成分分析法&#xff0c;principle component analysis&#xff0c;PCA。也称主分量分析&#xff0c;是一种大样本&#xff0c;多变量数据间内在关系的一种方法。这种方法利用降维的思想&#xff0c;通过向量变换的方法将众多线性相关指标…

主成分分析的基本原理

目录 什么是主成分分析&#xff1f; 主成分分析的步骤 根据什么选择主成分&#xff1f; 怎样解释主成分&#xff1f; 特征值、方差解释率及碎石图 载荷系数与共同度 什么是主成分分析&#xff1f; 主成分的概念由Karl Pearson在1901年提出的。他是考察多个 变量间相关性…

PCA主成分分析原理理解学习(源于b站某视频)

Principal Component Analysis 主成分分析 地址&#xff1a;https://www.bilibili.com/video/BV1E5411E71z?spm_id_from333.337.search-card.all.click 假设要保存二维的信息&#xff0c;由于降维考虑&#xff0c;期望只存储一个维度的信息&#xff08;为了减少存储的信息量&a…

主成分分析(PCA)原理及过程

首先&#xff0c;感谢一下这篇文章的作者&#xff1a;主成分分析原理及过程 PCA原理及过程 在机器学习中&#xff0c;对于数据维度过多问题&#xff0c;提出了一种降维算法叫做PCA算法。具体的降维&#xff1a;例如评估一个国家的GDP水平&#xff0c;需要考量到人口、收入、人…