nnezyj 发表于 2013-10-30 19:42

使用 Ollydbg 获取 MakeMKV 注册码

本帖最后由 nnezyj 于 2013-10-30 21:34 编辑

目标软件:MakeMKV v1.8.5 win(x86-release)
这是一款提取影碟文件制作成mkv的软件,个人觉得还是不错的,就是只有30天试用期,在网上搜索没有找到注册机或者破解版,只好自己动手了!



本人新手,这算是第一次使用Ollydbg,在大致看了下网上的新手教程后,开始这一次行动

一、用Ollydbg加载了makemkv.exe   



二、在代码窗口右键 “查找”→“所有参考文本字串”
    试着查找有什么注册提示之类的参考文本,可惜的是没找着注册之类的提示,
    不过却找到了这些网址,想到一般网站的注册窗口里都会有购买之类的提示,这个会不会很靠近注册的地方呢
   
   软件帮助菜单里,可以看到“帮助”、“购买”,通过点击,看到打开的网址正是我们找到的网址
   

三、确定注册模块位置
通过由参考字串定位的几个模块添加断点,F9打开软件
通过点击 “帮助”、“ 购买”、“注册”,得到断点对应模块
=======================================================================
00404435┌$55                     push ebp                                             ;在线帮助(H)|窗体头部
......          |.   
00404443|.C745 FC 08304>mov ,makemkv.00413008             ;http://www.makemkv.com/onlinehelp/
......          |.
00404458└.C3                      retn                                                       ;在线帮助(H)|窗体头部
=======================================================================
00404459┌$55                      push ebp                                             ;购买(P)|窗体头部
......          |.
00404467|.C745 FC 2C304>   mov ,makemkv.0041302C            ;http://www.makemkv.com/buy/
......          |.
0040447C└.C3                      retn                                                       ;购买(P)|窗体尾部
=======================================================================
0040447D┌$55                     push ebp                                             ;注册(R)|窗体头部
.......          |.
00404689└.^ E9 4FFFFFFF       jmp makemkv.004045DD                        ;注册(R)|窗体尾部
=======================================================================

四、分析注册模块
进入注册模块,点F8一路运行下来,在
004044E3|.E8 36C70000      call <jmp.&libmqt.#230>
弹出了注册窗口

输入注册码,点击“OK”,然后一路F8下去看看运行路线
运行到
0040458E|.E8 BBC00000      call <jmp.&libmqt.#458>
可以看到寄存器窗口中出现我们的注册码了
EAX 0456B8BA UNICODE "1234567890"


继续F8单步运行,当运行到此处
004045C4|.E8 07B90000   call makemkv.0040FED0
可以看到寄存器窗口中出现
EAX 02C06BB8 UNICODE "MakeMKV BETA "

继续运行,当运行到此处
004045D8|.E8 2FC00000   call <jmp.&libmqt.#155>
弹出注册失败窗口


2314902431 发表于 2013-11-6 10:36

这个注册码好有规律.支持~

LoongKing 发表于 2013-10-30 21:55

头像无节操....

aaartyr 发表于 2013-11-7 08:36

学习了,感谢楼主哦,分析的很精彩

nnezyj 发表于 2013-10-30 19:43

本帖最后由 nnezyj 于 2013-10-30 20:54 编辑

五、找到注册码的关键位置
通过修改al的值
0040459A|.84C0                              test al,al
0040459C|.0F85 83000000   jnz makemkv.00404625                  

错误的注册码会返回al=00,修改为非0后,运行弹出成功注册窗口

可是重启后,弹出这个提示,看来不输入正确的注册码是不行的了

由此知道
00404595|.E8 19EDFFFF       call makemkv.004032B3                ;   关键点:“注册码比对”,F7单步步入

