EEV_Pro6.59简单算法分析-菜鸟篇

【文章作者】: tzl 
【作者邮箱】: 无
【软件名称】: EEV_Pro6.59T
【软件大小】: 9.07 MB 
【下载地址】: http://www.adonsoft.com/Download/EEV_Pro6.59T_Sky.zip
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD PEID
【操作平台】: XP SP2
【软件介绍】: 房地产开发项目经济评价可行性研究及概预决算管理系统

今天空闲下来了,找了几个软柿子尝尝,是个适合菜鸟学习的好软件,这里与大家分享,菜鸟共同进步。  

一、查壳无

二、根据字符串相关信息,我们可以在这里下断开始分析,试练码:123456789

0068FB96    55         push ebp
0068FB97    68 1CFD680>push EEV.0068FD1C
0068FB9C    64:FF30    push dword ptr fs:[eax]
0068FB9F    64:8920    mov dword ptr fs:[eax],esp
0068FBA2    A1 5C86710>mov eax,dword ptr ds:[71865C]
0068FBA7    8B15 9C8F7>mov edx,dword ptr ds:[718F9C]        ; EEV.0071B43C
0068FBAD    8B12       mov edx,dword ptr ds:[edx]
0068FBAF    E8 604DD7F>call EEV.00404914
0068FBB4    A1 5C86710>mov eax,dword ptr ds:[71865C]
0068FBB9    8B00       mov eax,dword ptr ds:[eax]
0068FBBB    50         push eax
0068FBBC    B9 8CFD680>mov ecx,EEV.0068FD8C                 ; ASCII "PrgDir"
0068FBC1    BA 9CFD680>mov edx,EEV.0068FD9C                 ; ASCII "EstaExplValue 6.0\"
0068FBC6    8B45 F8    mov eax,dword ptr ss:[ebp-8]
0068FBC9    E8 12ABDBF>call EEV.0044A6E0
0068FBCE    8D55 F4    lea edx,dword ptr ss:[ebp-C]
0068FBD1    8B45 FC    mov eax,dword ptr ss:[ebp-4]
0068FBD4    8B80 00030>mov eax,dword ptr ds:[eax+300]
0068FBDA    E8 1D31DFF>call EEV.00482CFC
0068FBDF    8B55 F4    mov edx,dword ptr ss:[ebp-C]         ; 机器码送edx,"886EA-AEF73-EB5BB-904FD"
0068FBE2    A1 3C8C710>mov eax,dword ptr ds:[718C3C]        ; eax=17(十进制为23),
0068FBE7    E8 284DD7F>call EEV.00404914
0068FBEC    A1 3C8C710>mov eax,dword ptr ds:[718C3C]
0068FBF1    8B00       mov eax,dword ptr ds:[eax]
0068FBF3    50         push eax                             ; eax="886EA-AEF73-EB5BB-904FD"
0068FBF4    BA 9CFD680>mov edx,EEV.0068FD9C                 ; ASCII "EstaExplValue 6.0\"
0068FBF9    B9 B8FD680>mov ecx,EEV.0068FDB8                 ; ASCII "User"
0068FBFE    8B45 F8    mov eax,dword ptr ss:[ebp-8]
0068FC01    E8 DAAADBF>call EEV.0044A6E0
0068FC06    A1 3C8C710>mov eax,dword ptr ds:[718C3C]
0068FC0B    8B00       mov eax,dword ptr ds:[eax]
0068FC0D    50         push eax
0068FC0E    BA 9CFD680>mov edx,EEV.0068FD9C                 ; ASCII "EstaExplValue 6.0\"
0068FC13    B9 C8FD680>mov ecx,EEV.0068FDC8                 ; ASCII "Organization"
0068FC18    8B45 F8    mov eax,dword ptr ss:[ebp-8]
0068FC1B    E8 C0AADBF>call EEV.0044A6E0
0068FC20    8D55 F0    lea edx,dword ptr ss:[ebp-10]
0068FC23    8B45 FC    mov eax,dword ptr ss:[ebp-4]
0068FC26    8B80 0C030>mov eax,dword ptr ds:[eax+30C]
0068FC2C    E8 CB30DFF>call EEV.00482CFC
0068FC31    8B55 F0    mov edx,dword ptr ss:[ebp-10]        ; 试练码123456789送edx
0068FC34    A1 FC88710>mov eax,dword ptr ds:[7188FC]        ; eax=试练码位数9
0068FC39    E8 D64CD7F>call EEV.00404914
0068FC3E    A1 FC88710>mov eax,dword ptr ds:[7188FC]
0068FC43    8B00       mov eax,dword ptr ds:[eax]
0068FC45    50         push eax                             ; eax=123456789
0068FC46    BA 9CFD680>mov edx,EEV.0068FD9C                 ; ASCII "EstaExplValue 6.0\"
0068FC4B    B9 E0FD680>mov ecx,EEV.0068FDE0                 ; ASCII "Code"
0068FC50    8B45 F8    mov eax,dword ptr ss:[ebp-8]
0068FC53    E8 88AADBF>call EEV.0044A6E0
0068FC58    8B15 3C8C7>mov edx,dword ptr ds:[718C3C]        ; EEV.0071B488
0068FC5E    8B12       mov edx,dword ptr ds:[edx]           ; edx(机器码)=886EA-AEF73-EB5BB-904FD
0068FC60    B8 F0FD680>mov eax,EEV.0068FDF0                 ; ASCII "75EA2-2D12A-AA55A-FBCC7"
0068FC65    E8 6A52D7F>call EEV.00404ED4                    ; edx(机器码)=886EA-AEF73-EB5BB-904FD,eax(固定码)=75EA2-2D12A-AA55A-FBCC7
0068FC6A    85C0       test eax,eax                         ; 检查机器码是否与固定码格式一致,不一致则失败跳转
0068FC6C    74 0A      je short EEV.0068FC78
0068FC6E    E8 F146D7F>call EEV.00404364
0068FC73    E9 B300000>jmp EEV.0068FD2B
0068FC78    8D55 DC    lea edx,dword ptr ss:[ebp-24]
0068FC7B    A1 3C8C710>mov eax,dword ptr ds:[718C3C]
0068FC80    8B00       mov eax,dword ptr ds:[eax]
0068FC82    E8 1D93F1F>call EEV.005A8FA4
0068FC87    8D45 DC    lea eax,dword ptr ss:[ebp-24]
0068FC8A    8D55 EC    lea edx,dword ptr ss:[ebp-14]
0068FC8D    E8 B607000>call EEV.00690448                    ; 算法分析call
0068FC92    8B45 EC    mov eax,dword ptr ss:[ebp-14]        ; ebp-14=A2B1-1334,即为真正注册码
0068FC95    8B15 FC887>mov edx,dword ptr ds:[7188FC]        ; EEV.0071B48C
0068FC9B    8B12       mov edx,dword ptr ds:[edx]
0068FC9D    E8 3252D7F>call EEV.00404ED4                    ; eax=注册码,edx=试练码,检测试练码是否正确,可以跟进看看
0068FCA2    85C0       test eax,eax
0068FCA4    7E 2E      jle short EEV.0068FCD4
0068FCA6    6A 40      push 40
0068FCA8    8D55 D8    lea edx,dword ptr ss:[ebp-28]
0068FCAB    A1 5C8D710>mov eax,dword ptr ds:[718D5C]
0068FCB0    8B00       mov eax,dword ptr ds:[eax]
0068FCB2    E8 F94EE1F>call EEV.004A4BB0
0068FCB7    8B45 D8    mov eax,dword ptr ss:[ebp-28]
0068FCBA    E8 D150D7F>call EEV.00404D90
0068FCBF    8BC8       mov ecx,eax
0068FCC1    BA 08FE680>mov edx,EEV.0068FE08
0068FCC6    A1 5C8D710>mov eax,dword ptr ds:[718D5C]
0068FCCB    8B00       mov eax,dword ptr ds:[eax]
0068FCCD    E8 6A55E1F>call EEV.004A523C
0068FCD2    EB 2C      jmp short EEV.0068FD00
0068FCD4    6A 10      push 10
0068FCD6    8D55 D4    lea edx,dword ptr ss:[ebp-2C]
0068FCD9    A1 5C8D710>mov eax,dword ptr ds:[718D5C]
0068FCDE    8B00       mov eax,dword ptr ds:[eax]
0068FCE0    E8 CB4EE1F>call EEV.004A4BB0
0068FCE5    8B45 D4    mov eax,dword ptr ss:[ebp-2C]
0068FCE8    E8 A350D7F>call EEV.00404D90
0068FCED    8BC8       mov ecx,eax
0068FCEF    BA 50FE680>mov edx,EEV.0068FE50
0068FCF4    A1 5C8D710>mov eax,dword ptr ds:[718D5C]
0068FCF9    8B00       mov eax,dword ptr ds:[eax]
0068FCFB    E8 3C55E1F>call EEV.004A523C                    ; 注册失败提示处
0068FD00    33C0       xor eax,eax                          ; 注册成功则跳转到此
0068FD02    5A         pop edx
0068FD03    59         pop ecx
0068FD04    59         pop ecx
0068FD05    64:8910    mov dword ptr fs:[eax],edx
0068FD08    68 23FD680>push EEV.0068FD23
0068FD0D    837D F8 00 cmp dword ptr ss:[ebp-8],0
0068FD11    74 08      je short EEV.0068FD1B
0068FD13    8B45 F8    mov eax,dword ptr ss:[ebp-8]
0068FD16    E8 F93CD7F>call EEV.00403A14
0068FD1B    C3         retn
*******************************************************************************************

