小白第一次注册机编写,c/bat/易某言(不好意思说2333)

编程知识 更新时间:2023-04-17 10:58:53

小白第一次注册机编写,c/bat/易某言(不好意思说出口2333)

  • 零、视频教程
  • 一、免责声明
  • 二、软件相关信息
  • 三、查壳
  • 四、分析软件注册流程
  • 五、IDA载入
  • 六、OD载入
    • (一)、找关键跳转
      • 1、查看代码
      • 2、搜索字符串
        • (1)、误解
        • (2)、正解
    • (二)、尝试爆破
      • 1、分析、猜测
      • 2、验证猜想
    • (三)、尝试追码
      • 1、定位关键call
      • 2、去除花指令
      • 3、单步步过,猜测call的作用
      • 4、跟进关键call
      • 5、测试追出的真码
    • (四)、注册码算法分析
      • 1、取消已有的注册码授权
      • 2、跟进关键call
      • 3、跟进生成四位数的call
  • 七、注册机的实现
    • 易语言实现
    • C语言实现
      • C语言精简版
      • c语言 (相对)完整版
      • VC的QT界面版
    • bat(cmd|dos)版
  • 全文终

话说我觉得,这是目前我离【精华】最近的一次了
注:之前得到的那个精华不算完全原创。。。
更准确地说应该是学习的笔记,而不是纯自主的研究或是分析。。。
咳咳下面这个是原创的!!!!~~
第一次写注册机的教程,如有问题,还请大家斧正。

正文分界线:


零、视频教程

受吾爱破解评论指点,特此录制了视频版的教程。。。
顺便求个素质三连
分流链接!

【视频教程】music studio pc版 由爆破、追码、到注册机的编写
https://www.52pojie/thread-962376-1-1.html
(出处: 吾爱破解论坛)

B站直链:https://b23.tv/av53311014

一、免责声明

包含且不限于本文、截图、分析,版权均归本人所有,如需转载,请与本人联系(看雪|吾爱ID相同),软件版权归软件官方所有,如有侵权,请联系管理或本人删帖。
仅供学术交流研究使用,不得用于非法、商业用途!!
请支持正版,购买正版以获得新版更新及更好地服务。

二、软件相关信息

软件名:sofeh music studio 4551
软件官网:http://www.sofeh/engl/?page_id=15
软件类型:win
软件大小:74.7MB
下载地址:http://dl.sofeh/download/soft-musicstudio4551.7z
注册方式:请求码(机器码生成),本地注册
分析方式:动态
使用软件:吾爱专版 OD(Ollydbg)(下载见爱盘)
分析人员:涛之雨
分析环境:WinXp
鸣谢:感谢 @KaQqi大佬抽出宝贵时间进行指导。

安卓APP版本
请移步本人的另一篇文章
Google Play的一款专业电子琴。ORG 2020 汉化 && 破解版
https://www.52pojie/thread-947671-1-1.html
(出处:吾爱破解论坛)

三、查壳

额。。我先说一下吧。。有能力的朋友也可以试验一下脱壳。。。

KaQqi大佬说,这个软件是:

enigma的壳upx的升级版虚拟壳
加了三次壳两次enigma一次upx
越菜的人越喜欢加壳保护程序。。。
这个版本有点新,这个东西nop了crc就直接gg了
修复不了IAT”

咳咳。。其实我都不知道大佬说的是啥。。。直接复制过来了。。。。

查壳完毕,继续。

四、分析软件注册流程

不管破解什么,如何破解,都是至少要对软件注册的流程十分熟悉,
如果不了解流程就去尝试破解,有可能会误入歧途,然后最终导致放弃。
流程如图1所示:

Help-Activate the Professional freatures-输入注册码-判断是否成功-错误代码


(图1)

五、IDA载入

因为是加密压缩壳,所以没有分析出什么有效信息,故不附图了,该做的流程还是要有的,以防万一有什么发现。

六、OD载入

因为没有检测调试器,可以直接拖入OD调试,或是附加调试。

