-
-
[讨论]菜菜破解Aplus DVD to MP3 Ripper 3.1.3学习算法
-
发表于: 2006-6-26 23:14 5279
-
【破解软件】Aplus DVD to MP3 Ripper 3.1.3
【下载地址】http://www.onlinedown.net/soft/49463.htm
【软件类别】国外软件/共享版/MP3 制作
【运行环境】Win9x/Me/NT/2000/XP/2003
【保护方式】序列号
【调试工具】Winxp、OllyDBD、PEiD
【作者声明】初学Crack,只是感兴趣,消遣业余时间,错误之处敬请诸位前辈不吝赐教。
【软件信息】是一款易于使用的MP3转换软件。该软件可以绕过版权保护将DVD音乐转换成可播放的MP3格式文件
一、
PEiD检查 Microsoft Visual C++ 6.0 无壳正好给我这样的新手练习,:)
KANAL分析:CRC16,Miracl mirvar,Miracl powmod,倒还没正规的碰过这东西,看看先(
输入Serail:a1234567b1234567c1234567d1234567e1234567f1234567,单击“Register”提示“Serial number error!”
二、算法跟踪
OD 载入程序查找字串参考,来到下面:
00407104 /. 55 push ebp
00407105 |. 8BEC mov ebp, esp
00407107 |. 6A FF push -1
00407109 |. 68 60E84700 push 0047E860 ; SE 处理程序安装
0040710E |. 64:A1 0000000>mov eax, fs:[0]
00407114 |. 50 push eax
00407115 |. 64:8925 00000>mov fs:[0], esp
0040711C |. 81EC 9C000000 sub esp, 9C
00407122 |. 8965 F0 mov [local.4], esp
00407125 |. 897D E0 mov [local.8], edi
00407128 |. 8975 E4 mov [local.7], esi
0040712B |. 895D E8 mov [local.6], ebx
0040712E |. 894D EC mov [local.5], ecx
00407131 |. A1 80054900 mov eax, ds:[490580]
00407136 |. 8985 58FFFFFF mov [local.42], eax
0040713C |. C745 FC 00000>mov [local.1], 0
00407143 |. 8BC1 mov eax, ecx
00407145 |. 8D95 58FFFFFF lea edx, [local.42]
0040714B |. 52 push edx ; (initial cpu selection)
0040714C |. 8D88 5C040000 lea ecx, ds:[eax+45C]
00407152 |. E8 99B30600 call 004724F0 ;
00407157 |. 8D8D 58FFFFFF lea ecx, [local.42]
0040715D |. E8 BF870600 call 0046F921
00407162 |. 8D8D 58FFFFFF lea ecx, [local.42]
00407168 |. E8 68870600 call 0046F8D5
0040716D |. 8D85 5CFFFFFF lea eax, [local.41]
00407173 |. 50 push eax ; /pHandle
00407174 |. 68 9C887300 push 0073889C ; |software\aplus dvd to mp3 ripper
00407179 |. 68 01000080 push 80000001 ; |hKey = HKEY_CURRENT_USER
0040717E |. FF15 04004800 call near ds:[<&ADVAPI32.RegCreateKey>; \RegCreateKeyA
00407184 |. 85C0 test eax, eax
00407186 |. 75 51 jnz short 004071D9
00407188 |. FFB5 58FFFFFF push [local.42]
0040718E |. 68 90887300 push 00738890 ; %s
00407193 |. 8D85 60FFFFFF lea eax, [local.40]
00407199 |. 50 push eax
0040719A |. E8 69740500 call 0045E608
0040719F |. 83C4 0C add esp, 0C
004071A2 |. 8DBD 60FFFFFF lea edi, [local.40]
004071A8 |. 33C0 xor eax, eax
004071AA |. 8A37 mov dh, ds:[edi]
004071AC |. 8BCF mov ecx, edi
004071AE |. 84F6 test dh, dh
004071B0 |. 74 0C je short 004071BE
004071B2 |> 83C1 01 /add ecx, 1
004071B5 |. 83C0 01 |add eax, 1
004071B8 |. 8A11 |mov dl, ds:[ecx]
004071BA |. 84D2 |test dl, dl
004071BC |.^ 75 F4 \jnz short 004071B2
004071BE |> 8D95 60FFFFFF lea edx, [local.40]
004071C4 |. 50 push eax ; /Length
004071C5 |. 52 push edx ; |Value
004071C6 |. 6A 01 push 1 ; |ValueType = REG_SZ
004071C8 |. 68 E0957300 push 007395E0 ; |regcode
004071CD |. FFB5 5CFFFFFF push [local.41] ; |hKey
004071D3 |. FF15 20004800 call near ds:[<&ADVAPI32.RegSetValueA>; \RegSetValueA
004071D9 |> 8D8D 58FFFFFF lea ecx, [local.42] ;
把Serail写入注册表HKEY_CURRENT_USER\Software\Aplus DVD to MP3 Ripper\RegCode
(不判断直接写入,程序在启动的时候肯定还会再次判断)
004071DF |. 68 80000000 push 80
004071E4 |. E8 A8D50600 call 00474791
004071E9 |. 57 push edi
004071EA |. E8 A1000000 call 00407290 ; 关键call
004071EF |. 59 pop ecx
004071F0 |. 85C0 test eax, eax ;
004071F2 74 35 je short 00407229 ;跳了就over
004071F4 |. 8B0D 1C474900 mov ecx, ds:[49471C]
004071FA |. 33C0 xor eax, eax
004071FC |. 50 push eax
004071FD |. 50 push eax
004071FE |. 68 E8957300 push 007395E8 ; thank you for registering!
00407203 |. E8 F2BE0600 call 004730FA
00407208 |. 68 D08C7300 push 00738CD0 ; aplus dvd to mp3 ripper
0040720D |. A1 1C474900 mov eax, ds:[49471C]
00407212 |. 8B0D A8E56600 mov ecx, ds:[66E5A8]
00407218 |. C780 9C180000>mov dword ptr ds:[eax+189C], 1
00407222 |. E8 F7D70600 call 00474A1E
00407227 |. EB 36 jmp short 0040725F
00407229 |> 8B0D 1C474900 mov ecx, ds:[49471C]
0040722F |. 6A 10 push 10
00407231 |. 68 90767300 push 00737690 ; error
00407236 |. 68 04967300 push 00739604 ; serial number error!
0040723B |. E8 BABE0600 call 004730FA
00407240 |. 68 EC8C7300 push 00738CEC ; aplus dvd to mp3 ripper trial version
00407290 /$ 57 push edi
00407291 |. 56 push esi
00407292 |. 55 push ebp
00407293 |. 53 push ebx
00407294 |. 81EC 10060000 sub esp, 610
0040729A |. 8BD8 mov ebx, eax ;可以看到我们输入的伪码在eax中
0040729C |. 8BFB mov edi, ebx
0040729E |. 33C0 xor eax, eax
004072A0 |. 8A37 mov dh, ds:[edi] ;
004072A2 |. 8BCF mov ecx, edi
004072A4 |. 84F6 test dh, dh ;判断Serail是否为空
004072A6 |. 74 0C je short 004072B4
004072A8 |> 83C1 01 /add ecx, 1
004072AB |. 83C0 01 |add eax, 1
004072AE |. 8A11 |mov dl, ds:[ecx]
004072B0 |. 84D2 |test dl, dl
004072B2 |.^ 75 F4 \jnz short 004072A8
004072B4 |> 83F8 30 cmp eax, 30 ;
004072B7 |. 74 0D je short 004072C6 ;输入的Serail的长度不是0x30就over
004072B9 |> 33C0 xor eax, eax
004072BB |. 81C4 10060000 add esp, 610
004072C1 |. 5B pop ebx
004072C2 |. 5D pop ebp
004072C3 |. 5E pop esi
004072C4 |. 5F pop edi
004072C5 |. C3 retn
004072C6 |> 8D7C24 10 lea edi, ss:[esp+10] ;
004072CA |. BE 40937300 mov esi, 00739340
004072CF |. B9 40000000 mov ecx, 40
004072D4 |. F3:A5 rep movs dword ptr es:[edi], dword p>;
004072D6 |. 8DBC24 100100>lea edi, ss:[esp+110] ; 清0x40*4长度的内存
004072DD |. BE 40927300 mov esi, 00739240
004072E2 |. B9 40000000 mov ecx, 40
004072E7 |. F3:A5 rep movs dword ptr es:[edi], dword p>
004072E9 |. 8DBC24 100200>lea edi, ss:[esp+210] ; 清0x40*4长度的内存
004072F0 |. BE 40917300 mov esi, 00739140
004072F5 |. B9 40000000 mov ecx, 40
004072FA |. F3:A5 rep movs dword ptr es:[edi], dword p>
004072FC |. 8D5424 10 lea edx, ss:[esp+10] ; 清0x40*4长度的内存
00407300 |. 6A 10 push 10
00407302 |. 53 push ebx
00407303 |. 52 push edx
00407304 |. E8 E7770500 call 0045EAF0 ;取伪码头16位写入刚才清空的地方
00407309 |. 8D8C24 1C0100>lea ecx, ss:[esp+11C]
00407310 |. 6A 10 push 10
00407312 |. 8D53 10 lea edx, ds:[ebx+10]
00407315 |. 52 push edx
00407316 |. 51 push ecx
00407317 |. E8 D4770500 call 0045EAF0 ;取伪码中间16位写入刚才清空的地方
0040731C |. 8D9424 280200>lea edx, ss:[esp+228]
00407323 |. 6A 10 push 10
00407325 |. 83C3 20 add ebx, 20
00407328 |. 53 push ebx
00407329 |. 52 push edx
0040732A |. E8 C1770500 call 0045EAF0 ;取伪码尾部16位写入刚才清空的地方
0040732F |. 33C0 xor eax, eax ;
00407331 |. 884424 44 mov ss:[esp+44], al ;
00407335 |. 888424 440100>mov ss:[esp+144], al ; 在上面刚分的3段尾部各写入00结束标记
0040733C |. 888424 440200>mov ss:[esp+244], al
00407343 |. 50 push eax
00407344 |. 6A 64 push 64
00407346 |. E8 E5A50400 call 00451930 ; miracl *mip=mirsys(100,0)
0040734B |. C780 34020000>mov dword ptr ds:[eax+234], 10 ; mip->IOBASE=16
00407355 |. 6A 00 push 0
00407357 |. E8 04A40400 call 00451760 ; m/明文 big m=mirvar(0)
0040735C |. 8BE8 mov ebp, eax ;
0040735E |. 6A 00 push 0
00407360 |. E8 FBA30400 call 00451760 ; c/密文 big m=mirvar(0)
00407365 |. 894424 38 mov ss:[esp+38], eax ;
00407369 |. 6A 00 push 0
0040736B |. E8 F0A30400 call 00451760 ; n/模数 big m=mirvar(0)
00407370 |. 8BD8 mov ebx, eax ;
00407372 |. 6A 00 push 0
00407374 |. E8 E7A30400 call 00451760 ; e/公钥 big m=mirvar(0)
00407379 |. 894424 44 mov ss:[esp+44], eax ;
0040737D |. 83C4 3C add esp, 3C
00407380 |. 8DBC24 100300>lea edi, ss:[esp+310]
00407387 |. BE 40907300 mov esi, 00739040
0040738C |. B9 40000000 mov ecx, 40
00407391 |. F3:A5 rep movs dword ptr es:[edi], dword p>
00407393 |. 8D7C24 10 lea edi, ss:[esp+10]
00407397 |. 33C0 xor eax, eax
00407399 |. 8A37 mov dh, ds:[edi]
0040739B |. 8BCF mov ecx, edi
0040739D |. 84F6 test dh, dh
0040739F |. 74 0C je short 004073AD
004073A1 |> 83C1 01 /add ecx, 1
004073A4 |. 83C0 01 |add eax, 1
004073A7 |. 8A11 |mov dl, ds:[ecx] ;获取第一段的长度0x10
004073A9 |. 84D2 |test dl, dl
004073AB |.^ 75 F4 \jnz short 004073A1
004073AD |> 8BF8 mov edi, eax
004073AF |. 33F6 xor esi, esi
004073B1 |. 85FF test edi, edi
004073B3 |. 7E 17 jle short 004073CC
004073B5 |> 0FBE5434 10 /movsx edx, byte ptr ss:[esp+esi+10]
004073BA |. 52 |push edx
004073BB |. E8 2E780500 |call 0045EBEE
004073C0 |. 59 |pop ecx
004073C1 |. 85C0 |test eax, eax
004073C3 |. 74 43 |je short 00407408 ; 检查第一段的数据
004073C5 |. 83C6 01 |add esi, 1
004073C8 |. 3BF7 |cmp esi, edi
004073CA |.^ 7C E9 \jl short 004073B5
004073CC |> 85FF test edi, edi
004073CE |. 74 38 je short 00407408
004073D0 |. 8D5424 10 lea edx, ss:[esp+10]
004073D4 |. 52 push edx ; 伪码的第一段
004073D5 |. 55 push ebp ;
004073D6 |. E8 15B70400 call 00452AF0 ; 初始化明文,cinstr(m,serail1)
004073DB |. 68 F4857300 push 007385F4 ; a1c397b69b55b291
004073E0 |. 53 push ebx ; 模数在我这里是明文
004073E1 |. E8 0AB70400 call 00452AF0 ; 模数初始化,cinstr(n,a1c397b69b55b291)
004073E6 |. 68 EC857300 push 007385EC ; 10001
004073EB |. 8B5424 1C mov edx, ss:[esp+1C]
004073EF |. 52 push edx ;
004073F0 |. E8 FBB60400 call 00452AF0 ; 公钥初始化,cinstr(e,10001)
004073F5 |. 53 push ebx ;
004073F6 |. 55 push ebp ;
004073F7 |. E8 B4B10400 call 004525B0 ; 比较模数和明文 compare(m,n)
004073FC |. 83C4 20 add esp, 20 ;
004073FF |. 83F8 FF cmp eax, -1
00407402 0F84 D4020000 je 004076DC ; m<n跳走继续运算(这里如果不跳后面参与运算的值就根本没有)
00407408 |> 8D8424 100300>lea eax, ss:[esp+310] ;
0040740F |. 50 push eax ;
00407410 |. E8 D0720500 call 0045E6E5 ;
第一次参与的数据
//M(HEX)伪码的第一段
//N(HEX)a1c397b69b55b291
//D(HEX)3BD60FDDDF705D29
//E(HEX)10001
//Keysize(Bits)=64
后面是重复上面第一次的过程只是几个参数不一样所以略过
第二次
//M(HEX)伪码的第一段
//N(HEX)909ef746744d1931
//D(HEX)55F020BFB0DE4E81
//E(HEX)10001
//Keysize(Bits)=64
第三次
//M(HEX)伪码的第一段
//N(HEX)909ef746744d1931
//D(HEX)55F020BFB0DE4E81
//E(HEX)10001
//Keysize(Bits)=64
004075D1 |. E8 DAAF0400 call 004525B0 ;第3次的比较模数和明文 compare(m,n)
004075D6 |. 83C4 20 add esp, 20
004075D9 |. 83F8 FF cmp eax, -1
004075DC |. 74 40 je short 0040761E
004075DE |> 8D9424 100500>lea edx, ss:[esp+510] ;
004075E5 |. 52 push edx
004075E6 |. E8 FA700500 call 0045E6E5 ; 这个要进去看
004075EB |. 59 pop ecx
004075EC |. 85DB test ebx, ebx ; 第1次的结果为0就over
004075EE |.^ 0F8E C5FCFFFF jle 004072B9
004075F4 |. 85ED test ebp, ebp ; 第2次的结果为0就over
004075F6 |.^ 0F8E BDFCFFFF jle 004072B9
004075FC |. 85C0 test eax, eax ; 第3次的结果为0就over
004075FE |.^ 0F8E B5FCFFFF jle 004072B9
00407604 |. 03D8 add ebx, eax
00407606 |. 3BEB cmp ebp, ebx ; ebx+eax=ebp
00407608 |.^ 0F85 ABFCFFFF jnz 004072B9 ;要求第1次+第3次=第2次
0040760E |. B8 01000000 mov eax, 1
00407613 |. 81C4 10060000 add esp, 610
00407619 |. 5B pop ebx
0040761A |. 5D pop ebp
0040761B |. 5E pop esi
0040761C |. 5F pop edi
0040761D |. C3 retn
0040761E |> 8B1424 mov edx, ss:[esp] 前面比较m<n就是跳到这里了
00407621 |. 52 push edx
00407622 |. 8B4C24 10 mov ecx, ss:[esp+10]
00407626 |. 51 push ecx
00407627 |. 8B7424 0C mov esi, ss:[esp+C]
0040762B |. 56 push esi
0040762C |. 8B7C24 14 mov edi, ss:[esp+14]
00407630 |. 57 push edi
00407631 |. E8 8ABB0400 call 004531C0 ;powmod(m,e,n,c)//计算c=m^e mod n
00407636 |. 8D9424 200500>lea edx, ss:[esp+520]
0040763D |. 6A 00 push 0
0040763F |. 52 push edx
00407640 |. 8B4C24 18 mov ecx, ss:[esp+18]
00407644 |. 51 push ecx
00407645 |. 68 00010000 push 100
0040764A |. E8 A1C20400 call 004538F0 ;big_to_bytes(256,c,temp,FALSE);
0040764F |. 8BD7 mov edx, edi 这个temp的值就是后面运算需要的
00407651 |. 52 push edx
00407652 |. E8 B9A90400 call 00452010 ;mirkill(m);//释放内存
00407657 |. 8B5424 24 mov edx, ss:[esp+24]
0040765B |. 52 push edx
0040765C |. E8 AFA90400 call 00452010 ;mirkill(c);//释放内存
00407661 |. 8B5424 34 mov edx, ss:[esp+34]
00407665 |. 52 push edx
00407666 |. E8 A5A90400 call 00452010 ;mirkill(n);//释放内存
0040766B |. 8BD6 mov edx, esi
0040766D |. 52 push edx
0040766E |. E8 9DA90400 call 00452010 ;mirkill(e);//释放内存
00407673 |. 83C4 30 add esp, 30
00407676 |. E8 B5A90400 call 00452030 ;mirexit();//释放内存
0040767B |.^ E9 5EFFFFFF jmp 004075DE
00407680 |> .
.
.
0045E6E5 /$ FF7424 04 push dword ptr ss:[esp+4]
0045E6E9 |. E8 6CFFFFFF call 0045E65A
0045E6EE |. 59 pop ecx
0045E6EF \. C3 retn
0045E65A /$ 53 push ebx
0045E65B |. 55 push ebp
0045E65C |. 56 push esi
0045E65D |. 57 push edi
0045E65E |. 8B7C24 14 mov edi, ss:[esp+14]
0045E662 |> 833D B41B4900>/cmp dword ptr ds:[491BB4], 1 ; 00491bb4永远都是1
0045E669 |. 7E 0F |jle short 0045E67A
0045E66B |. 0FB607 |movzx eax, byte ptr ds:[edi]
0045E66E |. 6A 08 |push 8
0045E670 |. 50 |push eax
0045E671 |. E8 CC580000 |call 00463F42
0045E676 |. 59 |pop ecx
0045E677 |. 59 |pop ecx
0045E678 |. EB 0F |jmp short 0045E689
0045E67A |> 0FB607 |movzx eax, byte ptr ds:[edi] ;取出前面运算出的temp的值(rsa的值)
0045E67D |. 8B0D A8194900 |mov ecx, ds:[4919A8] ; dvdtomp3.004919B2
0045E683 |. 8A0441 |mov al, ds:[ecx+eax*2]
0045E686 |. 83E0 08 |and eax, 8 ;
0045E689 |> 85C0 |test eax, eax
0045E68B |. 74 03 |je short 0045E690
0045E68D |. 47 |inc edi
0045E68E |.^ EB D2 \jmp short 0045E662
[rsa[i]*2+4919B2]是*8之类的就取下一个,继续循环,否则就走
0045E690 |> 0FB637 movzx esi, byte ptr ds:[edi]
0045E693 |. 47 inc edi
0045E694 |. 83FE 2D cmp esi, 2D ; 是2D在返回前就会把结果neg eax
0045E697 |. 8BEE mov ebp, esi
0045E699 |. 74 05 je short 0045E6A0
0045E69B |. 83FE 2B cmp esi, 2B ; 如果是2D,2B就取下一位
0045E69E |. 75 04 jnz short 0045E6A4
0045E6A0 |> 0FB637 movzx esi, byte ptr ds:[edi]
0045E6A3 |. 47 inc edi
0045E6A4 |> 33DB xor ebx, ebx
0045E6A6 |> 833D B41B4900>/cmp dword ptr ds:[491BB4], 1
0045E6AD |. 7E 0C |jle short 0045E6BB
0045E6AF |. 6A 04 |push 4
0045E6B1 |. 56 |push esi
0045E6B2 |. E8 8B580000 |call 00463F42
0045E6B7 |. 59 |pop ecx
0045E6B8 |. 59 |pop ecx
0045E6B9 |. EB 0B |jmp short 0045E6C6
0045E6BB |> A1 A8194900 |mov eax, ds:[4919A8]
0045E6C0 |. 8A0470 |mov al, ds:[eax+esi*2] ; 4919A8+Rsa[i]*2
0045E6C3 |. 83E0 04 |and eax, 4 ; 35(5),23(3),ab(b)
0045E6C6 |> 85C0 |test eax, eax
0045E6C8 |. 74 0D |je short 0045E6D7
0045E6CA |. 8D049B |lea eax, ds:[ebx+ebx*4] ; eax=ebx*5,ebx初始为0
0045E6CD |. 8D5C46 D0 |lea ebx, ds:[esi+eax*2-30] ; ebx=ebx*5*2-30+RSA[i]
0045E6D1 |. 0FB637 |movzx esi, byte ptr ds:[edi]
0045E6D4 |. 47 |inc edi
0045E6D5 |.^ EB CF \jmp short 0045E6A6
0045E6D7 |> 83FD 2D cmp ebp, 2D
0045E6DA |. 8BC3 mov eax, ebx
0045E6DC |. 75 02 jnz short 0045E6E0
0045E6DE |. F7D8 neg eax
0045E6E0 |> 5F pop edi
0045E6E1 |. 5E pop esi
0045E6E2 |. 5D pop ebp
0045E6E3 |. 5B pop ebx
0045E6E4 \. C3 retn
[rsa[i]*2+4919B2]是*4之类的就运算, 取下一个继续循环,否则退出循环
我们假设rsa[i]=FF,4919B2<=[rsa的值*2+4919B2]<=491BB0,下面我们就去看看这块区域的值
rsa[i]={0x9,0xA,0xB,0xC,0xD,0x20} [rsa[i]*2+4919B2]的结果是*8
rsa[i]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}[rsa[i]*2+4919B2]的结果是*4
序列号三
我们利用她的流程来个最简单的:)
第一次=1, rsa[i]={0x31,0x3A) ,(1:) 185B973541F05CF1 3A随便选个,只要不上面的表就可以了
第二次=3, rsa[i]={0x33,0x3A) ,(3:) 1177CA7E07FB44E1
第三次=2, rsa[i]={0x32,0x3A) ;(2:)用rsa运算得出53945D865D558F7A
serail=185B973541F05CF11177CA7E07FB44E153945D865D558F7A
典型的利用Miracl大数运算库进行RSA算法的实例,那些函数看Miracl的参考
用Rsatools2工具输入模数n,得到下面的几组数据
//P(HEX)10138CEE3 94E13703
//Q(HEX)A0FEDEFB F8AD4EBB
//N(HEX)a1c397b69b55b291, 909ef746744d1931
//D(HEX)3BD60FDDDF705D29, 55F020BFB0DE4E81
//E(HEX)10001
//Keysize(Bits)=64
刚好弄完看世界杯
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)