涛之雨 发表于 2019-5-15 13:03

【教程】music studio pc版 由爆破、追码、到注册机的编写

本帖最后由 涛之雨 于 2019-5-23 12:37 编辑

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

视频比较好?那我就补一个吧。。。

------------------------------------------------------------------------感谢H大指出的问题,已改正,学习了。

删改了不少,如果有疑惑,可以看https://blog.csdn.net/weixin_44352049/article/details/90234223我的第一版教程。。
虽然前版比较臃肿,但是对于一些刚入门的朋友有些话有些图还是要得。。
第一次写注册机的教程,如有问题,还请大家斧正。

正文分界线:

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

# 一、免责声明

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

# 二、软件相关信息

> 软件名:sofeh music studio 4551
> 软件官网:http://www.sofeh.net/e/?page_id=15
>> 貌似。。被更新了网站地址?可能是访问量突然增加吧。大家尽量从官网的域名进。。。
>
> 软件类型:win
> 软件大小:74.7MB
> 下载地址:从官网进入(之前的链接失效了)但目前最新版算法没有变化。
>>
>> 本人分析时所用版本的原版软件(https://www.lanzouj.com/i49p1uj
密码:67bd)
>
> 注册方式:请求码(机器码生成),本地注册
> 分析方式:动态
> 使用软件:吾爱专版 OD(Ollydbg)(下载见爱盘)
> 分析人员:涛之雨
> 分析环境:WinXp
> 鸣谢:感谢 [@KaQqi](https://www.52pojie.cn/home.php?mod=space&uid=476529)大佬抽出宝贵时间进行指导。
>> 安卓APP版本
>> 请移步本人的另一篇文章
>> Google Play的一款专业电子琴。ORG 2020 汉化 && 破解版
>> https://www.52pojie.cn/thread-947671-1-1.html
>> (出处:吾爱破解论坛)

# 三、查壳

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

KaQqi大佬说,这个软件是:新版enigma的壳。。。我还搞不定。。

查壳完毕,继续。

# 四、分析软件注册流程

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

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

![图1](https://s2.ax1x.com/2019/05/15/ETF87n.png)
(图1)

# 五、I D A载入

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

# 六、OD载入

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

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

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


![图2](https://s2.ax1x.com/2019/05/15/ETFup8.png)
(图2)

因为是附加调试会暂停在系统领空,先按图4所示:
> 点`运行程序`(`F9`)让程序跑起来,
> 点`E`(快捷键:`Alt+E`【Modules】,)显示模块列表
> 双击`Music Studio.exe`软件主模块,

![图3](https://s2.ax1x.com/2019/05/15/ETFmff.png)
(图3)

## (一)、找关键跳转

### 1、查看代码

进入软件,发现软件内机器码全部都是`00`(图4中所示)应该是虚拟化后释放了

![图4](https://s2.ax1x.com/2019/05/15/ETFK1S.png)
(图4)

### 2、搜索字符串

回到软件的内存里,如图5所示:`右键`-`转到`-`表达式`(快捷键:`Ctrl+G`)【Goto】-`输入00401000`

![图5](https://s2.ax1x.com/2019/05/15/ETF1mj.png)
(图5)

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

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

![图6](https://s2.ax1x.com/2019/05/15/ETi0ot.png)
(图6)

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

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

注:搜索关键词的时候可以稍微减少一点,以防关键词被拆分。

如图7所示,本人搜索的就是`activation`,有且仅有一处。上下字符串的内容也是符合该处其他内容的,因此可以初步判断,该处即为弹窗的内容。

![图7](https://s2.ax1x.com/2019/05/15/ETi6SS.png)
(图7)

## (二)、尝试爆破

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

### 1、分析、猜测

如图8

![图8](https://s2.ax1x.com/2019/05/15/ETiDFP.png)
(图8)

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

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

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

**猜测**该处为关键跳转。

### 2、验证猜想

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

如图9所示:`选中改行`-`右键`-`断点`-`切换`(快捷键:`F2`)在该处下一个断点

![图9](https://s2.ax1x.com/2019/05/15/ETisW8.png)
(图9)

如图10所示,再次重复注册操作,可以看到再点击`Activate`后,软件断在了下断点改行,并且左上角显示`暂停`字样。

![图10](https://s2.ax1x.com/2019/05/15/ETicQg.png)
(图10)

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

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

![图11](https://s2.ax1x.com/2019/05/15/ETigyQ.png)
(图11)

运行后发现成功!

结果如图12所示。

![图12](https://s2.ax1x.com/2019/05/15/ETihoq.png)
(图12)

再次运行该软件,发现存在如图13所示的问题:
> 软件依旧为试用版,未解锁专业版
> 软件注册按钮没有消失(官网说注册成功后`Activate`按钮会消失)

![图13](https://s2.ax1x.com/2019/05/15/ETi5F0.png)
(图13)

因此破解到此尚未成功。

## (三)、尝试追码

### 1、定位关键call

回到刚才下断点的地址,

注:如果没有找到可以
> 1:按上文【误解】的内容跳转到指定地址。)
> 2:点击菜单下侧`B`按钮(快捷键:`Alt+B`)【Break】

向上查看关键**比较代码**

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

![图14](https://s2.ax1x.com/2019/05/15/ETi2Lj.png)
(图14)

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

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

![图15](https://s2.ax1x.com/2019/05/15/ETioWT.png)
(图15)

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

![图16](https://s2.ax1x.com/2019/05/15/ETiqOJ.png)
(图16)

### 4、跟进关键call

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

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

![图17](https://s2.ax1x.com/2019/05/15/ETi7SU.png)
(图17)

如图18所示,发现在上下移动代码行后,`EIP`所在行出现了错误。
此处因为本人理解出错,感谢H大纠正。
这是编译器编译出的数据,od可以按`ctrl+A`分析


(图18)

或是像本人一样手动改为00或90

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

![图19](https://s2.ax1x.com/2019/05/15/ETijT1.png)
(图19)

分析如下图20。至此,真码已经出炉了。在寄存器的`EAX`和`EDX`中,已经把真码告诉我们了。。。

![图20](https://s2.ax1x.com/2019/05/15/ETiby4.png)
(图20)

### 5、测试追出的真码

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

![图21](https://s2.ax1x.com/2019/05/15/ETiOm9.png)
(图21)

## (四)、注册码算法分析

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

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

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

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

![图22](https://s2.ax1x.com/2019/05/15/ETiXwR.png)
(图22)

### 2、跟进关键call

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

![图23](https://s2.ax1x.com/2019/05/15/ETixFx.png)
(图23)

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

```
inc esi
cmp esi,0x4
```

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

![图24](https://s2.ax1x.com/2019/05/15/ETFSfK.png)
(图24)

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

本段详细含义见图25。

![图25](https://s2.ax1x.com/2019/05/15/ETizY6.png)
(图25)

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

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

接下来就是一个找到如图25中`004DFEAD`的`call`对应的生成算法了。

### 3、跟进生成四位数的call

如图26所示,`单步步入`该函数,依旧是出现编译问题,`ctrl+A`分析之!去后效果如图27所示。

![图26](https://s2.ax1x.com/2019/05/15/ETF9SO.png)
(图26)

![图27](https://s2.ax1x.com/2019/05/15/ETFiOH.png)
(图27)

如图28,`单步步过`到第一个`call`处,寄存器`eax`出现请求码,是传入该`call`的参数。

![图28](https://s2.ax1x.com/2019/05/15/ETFP6e.png)
(图28)

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

![图29](https://s2.ax1x.com/2019/05/15/ETFClD.png)
(图29)

继续分析代码。分析的截图如图30、图31所示。点击可查看大图


![图30](https://s2.ax1x.com/2019/05/15/ETFZkt.png)
(图30)

![图31](https://s2.ax1x.com/2019/05/15/ETFETI.png)
(图31)

# 七、注册机的实现

## 易语言实现

咳咳大佬误笑。。

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

全工程代码:见图32、图33。

![图32](https://s2.ax1x.com/2019/05/15/ETFkmd.png)
(图32)

![图33](https://s2.ax1x.com/2019/05/15/ETFA0A.png)
(图33)

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

![图34](https://s2.ax1x.com/2019/05/15/ETiuL9.png)
(图34)

## C语言实现

咳咳qt,mfc都不懂。。。刚开始学习。。
那就用控制台打印一个界面吧。。

### C语言精简版

第一版注册机。。。要手动输入请求码,生成的注册码也不方便取出。

代码的截图及运行截图如图35、图36所示:

![图35](https://s2.ax1x.com/2019/05/15/ETiMZR.png)
(图35)

![图36](https://s2.ax1x.com/2019/05/15/ETi8JK.png)
(图36)

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

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

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

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

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

    return *retSignCode;
}
int main()
{
    char code;
    long codeSum=0;
    int i;
    printf ( "请输入您的请求码!\n" );
    scanf ( "%s",code );
    //strcpy ( code,"459111219222217181919201718181927282329343637-121525877-7161211-8126676" );//我的注册码
    printf ( "\n" );
    for ( i=0; i<strlen ( code )+1; i++ )
      codeSum+=code* ( i+1 );
    printf ( "\n请求码算出的校验值为%ld\n\n",codeSum );
    getSignCode ( codeSum );
    return 0;
}

```

### c语言 (相对)完整版

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

代码的截图及运行截图如图37、图38所示:

![图37](https://s2.ax1x.com/2019/05/15/ETilIx.png)
(图37)

![图38](https://s2.ax1x.com/2019/05/15/ETinsJ.png)
(图38)

```c
#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= {27,16,47,34},i=0;
    static int retSignCode;

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

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

            if ( b <= 9999 )
                break;

            a = a /2;
      }

      retSignCode=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= ( 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;
    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+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 );

      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.cn/thread-953570-1-1.html
> (出处:吾爱破解论坛)


## bat(cmd|dos)版

bat没有获取ASCII的方法,所以很蛋疼的写了个call,不是很聪明的办法。
使用起来其实比上面两个都简单:
复制该段代码,新建一个文本,粘贴代码,保存,后缀改为`.bat|.cmd`双击即可使用。。。
界面就没做,懒得。。。
> 注:因为论坛的网页编码是UTF-8,因此直接复制到文本也是UTF-8的。请注意转码。。

```batch
@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
```

效果图见图39。

![图39](https://s2.ax1x.com/2019/05/15/ETBivV.png)
(图39)

# 结束语

> 小计:

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

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

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

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

# 全文终
全文终!撒花~~~~

涛之雨 发表于 2019-10-30 22:33

mrsdz 发表于 2019-10-30 20:21
谢谢,超详细的教程贴,我看了好久。就是不太明白那一句:断点行左侧引导线为灰色,证明跳转不成立,双击右 ...

咳咳突然发现打错了,是“标志位”打成“控制位”了
其实就是一般来说Z代表的是0
CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。ZF(零标志位):若当前的运算结果为零,则ZF为1,否则为0。SF(符号标志位):该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。OF(溢出标志位):若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0。PF(奇偶标志):当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0。AF(辅助进位标志):一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0。参考自:https://blog.csdn.net/xiangshangbashaonian/article/details/80147632
更详细介绍点链接查看。
此时if-xxx(各类if)几乎都是判断是否为0的,所以就可以通过改变z的零标志位更改成立与否,达到跳转或不跳转的目的

KaQqi 发表于 2019-5-16 13:35

本帖最后由 KaQqi 于 2019-5-16 18:45 编辑

算法分析这类东西的教程还是视频清晰啊。。我这种菜鸟表示文章看着就烦

涛之雨 发表于 2019-5-15 13:04

自古楼主坐沙发~~~
累死宝宝了。。。

涛之雨 发表于 2019-5-15 13:12

@Hmily
为什么 “五、IDA载入”会有问题呢?
没写错吧。。。
麻烦H大帮我看看。。

caocao300 发表于 2019-5-15 13:51

能编曲是吧

做客人间 发表于 2019-5-15 13:51

大神呀
老司机,带带我

gxsky 发表于 2019-5-15 13:56

楼主码字辛苦了,好文,希望此文能获得【精华】,学习中

涛之雨 发表于 2019-5-15 13:59

caocao300 发表于 2019-5-15 13:51
能编曲是吧

emmmm要是编曲的话,还是fl好用一点。。
这个软件怎么说呢。
反正玩起来还是挺好玩的
但是因为纯英语的原因,所以对国人不是很友好。。
但是软件还是挺好的。

zj1977lsz 发表于 2019-5-15 14:02

楼主辛苦了,先马后看!

liareyou 发表于 2019-5-15 14:18

进来膜拜下,谢谢楼主分享

Hmily 发表于 2019-5-15 14:20

涛之雨 发表于 2019-5-15 13:12
@Hmily
为什么 “五、IDA载入”会有问题呢?
没写错吧。。。


没错,论坛的超级链接导致的,不用管,或者你把ida中间加个空格就行了。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【教程】music studio pc版 由爆破、追码、到注册机的编写