这里推荐附加的方法,因为是虚拟壳,直接载入有时有可能会出问题。这里我们附加到调试器。

如图2,图3所示:右上角文件-附加-选择【music studio】进程-确定


(图2)


(图3)

因为是附加调试会暂停在系统领空,先按图4所示:

运行程序F9)让程序跑起来,
E(快捷键:Alt+E【Modules】,)显示模块列表
双击Music Studio.exe软件主模块,


(图4)

(一)、找关键跳转

1、查看代码

进入软件,发现软件内机器码全部都是00(图5中所示)应该是虚拟化后释放了(通过旧版OD可以看到变化前后的内容,如动图1)


(图5)


(动图1)

2、搜索字符串

(1)、误解

直接如图6所示,进行右键-中文搜索引擎-智能搜索的操作。

结果如图7,在这里是搜不到任何字符串的,因为虚拟壳,会把代码(一般是入口)虚拟到内存的其他模块/进程申请的内存里,因此需要回到软件的领空,才能搜到软件内部的字符串。


(图6)


(图7)

(2)、正解

在说完误解就要想办法回到软件的内存里,如图8、图9所示:右键-转到-表达式(快捷键:Ctrl+G)【Goto】-输入00401000


(图8)


(图9)

(注:winxp软件的基址一般都是401000,如果是win7及以上版本的系统则不一定。需要自行点M(快捷键:Alt+M)[memory]查看内存,获取基址。详细教程可以看论坛的教程或是到搜索引擎进行搜索)

就可以转到软件的内存了。此处重复刚才错误的位置所做的操作,即:

如图6所示,进行右键-中文搜索引擎-智能搜索的操作。

搜索结果如图10。


(图10)

根据四、分析软件注册流程的结果,需要找到弹窗的call

由弹窗的信息,可以尝试搜索关键词Error, activation, code, wrong等以定位弹窗的call,从而向上查找关键跳转。

注:搜索关键词的时候可以稍微减少一点,类比网络搜索关键词,自然是:***越少搜索的范围越多,精度越差;关键词越多搜索的范围越小,精度越高。***可以尝试用稍微短一点的关键词以匹配更多的字符串,以防关键词被拆分。

如图11所示,本人搜索的就是activation,因为一般的英文软件里都会有errorsorry之类的词语,重复率会比较高。搜到了,且仅有一处。上下字符串的内容也是符合该处其他内容的,因此可以初步判断,该处即为弹窗的内容。


(图11)

(二)、尝试爆破

双击改行(或是选中该行后按Enter键),查看该处代码。

1、分析、猜测

如图12


(图12)

该段代码比较长,因此可以猜测此处上方有判断语句,

向下观察,发现有一处jmp指令,再次猜测上方有个跳转,可以实现跳过该段错误提示的弹窗。

向上观察,发现有一处jnz指令,鼠标点击改行指令,根据左侧的引导线箭头可知,恰好跳过了错误弹窗的一段内容。

因此,猜测该处为关键跳转。

2、验证猜想

经过分析,猜测如图12中005D81C2处为判断是否注册成功的关键跳转。

如图13所示:选中改行-右键-断点-切换(快捷键:F2)在该处下一个INT3断点(又称CC断点CC指令


(图13)

如图14所示,再次重复注册操作,可以看到再点击Activate后,软件立即(根据计算机执行能力,或等一会)断在了下断点改行,并且左上角显示暂停字样。


(图14)

断点行左侧引导线为灰色,证明跳转不成立,双击右侧寄存器窗口的控制符Z以使该跳转成立。

更改后,效果如图15,引导线变为红色,即跳转成立。点击如图15所示左上角运行按钮(快捷键:F9)。


(图15)

运行后发现成功!

结果如图16所示。


(图16)

再次运行该软件,发现存在如图17所示的问题:

软件依旧为试用版,未解锁专业版
软件注册按钮没有消失(官网说注册成功后Activate按钮会消失)


(图17)

因此破解到此尚未成功。

(三)、尝试追码

1、定位关键call

回到刚才下断点的地址,

注:如果没有找到可以

1:按上文【误解】的内容跳转到指定地址。)
2:点击菜单下侧B按钮(快捷键:Alt+B)【Break】

