软件介绍:C/C++程序设计学习与实验系统是根据【程序设计不是学会的,而是练会的】理念针对C语言初学者的特点开发的C语言学习系统,继承了原软件简单易用特点,支持32位与64位的操作系统WINDOWS 7/8/10/11,针对C语言初学者的特点设计了【编程入门训练-强化编程训练-综合编程训练】的强化编程训练流程,如下图所示,用简单的入门程序实例、错误代码及实例,C语言教程训练引导用户进入C语言,用120余道编程题供强化用户编程训练(编程思路、对照练习、程序自动评测、编程笔记),同时采用“自顶向下、逐步细化”的方法,设计两个由简到难(简单的计算器、通讯录管理系统)的综合程序训练用户的综合程序的设计能力。
软件介绍:Masm for windows 集成实验环境是根据【程序设计不是学会的,而是练会的】理念针对汇编语言初学者的特点开发的汇编语言学习与实验软件,继承了原软件简单易用特点,方便用户练习网络上、电脑上、书本上的汇编程序而全新设计开发。支持32位与64位的操作系统WINDOWS7/8/10,支持DOS的16/32位汇编程序和Windows下的32汇编程序(并提供调试通过的34个WINDOWS汇编程序实例源代码)、丰富的汇编资源。
软件官网: https://www.jiaminsoft.com/index.htm
MASM官方网盘下载:https://pan.baidu.com/s/1r7gjtZ4gwgcajPTUXci2_w?pwd=1234
C学习官方网盘下载:
https://pan.baidu.com/s/1s3T4WhcyOHCt-Mc4MvHhow?from=init&pwd=1234
请及时转存当前版本,以免官方修复后无法逆向验正
----------------------------------------------------------------------------------------------------------
逆向分析:C程序设计学习与实验系统2023/2025、Masm for Winodws 集成实验环境2023/2025:
使用工具:x64dbg、IDA
----------------------------------------------------------------------------------------------------------
核心加解密算法使用第三方库《共享软件加密算法库》进行对比并注册
核心注册过程使用RSA算法加解密,结合对主程序和Reg.dll等文件的效验实现。
逆序思路:重写原有Reg.dll的函数,看程序调用Reg.dll的函数情况,输入到日志并进一步分析得出,RSADecrypt、RSAEncrypt函数可以突破
机器码为组成:【32位编码】 + "J" + 【硬盘标识】 + "Y"(可无)
RSAEncrypt: 可以【32位编码】,
RSADecrypt:解密切入点,返回密码明文为 【32位编码 + fileKey】就注册成功
fileKey:注册后才能看的资料文件解密KEY,经分析为15位长度,在源码中已给出。
免费资料文件解密KEY固定为C学习系统【zsoc@19#MYT%】MASM学习系统【zsom@19#MYT%】
注:解密文件可以调用原来有Reg.dll进行解密。
----------------------------------------------------------------------------------------------------------
通过前面分析:可以实现变为注册版,但存在一个问题,不使用原版Reg.dll,解密配置文件config.ini及调试生成的字符串时,出现乱码
又分析到主程序通过 DecryptStringFun1解密字符串传入的解密KEY有问题,研究发现此Key的逆向解决方法
通过程序生成的日志分析(如何生成分析日志参见附带的源码)
正确的KEY:752713411380384 (X64DBG带壳调试,或CheatEngine分析获取)
KEY分为两段 第一段是一个校验,第二段是一个校验(MapFileAndCheckSum函数计算出)
第一段文件校验其中有多个校验值的和,只要算一下Reg.dll一个文件的校验就能推算出来正确的
第二段文件校验只有一个主程序文件的校验,基本是固定的
最后算出来的值在源码里直接做简单判断即可,本段只是分析一下大概的key计算,KEY已经在源码里给出
* ----------------------分析--------------------------
2025-05-23 20:17:48 DecryptStringFun1 [lpInBuffer]:D2A5786E0E8C78A8DEBBA193
2025-05-23 20:17:48 DecryptStringFun1 [lpKey]:758398011380384
2025-05-23 20:17:48 DecryptStringFun1 [lpOutBuffer in]:
2025-05-23 20:17:48 Modify [lpKey]:752713411380384
2025-05-23 20:17:48 DecryptStringFun1 [lpOutBuffer]:\\config.ini
(修改Reg.dll大小会变,下面分析为当时编译大小计算的结果,MapFileAndCheckSum来计算)
lpKey修改前 7583980/11380384
修改Reg.dll后 传入的KEY第一段是 7583980
原有Reg.dll 传入的KEY第一段是 7527134
计算差 7583980-7527134= 【56846】
比修改后的Reg.dll大了【56846】
【56846】的得来 MapFileAndCheckSum计算修改后的 Reg.dll = 0/200728
MapFileAndCheckSum计算原有的 Reg.dll = 168202/143882
200728 - 143882 = 【56846】
用此计算差可以推算出正确的第一段校验值:54846不是固定值,根据源码编译后的Reg.dll计算差值后得出
7583980 - 56846 = 7527134 获取正确第一段值
综上所述,得到正确的Key算法:以C2025为例,ASM2025一样
第一部分:
MapFileAndCheckSum 计算源码编译的Reg.dll值[A]
MapFileAndCheckSum 计算程序本身的Reg.dll值[B]
判断A比B校验值大还小
如果增大则 [lpKey] - (A-B) = 正确的lpKey的第一部分
如果减小则 [lpKey] + (B-A) = 正确的lpKey的第一部分
第二部分:
MapFileAndCheckSum 主程序的值【MainWinC.exe】 = 11380384、11380384
两部分组合得到正确的lpKey
----------------------------------------------------------------------------------------------------------
注:[A]随每次编译后的文件大小不同而不同,原有Reg.dll 【168202/143882】不变, 除非官方改变版本
另:第三方法库《共享软件加密算法库》软件使用的是注册版:顺便获取了注册码
注册码:zjm_soft-37DF3F31A7E8CFBE5107961760A09C79A540BBEF797261E0&2DE61E9E3C382E52E6FE7D6D17940668
调用程序自己带的Reg.dll时,调用函数前先SetValue(注册码),再执行加解密函数,就是正式版
除替换DLL方法外,也可以在两个关键函数HOOK:RSADecrypt、RSAEncrypt函数直接修改
----------------------------------------------------------------------------------------------------------
附逆向测试源码:环境 Visual Studio 2022 Preview
编译环境:vs2022 win11/win10
Windows SDK版本: 10.0
平台工具集: vs2022 (V143)
C++标准: C++14 标准
C语言标准: 旧MSVC
C/ASM学习系统为32位程序,所以注意编译时需要选择32位Release版本动态库
生成Reg.dll后替换安装目录原有同名文件即可测式逆向结果是否正确
★★★ 注意:请把安装目录原来有Reg.dll重命名为Reg_.dll 自行编译请使用Release版本编译★★★★
附件解压密码:52pojie
----------------------------------------------------------------------------------------------------------

D8E5E564-CF82-448c-92E3-31F211F2EF52.png (241.32 KB, 下载次数: 0)
下载附件
2025-5-27 09:06 上传

FDE9C479-F8A7-490f-BCC5-41991CA43695.png (196.09 KB, 下载次数: 0)
下载附件
2025-5-27 09:06 上传