跟进算法call EEV.00690448,来到这里 

0069046C    55         push ebp
0069046D    68 2A05690>push EEV.0069052A
00690472    64:FF30    push dword ptr fs:[eax]
00690475    64:8920    mov dword ptr fs:[eax],esp
00690478    8D45 E8    lea eax,dword ptr ss:[ebp-18]
0069047B    50         push eax
0069047C    8D55 DC    lea edx,dword ptr ss:[ebp-24]
0069047F    8D45 EC    lea eax,dword ptr ss:[ebp-14]
00690482    E8 918BF1F>call EEV.005A9018
00690487    8B45 DC    mov eax,dword ptr ss:[ebp-24]   ; MD5(886EA-AEF73-EB5BB-904FD)=a2b1334c5bf63029fa17728b232466bc
0069048A    8945 E0    mov dword ptr ss:[ebp-20],eax   ; eax=“a2b1334c5bf63029fa17728b232466bc”
0069048D    C645 E4 0B mov byte ptr ss:[ebp-1C],0B     ; 0B=ss:[ebp-1C]
00690491    8D55 E0    lea edx,dword ptr ss:[ebp-20]
00690494    33C9       xor ecx,ecx                     ; ecx清零
00690496    B8 4005690>mov eax,EEV.00690540            ; ASCII "%s"
0069049B    E8 6CA6D7F>call EEV.0040AB0C               ; 将“a2b1334c5bf63029fa17728b232466bc”转成大写字母
006904A0    8B45 E8    mov eax,dword ptr ss:[ebp-18]   ; ss:[ebp-18]=a2b1334c5bf63029fa17728b232466bc
006904A3    8D55 FC    lea edx,dword ptr ss:[ebp-4]    ; eax=a2b1334c5bf63029fa17728b232466bc
006904A6    E8 698ED7F>call EEV.00409314
006904AB    8BC6       mov eax,esi
006904AD    E8 0E44D7F>call EEV.004048C0
006904B2    33DB       xor ebx,ebx                     ; ebx清零
006904B4    85DB       test ebx,ebx
006904B6    75 15      jnz short EEV.006904CD
006904B8    56         push esi
006904B9    8BD3       mov edx,ebx
006904BB    C1E2 02    shl edx,2                       ; edx左移2
006904BE    B9 0400000>mov ecx,4                       ; 4送ecx
006904C3    8B45 FC    mov eax,dword ptr ss:[ebp-4]    ; ebp-4=A2B1334C5BF63029FA17728B232466BC,送eax
006904C6    E8 2549D7F>call EEV.00404DF0
006904CB    EB 2C      jmp short EEV.006904F9
006904CD    FF36       push dword ptr ds:[esi]         ; ds:[esi]=A2B1,即第一部分注册码
006904CF    68 4C05690>push EEV.0069054C
006904D4    8D45 D8    lea eax,dword ptr ss:[ebp-28]
006904D7    50         push eax
006904D8    8BD3       mov edx,ebx
006904DA    C1E2 02    shl edx,2
006904DD    B9 0400000>mov ecx,4
006904E2    8B45 FC    mov eax,dword ptr ss:[ebp-4]
006904E5    E8 0649D7F>call EEV.00404DF0
006904EA    FF75 D8    push dword ptr ss:[ebp-28]      ; ss:[ebp-28]=1344,即第二部分注册码
006904ED    8BC6       mov eax,esi
006904EF    BA 0300000>mov edx,3
006904F4    E8 5747D7F>call EEV.00404C50
006904F9    43         inc ebx                         ; ebx+1
006904FA    83FB 02    cmp ebx,2                       ; ebx与2比较
006904FD  ^ 75 B5      jnz short EEV.006904B4          ; 循环2次
006904FF    33C0       xor eax,eax
00690501    5A         pop edx
00690502    59         pop ecx
00690503    59         pop ecx
00690504    64:8910    mov dword ptr fs:[eax],edx
00690507    68 3105690>push EEV.00690531
0069050C    8D45 D8    lea eax,dword ptr ss:[ebp-28]
0069050F    BA 0200000>mov edx,2
00690514    E8 CB43D7F>call EEV.004048E4
00690519    8D45 E8    lea eax,dword ptr ss:[ebp-18]
0069051C    E8 9F43D7F>call EEV.004048C0
00690521    8D45 FC    lea eax,dword ptr ss:[ebp-4]
00690524    E8 9743D7F>call EEV.004048C0
00690529    C3         retn
*******************************************************************************************