=============================================================================
0040447D┌$55                  push ebp                                     ;注册(R)|窗体头部
……
004044E3      E8 36C70000   call <jmp.&libmqt.#230>               ;弹出注册窗口
……
0040458E|.E8 BBC00000    call <jmp.&libmqt.#458>               ;将输入的注册码地址存入于EAX寄存器中(UNICODE)
00404593|.8BC8                mov ecx,eax                                 ;将输入注册码地址存入ECX寄存器
00404595|.E8 19EDFFFF   call makemkv.004032B3                ;关键点:“注册码比对”,F7单步步入
0040459A|.84C0                test al,al                                       ;由 makemkv.004032B3 返回的al值决定了注册成功与否
0040459C|.0F85 83000000 jnz makemkv.00404625                  ;al=0x1跳转al=0x0不跳转 | 跳转意味着注册码正确
……
004045D8|.E8 2FC00000    call <jmp.&libmqt.#155>                ;弹出注册错误窗口
……
00404625|>8D4D F8          lea ecx,
……
00404684|.E8 83C50000   call <jmp.&libmqt.#241>                ;弹出注册成功窗口
00404689└.^ E9 4FFFFFFF    jmp makemkv.004045DD               ;注册(R)|窗体尾部
=============================================================================

nnezyj 发表于 2013-10-30 20:56

本帖最后由 nnezyj 于 2013-10-30 22:56 编辑

六、分析makemkv.004032B3子程序
00404595|.E8 19EDFFFF   call makemkv.004032B3                  ;关键点:“注册码比对”,F7单步步入
剩下的就需要懂些汇编的基础知识了

========================================================================================
004032B3┌$33D2                  xor edx,edx                               ;清空EDX寄存器
004032B5|.8BC1                  mov eax,ecx                              ;将输入注册码地址存入EAX寄存器
004032B7|.66:3911                cmp word ptr ds:,dx            ;
004032BA|.74 07                   je Xmakemkv.004032C3            ;用于判断输入的注册码是否为空,为空跳转
004032BC|>40                     ┌inc eax                                     ; 004032BC→004032C1是一个循环,用来判定输入的注册码长度
004032BD|.40                     |inc eax                                     ;
004032BE|.66:3910               |cmp word ptr ds:,dx         ;
004032C1|.^ 75 F9               └jnz Xmakemkv.004032BC         ;
004032C3|>2BC1                  sub eax,ecx                              ;末字符地址减去首字符地址
004032C5|.83E0 FE               and eax,0xFFFFFFFE                  ;EAX内容与0xFFFFFFFE相与,使地址为偶数
004032C8|.3D 88000000      cmp eax,0x88                           ;一个字符两个字节,就是注册码长度为0x88除以2,注册码有68个字符
004032CD|.74 03                  je Xmakemkv.004032D2               ;判断注册码长度是否为68个字符,相等则跳转
004032CF|.32C0                  xor al,al                                    ;al=0x00
004032D1      C3                     retn                                          ;位数不够弹出
========================================================================================
通过分析这一段知道注册码有68个字符
继续往下看