向上查看关键比较代码

如图18,关键跳转上方的三个call都很可疑,均需要分析。


(图18)

2、去除花指令

另外注意到图18最上方所示的代码有点奇怪,有一个跳转。

因好奇心趋势,前去查看。

详情如图19所示:从005D8155ret返回后到005D8187的紫红色选中区域到处都是00FF(如图19中蓝、黄颜色框选的内容)


(图19)

因此判断该处为花指令,如图20所示,选中该区域,右键-二进制-用00填充


(图20)

注:下一行的数据里存在有用的数据,不可填充。

效果图见图21。OD成功的把之前错误识别的push ebp翻译出来了,接着需要检验该处分析是否正确。


(图21)

在分析出的该行push ebpF2下一个INT3断点,再次重复注册操作。成功的断在改行,没有报错,说明分析正确无误。

3、单步步过,猜测call的作用

如图22,一路按F8单步步过(图22中右侧绿色箭头所示按钮;白色箭头所示为:单步步入),不跟入call内部,先猜测每个call的作用,然后重点分析怀疑对象,以提高效率和成功率。


(图22)

跟到如图23所示的地方,刚刚经过一个call,通过分析、查看下侧信息窗口、右侧寄存器窗口堆栈窗口返回的数值,可以猜测005D81A6call是得到假码的call,继续分析下面两个call可以猜测出下面第二个call 判断注册是否成功,而根据返回的al标志符的值,判断是否注册成功。


(图23)

4、跟进关键call

因此需要着重跟进该处call进行分析

如图24所示,在该处call下断点,重复注册操作,进程在该处断下,按F7单步跟入,追踪真码。


(图24)

如图25所示,发现在上下移动代码行后,EIP所在行出现了错误。看来又是花指令。如法炮制,去之。


(图25)

去完花,代码如图26所示,因为篇幅原因,下面的两个call已经分析过了,依然是单步步过下几行。


(图26)

分析如下图27。至此,真码已经出炉了。在寄存器的EAXEDX中,已经把真码告诉我们了。。。


(图27)

5、测试追出的真码

如图28所示,虽然已经确认了是真的注册码,但测试一下还是要令人愉悦的23333。
至此可以利用论坛的其他教程写出内存注册机了。(善用论坛搜索功能)


(图28)

(四)、注册码算法分析

1、取消已有的注册码授权

要分析算法,首先要取消刚刚注册码,方法如下,任选其一即可:

1) 再次打开注册窗口,改动注册码,按回车键;
2) 如图29所示,在软件根目录下,注册成功后会新生成一个Activation注册文件,以文本方式打开该文件,即可发现请求码和注册码。删掉该文件即可。

注:软件需要重新打开才会生效


(图29)

2、跟进关键call

之前追码追到的算法关键call地址,如图30所示,我的电脑是004DFE68,观察下面的代码,发现OD识别出了字符-,结合上面的je跳转判断,再联系到注册码的结构,应该是在此处进行连接的,但是前面没有4个call,因此只可能是循环了。


(图30)

依然是单步步过每一个call,分析、猜测每一个call可能的含义。如图31所示,第一此到达该je的时候为跳转状态(没有连接符-),注意到后面的jnz前的判断代码:

inc esi
cmp esi,0x4

即:如果esi不大于4则跳转到上面(循环)。


(图31)

单步步过下面四个call以猜测每个call的含义。

相关段代码如下,手机可能不方便查看代码,本段详细含义见图32。