跟进call EEV.00404ED4,来到这里

00404ED4    85C0       test eax,eax
00404ED6    74 40      je short EEV.00404F18
00404ED8    85D2       test edx,edx
00404EDA    74 31      je short EEV.00404F0D
00404EDC    53         push ebx
00404EDD    56         push esi
00404EDE    57         push edi
00404EDF    89C6       mov esi,eax                     ; 注册码送esi
00404EE1    89D7       mov edi,edx                     ; 试练码送edi
00404EE3    8B4F FC    mov ecx,dword ptr ds:[edi-4]    ; ds:[edi-4]=9,送ecx
00404EE6    57         push edi
00404EE7    8B56 FC    mov edx,dword ptr ds:[esi-4]    ; ds:[esi-4]=9,送edx
00404EEA    4A         dec edx                         ; edx-1
00404EEB    78 1B      js short EEV.00404F08
00404EED    8A06       mov al,byte ptr ds:[esi]        ; 机器码ascii码逐位送al
00404EEF    46         inc esi                         ; esi+1
00404EF0    29D1       sub ecx,edx                     ; ecx-edx
00404EF2    7E 14      jle short EEV.00404F08
00404EF4    F2:AE      repne scas byte ptr es:[edi]    ; 循环比较注册码与试练码是否一致
00404EF6    75 10      jnz short EEV.00404F08          ; 不等则跳出
00404EF8    89CB       mov ebx,ecx
00404EFA    56         push esi
00404EFB    57         push edi
00404EFC    89D1       mov ecx,edx
00404EFE    F3:A6      repe cmps byte ptr es:[edi],byt>
00404F00    5F         pop edi
00404F01    5E         pop esi
00404F02    74 0C      je short EEV.00404F10
00404F04    89D9       mov ecx,ebx
00404F06  ^ EB EC      jmp short EEV.00404EF4
00404F08    5A         pop edx
00404F09    31C0       xor eax,eax
00404F0B    EB 08      jmp short EEV.00404F15
00404F0D    31C0       xor eax,eax
00404F0F    C3         retn
*******************************************************************************************
算法总结:

软件采用了MD5算法,但也是很简单的,主要思路如下:

将机器码进行MD5运算,结果为a2b1334c5bf63029fa17728b232466bc(记做codeA),转成大写为A2B1334C5BF63029FA17728B232466BC(记做codeB),注册码为两部分:第一部分取codeB的1-4位;第二部分取注册码的4-7位;两部分和起来中间加上“-”,即为真正注册码。

我这里是:MD5(886EA-AEF73-EB5BB-904FD)=a2b1334c5bf63029fa17728b232466bc,注册码为A2B1-1334。

特别说明: 本文仅是一些破解的心得和思路,完全是个人对程序的研究,无其他目的。