==================================================================================================
004032D2|>56               push esi
004032D3|.33F6               xor esi,esi                                           ;清空ESI寄存器
004032D5|.57                  push edi
004032D6|>83FE 02         ┌cmp esi,0x2                                        ;ESI(0~0x43)对应字符编号
004032D9|.72 25            |jb Xmakemkv.00403300                     ;判断为小于结果跳转
004032DB|.0FB70471      |movzx eax,word ptr ds:       ;EAX=(ECX地址+2n) 对应地址内容
004032DF|.66:83F8 5F      |cmp ax,0x5F                                    ;0x5F( ASCII "_" )
004032E3|.74 1B               |je Xmakemkv.00403300                     ;ax=0x5F 跳转
004032E5|.8D78 D0          |lea edi,dword ptr ds:          ;EDI=ASCII码-0x30
004032E8|.66:83FF 09       |cmp di,0x9                                    ;0x30~0x39 ( ASCII "0~9" )
004032EC|.76 12               |jbe Xmakemkv.00403300                   ;di≤0x9 跳转
004032EE|.8D78 C0         |lea edi,dword ptr ds:         ;EDI=ASCII码-0x40
004032F1|.66:83FF 1A       |cmp di,0x1A                                     ;0x41~0x5A ( ASCII "A~Z" )
004032F5|.76 09               |jbe Xmakemkv.00403300                   ;di≤0x1A 跳转
004032F7|.83C0 9F         |add eax,-0x61                                  ;EAX=EAX(ASCII码)-0x61
004032FA|.66:83F8 19      |cmp ax,0x19                                     ;0x61~0x7A ( ASCII "a~z" )
004032FE|.77 3E            |ja Xmakemkv.0040333E                  ;ax>0x19 跳转
00403300|>8A0471          |mov al,byte ptr ds:          ;a(n)      | 将对应ESI编号的字符存入al,如al=0x31("1")
00403303|.24 7F               |and al,0x7F                                     ;a(n)      | al与01111111B相与
00403305|.66:0FB6C0       |movzx ax,al                                    ;a(n)      | 寄存器扩展 如ax=0x0031("1")
00403309|.66:03C2          |add ax,dx                                       ;a(n)+b(n) | ax+bx,初始EDX为0,dx=0x0000
0040330C|.0FB7C0         |movzx eax,ax                                     ;a(n)+b(n) | 寄存器扩展 如EAX=0x00000031("1")
0040330F|.8D56 0B         |lea edx,dword ptr ds:          ;n+0xB   | EDX=ESI+0xB
00403312|.0FAFC2            |imul eax,edx                                    ;*(n+0xB)
00403315|.33D2               |xor edx,edx                                    ;EDX=0 清空EDX寄存器
00403317|.BF FD0F0000   |mov edi,0xFFD                                  ;EDI=0xFFD
0040331C|.F7F7               |div edi                                             ;{*(n+0xB)}/0xFFD|EAX存商EDX存余数 串连成一个寄存器,最为被除数,EDI为除数
0040331E|.46               |inc esi                                             ;dl=b(n+1)={*(n+0xB)}%0xFFD | “%”求余运算符ESI加1
0040331F|.0FB7D2      |movzx edx,dx                                     ;由EDI=0xFFD知道余数不会大于0xFFD
00403322|.83FE 42       |cmp esi,0x42                                       ;总共进行0x42(66)次运算
00403325|.^ 72 AF         └jb Xmakemkv.004032D6
==================================================================================================
这段使用前66个字符运算来获取一个关键数,用来比对最后两个字符
==================================================================================================
00403327|.8AC2          mov al,dl                              ;al=dl前面66次运算所得b(42) 如dx=0x088C dl=0x8C
00403329|.24 3F         and al,0x3F                              ;al与00111111B相与 即al所存数不大于0x3F al≤0x3F
0040332B|.E8 62FFFFFF   call makemkv.00403292                  ;Key:“关键字符比对”,F7单步步入
00403330|.0FB7B1 840000>movzx esi,word ptr ds:         ;ESI=a(0x42) 输入注册码倒数第二个字符
00403337|.0FBEC0      movsx eax,al                           ;扩展寄存器
0040333A|.3BC6          cmp eax,esi                              ;计算所得a(0x42) 与 输入的a(0x42) 比对
0040333C|.74 04         je Xmakemkv.00403342                     ;相等跳转
0040333E|>32C0          xor al,al                              ;不相等则 al=0x00
00403340|.EB 1B         jmp Xmakemkv.0040335D
00403342|>8BC2          mov eax,edx                              ;EAX=b(0x42)前面66次运算所得b(0x42)
00403344|.C1E8 06       shr eax,0x6                              ;b(42)/(2^6) | EAX右移6位
00403347|.24 3F         and al,0x3F                              ;al与00111111B相与 即al所存数不大于0x3F al≤0x3F
00403349|.E8 44FFFFFF   call makemkv.00403292                  ;Key:“关键字符比对”,F7单步步入
0040334E|.0FB789 860000>movzx ecx,word ptr ds:         ;ECX=a(0x43) 输入注册码最后一个字符
00403355|.0FBEC0      movsx eax,al                           ;扩展寄存器
00403358|.3BC1          cmp eax,ecx                              ;计算所得a(0x43) 与 输入的a(0x43) 比对
0040335A|.0F94C0      sete al                                  ;ZF=1则al=0x01ZF=0则al=0x00| cmp结果相等则ZF=1,不相等则ZF=0
0040335D|>5F            pop edi
0040335E|.5E            pop esi
0040335F└.C3            retn
========================================================================================
========================================================================================
00403292┌$84C0          test al,al                               ;al与al相与,判断al是否为0
00403294|.75 03         jnz Xmakemkv.00403299                  ;al不为0则跳转
00403296|.04 5F         add al,0x5F                              ;al=0x5F( ASCII "_" )
00403298|.C3            retn                                     ;返回al值
00403299|>3C 0B         cmp al,0xB
0040329B|.73 07         jnb Xmakemkv.004032A4                  ;al≥0xB跳转
0040329D|.0FB6C0      movzx eax,al                           ;al(0x1~0xA)
004032A0|.83C0 2F       add eax,0x2F                           ;EAX=0x30~0x39 ( ASCII "0~9" )
004032A3|.C3            retn                                     ;返回al值
004032A4|>3C 26         cmp al,0x26
004032A6|.0FB6C0      movzx eax,al
004032A9|.73 04         jnb Xmakemkv.004032AF                  ;al≥0x26跳转
004032AB|.83C0 35       add eax,0x35                           ;al(0xB~0x25) EAX=0x40~0x5A ( ASCII "@,A~Z" )
004032AE|.C3            retn                                     ;返回al值
004032AF|>83C0 3B       add eax,0x3B                           ;al(0x26~0x3F) EAX=0x61~0x7A ( ASCII "a~z" )
004032B2└.C3            retn                                     ;返回al值
==================================================================================================