004DFE68    55              push ebp
004DFE69    8BEC            mov ebp,esp
004DFE6B    83C4 F8         add esp,-0x8
004DFE6E    53              push ebx
004DFE6F    56              push esi
004DFE70    33C9            xor ecx,ecx
004DFE72    894D F8         mov dword ptr ss:[ebp-0x8],ecx
004DFE75    8BDA            mov ebx,edx
004DFE77    8945 FC         mov dword ptr ss:[ebp-0x4],eax
004DFE7A    8B45 FC         mov eax,dword ptr ss:[ebp-0x4]
004DFE7D    E8 0258F2FF     call MusicStu.00405684             ; 得到请求码
004DFE82    33C0            xor eax,eax
004DFE84    55              push ebp
004DFE85    68 E6FE4D00     push MusicStu.004DFEE6
004DFE8A    64:FF30         push dword ptr fs:[eax]
004DFE8D    64:8920         mov dword ptr fs:[eax],esp
004DFE90    8BC3            mov eax,ebx
004DFE92    E8 3D53F2FF     call MusicStu.004051D4             ; 对生成的注册码进行判断
004DFE97    33F6            xor esi,esi
004DFE99    833B 00         cmp dword ptr ds:[ebx],0x0         ; 是否为第2|3|4段注册码,
004DFE9C    74 0C           je short MusicStu.004DFEAA         ; 如果不是则跳转
004DFE9E    8BC3            mov eax,ebx
004DFEA0    BA FCFE4D00     mov edx,MusicStu.004DFEFC          ; 加上【-】连接符
004DFEA5    E8 F255F2FF     call MusicStu.0040549C             ; 连接字符
004DFEAA    55              push ebp
004DFEAB    8BC6            mov eax,esi
004DFEAD    E8 4EFFFFFF     call MusicStu.004DFE00             ; 关键算法-2,生成一组4位注册码
004DFEB2    59              pop ecx
004DFEB3    8D55 F8         lea edx,dword ptr ss:[ebp-0x8]
004DFEB6    E8 3DA5F2FF     call MusicStu.0040A3F8             ; 把刚刚新鲜生成的一组注册码转换为字符串
004DFEBB    8B55 F8         mov edx,dword ptr ss:[ebp-0x8]
004DFEBE    8BC3            mov eax,ebx
004DFEC0    E8 D755F2FF     call MusicStu.0040549C             ; 连接字符
004DFEC5    46              inc esi                            ; esi自减
004DFEC6    83FE 04         cmp esi,0x4                        ; 判断是否够4组
004DFEC9  ^ 75 CE           jnz short MusicStu.004DFE99        ; 如果不是则跳转
004DFECB    33C0            xor eax,eax
004DFECD    5A              pop edx
004DFECE    59              pop ecx
004DFECF    59              pop ecx
004DFED0    64:8910         mov dword ptr fs:[eax],edx
004DFED3    68 EDFE4D00     push MusicStu.004DFEED
004DFED8    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]
004DFEDB    BA 02000000     mov edx,0x2
004DFEE0    E8 1353F2FF     call MusicStu.004051F8
004DFEE5    C3              retn


(图32)

到此厘清了软件注册码生成结构和流程:

判断是否需要加上"-"
连接字符串
生成四位数(整数)
转换为字符串
如果不满四位,转到1
        生成了四段,则退出循环

接下来就是一个找到如图32中004DFEADcall对应的生成算法了。

3、跟进生成四位数的call

如图33所示,单步步入该函数,依旧是花指令,去之!去后效果如图34所示。


(图33)


(图34)

如图35,单步步过到第一个call处,寄存器eax出现请求码,应该是传入该call


(图35)

如图36,再次步过call下一行eax变为00000047(H),即71(D),联系传入的注册码,发现是注册码的位数(注:每台计算机的请求码位数不统一)。


(图36)

继续分析代码,代码如下。手机可以直接查看分析的截图,如图37、图38所示。

