使用 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>
弹出注册失败窗口
这个注册码好有规律.支持~ 头像无节操.... 学习了,感谢楼主哦,分析的很精彩 本帖最后由 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 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
楼主分析Makemkv是那个版本? 学习了,感谢楼主哦,分析的很精彩 还真是详细啊,想必费了很多精力 又一位算法帝。。唉,爆破万岁!简单粗暴。。 cdweng 发表于 2013-10-30 21:29 static/image/common/back.gif
楼主分析Makemkv是那个版本?
MakeMKV v1.8.5 win(x86-release) 可以搞个注册机玩玩 我是用户 发表于 2013-10-30 21:46 static/image/common/back.gif
可以搞个注册机玩玩
反正弄得了一个注册码,大功告成了!