| Extra Drive Pro算法分析历程 |
| 责任编辑:酷酷の鱼 更新日期:2008-1-2 |
|
|
|
总结一下关键CALL1: 初始值:edi=-1 EDX=注册码(i) xor edi and 0ff,然后查表,EDX=[edx*4+44FFC0]指向的内容 ECX=EDI shr 8 edi=edx xor ecx i指向下一位,循环。最终的值xor FFFFFFFF(-1)--->eax /////////////////////////////////////////////////////////////////////////////////////////////////////// 关键CALL2: 00423D68 /$Content$nbsp; 55 push ebp 00423D69 |. 89E5 mov ebp, esp 00423D6B |. 83EC 10 sub esp, 10 00423D6E |. 8365 FC 00 and dword ptr [ebp-4], 0 00423D72 |. 8365 F8 00 and dword ptr [ebp-8], 0 00423D76 |. 8365 F0 00 and dword ptr [ebp-10], 0 00423D7A |. EB 03 jmp short 00423D7F 00423D7C |> FF45 08 /inc dword ptr [ebp+8] 00423D7F |> 8B45 08 mov eax, dword ptr [ebp+8] 00423D82 |. 8A08 |mov cl, byte ptr [eax] 00423D84 |. 80F9 20 |cmp cl, 20 00423D87 |.^ 74 F3 |je short 00423D7C 00423D89 |. 80F9 09 |cmp cl, 9 00423D8C |.^ 74 EE \je short 00423D7C 00423D8E |. 8038 2B cmp byte ptr [eax], 2B 00423D91 |. 75 05 jnz short 00423D98 00423D93 |. FF45 08 inc dword ptr [ebp+8] 00423D96 |. EB 50 jmp short 00423DE8 00423D98 |> 8B45 08 mov eax, dword ptr [ebp+8] 00423D9B |. 8038 2D cmp byte ptr [eax], 2D 00423D9E |. 75 48 jnz short 00423DE8 00423DA0 |. C745 F0 01000>mov dword ptr [ebp-10], 1 ;[ebp-10]=1 00423DA7 |. FF45 08 inc dword ptr [ebp+8] 00423DAA |. EB 3C jmp short 00423DE8 ;跳 00423DAC |> 8B45 08 /mov eax, dword ptr [ebp+8] ; 注册码到EAX 00423DAF |. FF45 08 |inc dword ptr [ebp+8] 00423DB2 |. 0FBE00 |movsx eax, byte ptr [eax] ; 注册码依次到EAX 00423DB5 |. 83E8 30 |sub eax, 30 ; -0 00423DB8 |. 8945 F4 |mov dword ptr [ebp-C], eax ; 结果保存到[EBP-C] 00423DBB |. BA 00000000 |mov edx, 0 ;edx=0 00423DC0 |. B8 0A000000 |mov eax, 0A ;eax=0a 00423DC5 |. 83EC 08 |sub esp, 8 00423DC8 |. DF6D F8 |fild qword ptr [ebp-8] ; [EBP-8]-->ST(0) 00423DCB |. DF3C24 |fistp qword ptr [esp] ; ST(0)-->[ESP] 00423DCE |. 52 |push edx ;作用应该是[EBP-8] <==>[esp] 00423DCF |. 50 |push eax 00423DD0 |. E8 5BF8FFFF |call 00423630 { 00423630 /$Content$nbsp; 8B4424 08 mov eax, dword ptr [esp+8] ;不知道程序在什么地方对[ESP+8]赋值,我这里总是0 00423634 |. 8B4C24 10 mov ecx, dword ptr [esp+10] ;不知道程序在什么地方对[ESP+10]赋值,我这里总是0 00423638 |. 09C1 or ecx, eax 0042363A |. 8B4C24 0C mov ecx, dword ptr [esp+C] ;观察发现[esp+c]=[esp] 0042363E |. 75 09 jnz short 00423649 00423640 |. 8B4424 04 mov eax, dword ptr [esp+4] ;观察发现[ESP+4]总是等于0A 00423644 |. F7E1 mul ecx ;[esp+c]*0A 00423646 |. C2 1000 retn 10 ;所以每次到这里就返回了 00423649 |> 53 push ebx 0042364A |. F7E1 mul ecx 0042364C |. 89C3 mov ebx, eax 0042364E |. 8B4424 08 mov eax, dword ptr [esp+8] 00423652 |. F76424 14 mul dword ptr [esp+14] 00423656 |. 01C3 add ebx, eax 00423658 |. 8B4424 08 mov eax, dword ptr [esp+8] 0042365C |. F7E1 mul ecx 0042365E |. 01DA add edx, ebx 00423660 |. 5B pop ebx 00423661 \. C2 1000 retn 10 }
00423DD5 |. 52 |push edx 00423DD6 |. 50 |push eax 00423DD7 |. 8B45 F4 |mov eax, dword ptr [ebp-C] ;EAX<--[EBP-C] 00423DDA |. 99 |cdq 00423DDB |. 010424 |add dword ptr [esp], eax ;[ESP]=[ESP]+EAX 00423DDE |. 115424 04 |adc dword ptr [esp+4], edx 00423DE2 |. 8F45 F8 |pop dword ptr [ebp-8] ;[EBP-8]出栈 00423DE5 |. 8F45 FC |pop dword ptr [ebp-4] 00423DE8 |> 8B45 08 mov eax, dword ptr [ebp+8] ; 注册码到eax 00423DEB |. 8A00 |mov al, byte ptr [eax] ; 注册码依次到al 00423DED |. 3C 30 |cmp al, 30 ; 和数字0比较 00423DEF |. 7C 04 |jl short 00423DF5 00423DF1 |. 3C 39 |cmp al, 39 ; 和数字9比较 00423DF3 |.^ 7E B7 \jle short 00423DAC 00423DF5 |> 837D F0 00 cmp dword ptr [ebp-10], 0 00423DF9 74 13 je short 00423E0E 00423DFB |. 8B55 FC mov edx, dword ptr [ebp-4] 00423DFE |. 8B45 F8 mov eax, dword ptr [ebp-8] 00423E01 |. F7D8 neg eax 00423E03 |. 83D2 00 adc edx, 0 00423E06 |. F7DA neg edx 00423E08 |. 8955 FC mov dword ptr [ebp-4], edx 00423E0B |. 8945 F8 mov dword ptr [ebp-8], eax 00423E0E |> 8B55 FC mov edx, dword ptr [ebp-4] 00423E11 |. 8B45 F8 mov eax, dword ptr [ebp-8] ;EAX的返回值在这里了 00423E14 |. C9 leave 00423E15 \. C3 retn 总结一下关键CALL2: 第一次:[ESP+C]=[ESP]=0 *0A=0+1=1 第二次:[esp+c]=[esp]=1 *0a=0A+1=0B 第三次: [esp+c]=[esp]=b*0a=6E+2=70 类似于: sum=0 sum=sum*0A+注册码(i)数值本身 i++ 描述的不是很好,但是你自己跟一遍就有感觉了。。 -------------------------------------------------------------------------------- 算法就看那两个关键CALL拉,如果你看不懂尽管拿砖头砸我好了 类似这样的算法以我目前的能力是没办法还原的..呵呵
/////////////////////////////////////////////////////////////////////////////////////////////////////////// 后记:两位大虾都说是CRC,于是我这几天特意浏览了看雪上关于CRC的帖子,看到穷举一词,突然有一到灵光打到了我的天, 灵盖上,于是我也
决定对这个软件穷举一下试试. 思路如下: for n=0 to 99999...9(15个) ;n我用来表示注册码后15位 SN1=CALL1(n) ;关键CALL1的算法我们是可以求出来的 do { sn1=call2(i) ;i表示被截取掉的 i++ }while(sn2=sn1 or i>99999999) sn=’n’+’i’ ;SN表示注册码 next n 我想上面那些循环应该可以穷举出一个注册码吧~! 关键算法分析清楚了的,思路也有了,就开始写代码实践下: 先写关键CALL1的: Dim sn2 As Long Dim i As Integer Dim n As Integer Dim s As String Dim l As Integer Private Function call2(n As Integer) sn2 = 0 s = Str(n) l = Len(s) For i = 1 To l sn2 = sn2 * &HA + Val(Mid(s, i, 1)) Next i
call2 = sn2 End Function 到这里我调试了一下,比如我输入1122,返回的是1122,输入多少返回多少~!看到这个结果我哭了。。。。。还穷举个屁。 那不就是说注册机可以这样写了: sn1=call1(n) regcode=’sn1’+’n’ 比如sn1=call1(123456789012345)=1364569986 那么你的注册码就是1364569986123456789012345,删掉程序目录下的extradrivepro.ini文件中的temp节,那么你还可以再玩一次 上一页 [1] [2] |
|
| 上一篇文章: IE收藏夹管理小精灵算法分析 |
| 下一篇文章: 雨过天晴自我注册 |
|
|
|
|