004DFE00    55              push ebp
004DFE01    8BEC            mov ebp,esp
004DFE03    53              push ebx
004DFE04    56              push esi
004DFE05    8BF0            mov esi,eax
004DFE07    33DB            xor ebx,ebx
004DFE09    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
004DFE0C    8B40 FC         mov eax,dword ptr ds:[eax-0x4]
004DFE0F    E8 8056F2FF     call MusicStu.00405494             ; 取请求码长度(71)
004DFE14    8BD0            mov edx,eax                        ; 存到edx中
004DFE16    85D2            test edx,edx
004DFE18    7E 22           jle short MusicStu.004DFE3C
004DFE1A    B8 01000000     mov eax,0x1                        ; eax赋值为1(第一位数)
004DFE1F    8B4D 08         mov ecx,dword ptr ss:[ebp+0x8]     ;     (类似于二级指针??)
004DFE22    8B49 FC         mov ecx,dword ptr ds:[ecx-0x4]     ; 得到请求码地址
004DFE25    0FB64C01 FF     movzx ecx,byte ptr ds:[ecx+eax-0x1]; 获取第x位
004DFE2A    0FAFC8          imul ecx,eax                       ; 第x位数*x
004DFE2D    03D9            add ebx,ecx                        ; 求和
004DFE2F    40              inc eax                            ; 下一位
004DFE30    4A              dec edx                            ; 判断是否结束
004DFE31  ^ 75 EC           jnz short MusicStu.004DFE1F        ; 循环
004DFE33    EB 07           jmp short MusicStu.004DFE3C        ; 跳出循环
004DFE35    D1FB             sar ebx,1                         ; ebx逻辑右移二进制的1位->(10->01)->十进制/2
004DFE37    79 03            jns short MusicStu.004DFE3C       ; ┌貌似没用到?还是为了软件的兼容性?
004DFE39    83D3 00          adc ebx,0x0                       ; └不知道。。。本人第一次跟算法。。没有经验
004DFE3C    8BC3             mov eax,ebx                       ; 保存ebx到eax(相当于临时变量)
004DFE3E    C1E0 04          shl eax,0x4
; eax逻辑左移二进制的4位->16进制的1位(0001->1000)->十进制*16
004DFE41    99               cdq
; 把eax扩展为64位,变为edx:eax,edx为eax的最高位,即符号位
; idiv有符号除法,除数是32位的,被除数要64位的,把edx扩展为符号位,
; 既不改变eax,又扩展为64位。【注】:本注解摘自 t/EKZPEfn
004DFE42    F73CB5 ACDF6000  idiv dword ptr ds:[esi*4+0x60DFAC]
; 除以获取计算参数(姑且这么称呼)四次取到的值分别为{27,16,47,34}
004DFE49    3D 0F270000      cmp eax,0x270F                    ; 和9999(D)进行比较(四位数)
004DFE4E  ^ 7F E5            jg short MusicStu.004DFE35        ; 大于则继续循环
004DFE50    8BC3             mov eax,ebx                       ; ┌此处重新生成刚才临时判断的值
004DFE52    C1E0 04          shl eax,0x4                       ; │感觉这里的算法有点烦啊
004DFE55    99               cdq                               ; │还是因为反汇编分析的原因?
004DFE56    F73CB5 ACDF6000  idiv dword ptr ds:[esi*4+0x60DFAC]; └回头我们拿其他语言实现一下算法
004DFE5D    8BD8             mov ebx,eax                       ; 另存得到的一组数据
004DFE5F    8BC3            mov eax,ebx
004DFE61    5E              pop esi
004DFE62    5B              pop ebx
004DFE63    5D              pop ebp
004DFE64    C3              retn


(图37)


(图38)

七、注册机的实现

易语言实现

咳咳大佬误笑。。

在吾爱发易语言会被笑话的 ————by某大佬(不打昵称了怕给您拉仇恨)

完整代码就不贴了,以防被大佬笑话。。。只上图吧。

全工程代码:见图39、图40。


(图39)


(图40)

实验结果:如图41所示,算法无误,成功!


(图41)

C语言实现

咳咳既然易语言会被嘲笑。。那我又不会界面咋办,qt,mfc都不懂。。。刚开始学习。。
那就用控制台打印一个界面吧。。

C语言精简版

这其实算是第一版的注册机。。。要手动输入或右键粘贴请求码,生成的注册码也不方便取出。

代码的截图及运行截图如图42、图43所示:


(图42)


(图43)

#include <stdio.h>
#include <windows.h>
#include <string.h>