公式为:b(n+1)={*(n+0xB)}%0xFFD   
             n=0x0~0x41,b(0)=0,a(0)~a(65):注册码前66位   
             “%”求余运算符
a(66) : b'(1)=b(0x42)%0x3F
a(67) : b'(2)=%0x3F

    ┌0x5F      ;b'=0                                    ( ASCII "_" )
a=│b'+0x2F ;0x1≤b'≤0xA         0x30~0x39 ( ASCII "0~9" )
    │b'+0x35 ;0xB≤b'≤0x25)      0x40~0x5A ( ASCII "@,A~Z" )
    └b'+0x3B ;0x26≤b'≤0x3F)      0x61~0x7A ( ASCII "a~z" )
   
==================================================================================================
{:1_909:}
忙乎半天,发一个最后我算出来的CDKEY
123456789012345678901234567890123456789012345678901234567890123456AW

cdweng 发表于 2013-10-30 21:29

楼主分析Makemkv是那个版本?

熊熊 发表于 2013-10-30 21:36

学习了,感谢楼主哦,分析的很精彩

寒枫雨雪 发表于 2013-10-30 21:41

还真是详细啊,想必费了很多精力

吾爱扣扣 发表于 2013-10-30 21:44

又一位算法帝。。唉,爆破万岁!简单粗暴。。

nnezyj 发表于 2013-10-30 21:44

cdweng 发表于 2013-10-30 21:29 static/image/common/back.gif
楼主分析Makemkv是那个版本?

MakeMKV v1.8.5 win(x86-release)

我是用户 发表于 2013-10-30 21:46

可以搞个注册机玩玩

nnezyj 发表于 2013-10-30 21:50

我是用户 发表于 2013-10-30 21:46 static/image/common/back.gif
可以搞个注册机玩玩

反正弄得了一个注册码,大功告成了!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 使用 Ollydbg 获取 MakeMKV 注册码