int getSignCode ( long myCode )
{
    int mySignedCode[4]= {27,16,47,34},i=0,retSignCode[4];

    for ( ; i<4; i++ )
    {
        long a,b;
        a = myCode;

        while ( 1 )
        {
            b = a * 16 / mySignedCode[i];

            if ( b <= 9999 )
                break;
            a = a /2;
        }
        retSignCode[i]=b;
        printf ( "%ld",b);
        if(i!=3)    printf("-");
    }

    return *retSignCode;
}
int main()
{
    char code[90];
    long codeSum=0;
    int i;
    //printf ( "please enter your request code!\n" );
    //scanf ( "%s",code );
    strcpy ( code,"459111219222217181919201718181927282329343637-121525877-7161211-8126676" );//我的注册码
    printf ( "\n" );

    for ( i=0; i<strlen ( code )+1; i++ )
        codeSum+=code[i]* ( i+1 );

    printf ( "\n请求码算出的校验值为%ld\n\n",codeSum );
    getSignCode ( codeSum );
    return 0;
}

c语言 (相对)完整版

在上一段代码的基础上加上了读取剪贴板、写入剪贴板的功能,
添加上了吾爱的免责声明。
源代码附在下面,需要的可以自行修改、编译

注:自行脑补成CSDN吧23333

代码的截图及运行截图如图44、图45所示:


(图44)


(图45)

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include<ctype.h> //需要使用到判断字符的函数

void echo52PJ()
{
    printf ( "#########################################################\n" );
    printf ( "版权声明:不得用于非法及盈利用途\n" );
    printf ( "请支持正版!到官网购买正品以获取最新版和更好地服务\n" );
    printf ( "POWER BY 涛之雨\n" );
    printf ( "吾爱破解独发!\n" );
    printf ( "未经被人允许禁止转载!\n" );
    printf ( "#########################################################\n" );
    printf ( "\n\n" );
    printf ( "免责声明:\n" );
    printf ( "吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。\n\n\n" );
    return;
}
int * getSignCode ( long myCode )
{
    int mySignedCode[4]= {27,16,47,34},i=0;
    static int retSignCode[4];

    for ( ; i<4; i++ )
    {
        long a,b;
        a = myCode;

        while ( 1 )
        {
            b = a * 16 / mySignedCode[i];

            if ( b <= 9999 )
                break;

            a = a /2;
        }

        retSignCode[i]=b;
        //printf ( "%ld", b );
        //if(i!=3)    printf("-");
    }

    return retSignCode;
}

BOOL setClipCode ( char* setStr )
{
    HGLOBAL hclip;//剪切板句柄

    if ( OpenClipboard ( NULL ) ==0 )
    {
        printf ( "打开剪切板失败!\n" );
        return FALSE;
    }

    if ( !EmptyClipboard( ) )
    {
        printf ( "清空剪切板失败!\n" );
        CloseClipboard();
        return FALSE;
    }

    TCHAR *strToSet=setStr;
    hclip = GlobalAlloc ( GMEM_MOVEABLE, ( ( strlen ( strToSet )+1 ) *sizeof ( TCHAR ) ) );

    if ( !hclip )
    {
        printf ( "内存分配失败!\n" );
        CloseClipboard();
        return FALSE;
    }

    LPSTR lpstr= ( LPSTR ) GlobalLock ( hclip ); //加锁,返回一个VOID类型的指针
    memcpy ( lpstr,strToSet, ( ( strlen ( strToSet ) ) *sizeof ( TCHAR ) ) );
    //lpstr[strlen ( strToSet )]= ( TCHAR ) 0; //字符串结尾的'\0'
    GlobalUnlock ( hclip ); //解锁
    SetClipboardData ( CF_TEXT,lpstr );
    CloseClipboard();
    printf("注册码已成功复制到剪贴板");
    return TRUE;
}
char * getClipCode()
{
    //局部变量
    static char *pbuf=NULL;
    HANDLE hclip;//剪切板句柄

    //打开剪切板,获取里面的数据
    if ( OpenClipboard ( NULL ) ==0 )
    {
        printf ( "打开剪切板失败!\n" );
        return "ERR";
    }

    //剪切板当中的数据是不是文本类型的
    if ( !IsClipboardFormatAvailable ( CF_TEXT ) )
    {
        printf ( "剪切板当中的数据类型非文本!\n自动跳过。" );
        CloseClipboard();//关闭剪切板,不然其他程序无法正常0使用剪切板
        return "ERR";
    }

    //获取剪切板里面的数据
    hclip=GetClipboardData ( CF_TEXT );
    pbuf= ( char * ) GlobalLock ( hclip ); //加锁,返回一个VOID类型的指针
    GlobalUnlock ( hclip ); //解锁

    //清除前导的非字母和数字字符
    while ( *pbuf&&!isalnum ( *pbuf ) )
        ++pbuf;

    //测试剪切板是否能使用
    printf ( "   检测到剪贴板内的文本如下:\n   =======================================================================\n   %s\n   =======================================================================\n   是否使用该数据作为请求码?\n\nY/N\n",pbuf );
    CloseClipboard();//关闭剪切板,不然其他程序无法正常0使用剪切板
    Sleep(1000);
    char Kword=getchar();

    if ( Kword!='y'&&Kword !='Y' ) return "ERR";

    return pbuf;
}
int main ( void )
{
    system ( "color 1f" );
    system ( "mode con:cols=80 lines=20" );
    system ( "title 请支持正版!到官网购买正品以获取最新版和更好地服务  POWER BY 吾爱破解 涛之雨" );
    echo52PJ();
    printf ( "按下回车键开始,并且表示接受以上条款!!" );
    getchar();
    system ( "cls" );
    long codeSum=0;
    int i;
    char code[90];
    strcpy ( code,getClipCode() );

    if ( !strcmp ( code,"ERR" ) )
    {
        printf ( "   请手动输入请求码,形如\n   =======================================================================\n   459111219222217181919201718181927282329343637-121525877-7161211-8126676\n   =======================================================================\n   按回车继续\n" );
        scanf ( "%s",code );
    }

    system ( "cls" );

    printf ( "   获取到的请求码如下:\n   =======================================================================\n   %s\n   =======================================================================\n",code );
    //strcpy ( code,"459111219222217181919201718181927282329343637-121525877-7161211-8126676" );
    printf ( "\n" );

    for ( i=0; i<strlen ( code )+1; i++ )
    {
        codeSum+=code[i] * ( i+1 );
    }

    printf ( "\n请求码算出的校验值为%ld\n",codeSum );
    int *regCode=getSignCode ( codeSum );
    printf ( "\n\n计算出的注册码为:\n\n" );

    for ( i=0; i<4; i++ )
    {

        sprintf ( code+i*5,"%d", regCode[i] );

        if ( i!=3 ) strcat ( code-1,"-");
    }

    printf ( "%s", code );
    printf ( "是否将该注册码复制到剪贴板?\n\nY/N\n" );
    char Kwd;
    scanf("%c",&Kwd);
    Kwd=getchar();
    //scanf("%c",&Kword);
    if ( Kwd=='y'||Kwd=='Y' )
        {
            setClipCode ( code );
        }

    printf ( "\n\n任意键键退出\n\n                            POWER By 涛之雨" );
    system ( "pause>nul" );
    return 0;
}

VC的QT界面版

请移步KaQqi大佬的

【原创破解】music studio算法注册机
https://www.52pojie/thread-953570-1-1.html
(出处:吾爱破解论坛)

bat(cmd|dos)版

话说本来没有准备写这个的。。。
步过看起来,这个算法不是很复杂,于是顺手就写了一下。。。
bat没有获取ASCII的方法,所以很蛋疼的写了个call,不是很聪明的办法。
使用起来其实比上面两个都简单:
复制该段代码,新建一个文本,粘贴代码,保存,后缀改为.bat|.cmd双击即可使用。。。
界面就没做,懒得。。。

注:因为论坛的网页编码是UTF-8,因此直接复制到文本也是UTF-8的。
而bat文件需要ACSII格式,因此直接复制保存会乱码,如图46所示,
因此需要转码,最简单的办法就是如图47所示,另存为的时候选择全部文件-编码为ACSI-手动输入后缀".bat|.cmd"-确定


(图46)


(图47)

@echo off
setlocal enableextensions enabledelayedexpansion
title 请支持正版!到官网购买正品以获取最新版和更好地服务  POWER BY 吾爱破解 涛之雨
color 1f
mode con:cols=80 lines=20
cls
set z=0
set /p w=请输入请求码,以回车键结束:
echo 加载中。。。。
        set q=1
:nexti
        if not "%w%"=="" (
                set w_%q%=%w:~0,1%
                call :v !w_%q%!
                set x=!errorlevel!
                set "x=!x!*%q%"
                set /a "z=!x!+!z!"
                set "w=%w:~1%"
                set /a q+=1
        goto :nexti)
echo 请稍后。。
set str=-
for /l %%i in (1,1,4) do (
        call :s !z! %%i
        set x=!errorlevel!
        set m=!m!!x!
        if %%i neq 4   set m=!m!%str%)
echo 请求码算出的校验值为:!m!
ping 127.0.0.1 > nul
echo 任意键退出
pause>nul
exist
:v
        if %1==9 exit /b 57
        if %1==8 exit /b 56
        if %1==7 exit /b 55
        if %1==6 exit /b 54
        if %1==5 exit /b 53
        if %1==4 exit /b 52
        if %1==3 exit /b 51
        if %1==2 exit /b 50
        if %1==1 exit /b 49
        if %1==0 exit /b 48
        if %1==- exit /b 45
exit /b 0
:s
    if %2==1 set l= 27
    if %2==2 set l= 16
    if %2==3 set l= 47
    if %2==4 set l= 34
        set /a tempcode = %1
        set b = 0
        :whilestart
        set /a b = !tempcode!  * 16 / l
        if !b! leq 9999 exit /b !b!
        set /a tempcode = !tempcode! /2
        goto whilestart

效果图见图48。


(图48)

#结束语

小计:

本文较完整的记录了本人由爆破,到追码,再到编写注册机的全过程
全过程,是因为本文写的十分详细,就是为了想和那些想写注册机,又没有多少基础的小白们一起学习,共同进步,
较完整,是因为其实写出来的是想做为教程,而不是完整的再现我是如何一步步走错而又从头开始分析的,
我需要告诉大家的是正确的(或者是比较正确)过程,而不是和大家分享我是如何走错的,
这个软件我破解的时候大概用了三四种方法找到这个关键的call,
但是其他的或多或少都会有一些繁琐或是错误之处,最后,在写教程的时候,我才发现之前走错的路是多么奇葩,
经过这次教程,我本身也学到很多,为什么前面几大块没有什么内容,我依然要打出来?不是为了字数,而是思路。。。

之前破解的时候,因为搜索了过多的(还是打错了)关键词,没有搜索到关键的字符串,即-(一)-2的步骤,
所以我是通过了弹窗回溯的方法、还有按钮事件的方法

注:有兴趣的朋友也可以自己试验一下,就会发现这么走是多么的困难。
另外,本软件是MFC写的,但是貌似是把MFC内置了?
万能断点是能用的,不过要在程序领空才能找到,一开始走了很多的弯路,正文没有体现出来,就在最后稍微吐个槽吧23333~

最后,祝大家都能在吾爱破解学有所成,
伸手、模仿的进步是微弱甚至没有的,需要自行钻研,不会就去查资料。
有疑惑就去提问
(最后再次感谢KaQqi 大佬对本文的支持)

全文终

全文终!撒花~~~~

更多推荐

小白第一次注册机编写,c/bat/易某言(不好意思说2333)

本文发布于:2023-04-13 22:57:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/e89ccbf50845f98255f176219218e169.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:注册机   不好意思   易某言   bat

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 73893文章数
  • 14阅读数
  • 0评论数