E-钻文件夹加密大师V8.30算法分析
作者:lchhome
首先发现它加了UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo的壳,很容易手脱,并修复输入表就可以了,简述一下。
用OD载入程序,利用插件,可以找到“请输入用户名和注册码”这个提示,双击,如下:
004B823B    6A 00           PUSH 0
004B823D    68 DC834B00     PUSH 12_.004B83DC                        ; 提示
004B8242    68 E4834B00     PUSH 12_.004B83E4                        ;       请输入用户名和注册码
004B8247    8BC3            MOV EAX,EBX
004B8249    E8 72E9FAFF     CALL 12_.00466BC0
004B824E    50              PUSH EAX
004B824F    E8 54F3F4FF     CALL <JMP.&user32.MessageBoxA>
004B8254    E9 29010000     JMP 12_.004B8382
004B8259    8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
004B825C    50              PUSH EAX
004B825D    8D55 F0         LEA EDX,DWORD PTR SS:[EBP-10]
004B8260    8B83 F8020000   MOV EAX,DWORD PTR DS:[EBX+2F8]
004B8266    E8 4180FAFF     CALL 12_.004602AC
004B826B    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]
004B826E    B9 06000000     MOV ECX,6
004B8273    BA 01000000     MOV EDX,1
004B8278    E8 23CBF4FF     CALL 12_.00404DA0
004B827D    33C0            XOR EAX,EAX
004B827F    55              PUSH EBP
004B8280    68 62834B00     PUSH 12_.004B8362
004B8285    64:FF30         PUSH DWORD PTR FS:[EAX]
004B8288    64:8920         MOV DWORD PTR FS:[EAX],ESP
004B828B    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004B828E    E8 710FF5FF     CALL 12_.00409204               这个CALL是读取你输入的注册码   ,我就在这里按F2下断  
004B8293    B9 03000000     MOV ECX,3                      赋值ECX=3
004B8298    99              CDQ
004B8299    F7F9            IDIV ECX
004B829B    8D55 EC         LEA EDX,DWORD PTR SS:[EBP-14]
004B829E    E8 250EF5FF     CALL 12_.004090C8             这句CALL是把你的注册码整除3得到一个值,记为A吧
004B82A3    8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]
004B82A6    A1 F41A4F00     MOV EAX,DWORD PTR DS:[4F1AF4]
004B82AB    8B00            MOV EAX,DWORD PTR DS:[EAX]
004B82AD    E8 EA110300     CALL 12_.004E949C             跟进(1)典型的比较
004B82B2    84C0            TEST AL,AL                    
004B82B4    74 6D           JE SHORT 12_.004B8323        相等则跳,不等则往下走
004B82B6    8D55 E8         LEA EDX,DWORD PTR SS:[EBP-18]
004B82B9    8B83 F8020000   MOV EAX,DWORD PTR DS:[EBX+2F8]
004B82BF    E8 E87FFAFF     CALL 12_.004602AC
004B82C4    8B45 E8         MOV EAX,DWORD PTR SS:[EBP-18]
004B82C7    BA 10844B00     MOV EDX,12_.004B8410                     ; 4792597878n2n9n:im  这个值很奇怪哟
004B82CC    E8 BBC9F4FF     CALL 12_.00404C8C                  跟进(2) 
004B82D1    74 50           JE SHORT 12_.004B8323              相等则跳,跳则有你乐的!
004B82D3    A1 F41A4F00     MOV EAX,DWORD PTR DS:[4F1AF4]
004B82D8    8B00            MOV EAX,DWORD PTR DS:[EAX]
004B82DA    8B88 50040000   MOV ECX,DWORD PTR DS:[EAX+450]
004B82E0    B2 01           MOV DL,1
004B82E2    A1 60994300     MOV EAX,DWORD PTR DS:[439960]
004B82E7    E8 2417F8FF     CALL 12_.00439A10
004B82EC    8BF0            MOV ESI,EAX
004B82EE    8D55 E0         LEA EDX,DWORD PTR SS:[EBP-20]
004B82F1    8B83 F8020000   MOV EAX,DWORD PTR DS:[EBX+2F8]
004B82F7    E8 B07FFAFF     CALL 12_.004602AC
004B82FC    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]
004B82FF    8D55 E4         LEA EDX,DWORD PTR SS:[EBP-1C]
004B8302    E8 F109F5FF     CALL 12_.00408CF8
004B8307    8B45 E4         MOV EAX,DWORD PTR SS:[EBP-1C]
004B830A    50              PUSH EAX
004B830B    B9 2C844B00     MOV ECX,12_.004B842C                     ; ASCII "zcm"
004B8310    BA 38844B00     MOV EDX,12_.004B8438                     ; edia
004B8315    8BC6            MOV EAX,ESI
004B8317    8B18            MOV EBX,DWORD PTR DS:[EAX]
004B8319    FF53 04         CALL DWORD PTR DS:[EBX+4]
004B831C    8BC6            MOV EAX,ESI
004B831E    E8 49B7F4FF     CALL 12_.00403A6C
004B8323    B8 48844B00     MOV EAX,12_.004B8448                     ; 感谢您的注册,软件现在将自动重新启动\n\n如果注册成功了,您会发现主程序界面上方的"软件注册"变灰了
004B8328    E8 BBAAF7FF     CALL 12_.00432DE8

跟进(1)

004E949C    55              PUSH EBP
004E949D    8BEC            MOV EBP,ESP
004E949F    33C9            XOR ECX,ECX
004E94A1    51              PUSH ECX
004E94A2    51              PUSH ECX
004E94A3    51              PUSH ECX
004E94A4    51              PUSH ECX
004E94A5    51              PUSH ECX
004E94A6    51              PUSH ECX
004E94A7    51              PUSH ECX
004E94A8    53              PUSH EBX
004E94A9    56              PUSH ESI
004E94AA    57              PUSH EDI
004E94AB    8955 FC         MOV DWORD PTR SS:[EBP-4],EDX
004E94AE    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004E94B1    E8 7AB8F1FF     CALL 12_.00404D30
004E94B6    33C0            XOR EAX,EAX
004E94B8    55              PUSH EBP
004E94B9    68 DD954E00     PUSH 12_.004E95DD
004E94BE    64:FF30         PUSH DWORD PTR FS:[EAX]
004E94C1    64:8920         MOV DWORD PTR FS:[EAX],ESP
004E94C4    33C0            XOR EAX,EAX
004E94C6    55              PUSH EBP
004E94C7    68 9F954E00     PUSH 12_.004E959F
004E94CC    64:FF30         PUSH DWORD PTR FS:[EAX]
004E94CF    64:8920         MOV DWORD PTR FS:[EAX],ESP
004E94D2    8D45 F4         LEA EAX,DWORD PTR SS:[EBP-C]
004E94D5    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004E94D8    E8 3BB4F1FF     CALL 12_.00404918
004E94DD    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
004E94E0    E8 5BB6F1FF     CALL 12_.00404B40
004E94E5    85C0            TEST EAX,EAX
004E94E7    0F8E 95000000   JLE 12_.004E9582
004E94ED    8945 EC         MOV DWORD PTR SS:[EBP-14],EAX     
004E94F0    BB 01000000     MOV EBX,1                          EBX=1(初始值)           循环开始
004E94F5    8BFB            MOV EDI,EBX                     ——————————————————————————————
004E94F7    0FAFFB          IMUL EDI,EBX                       EDI=EDI*EBX   这里的EDI 和EBX为依次加1           
004E94FA    8BC7            MOV EAX,EDI
004E94FC    F7EB            IMUL EBX                          EBX初始值为1,依次加1
004E94FE    8D53 14         LEA EDX,DWORD PTR DS:[EBX+14]     EDX=EBX+14
004E9501    8BCA            MOV ECX,EDX                       ECX=EDX
004E9503    99              CDQ
004E9504    F7F9            IDIV ECX                          EAX整除ECX,这里的EAX的值=EBX*EBX*EBX,EBX初始值为1,依次加1,可从004E94FC、004E953A 、004E953C句看出
004E9506    8BF2            MOV ESI,EDX                       余数移入ESI
004E9508    8BC7            MOV EAX,EDI
004E950A    8D53 0A         LEA EDX,DWORD PTR DS:[EBX+A]      EDX=EBX+A
004E950D    8BCA            MOV ECX,EDX                       ECX=EDX
004E950F    99              CDQ
004E9510    F7F9            IDIV ECX                          整除ECX
004E9512    03F2            ADD ESI,EDX                       ESI=ESI+EDX
004E9514    8BC3            MOV EAX,EBX
004E9516    03C0            ADD EAX,EAX                       EAX=EAX+EAX(EAX初始值为1,依次加1)
004E9518    03F0            ADD ESI,EAX                       ESI=ESI+EAX
004E951A    46              INC ESI
004E951B    8D45 E8         LEA EAX,DWORD PTR SS:[EBP-18]
004E951E    8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
004E9521    0FB6541A FF     MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
004E9526    03D6            ADD EDX,ESI                      EDX=EDX+ESI EDX的值为依次取A值(就是你的注册码整除3得到的数)的ASCII码
004E9528    E8 3BB5F1FF     CALL 12_.00404A68              
004E952D    8B55 E8         MOV EDX,DWORD PTR SS:[EBP-18]    得到n位的值
004E9530    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
004E9533    E8 10B6F1FF     CALL 12_.00404B48
004E9538    8BC3            MOV EAX,EBX
004E953A    F7EB            IMUL EBX                       ×EBX
004E953C    F7EB            IMUL EBX                       ×EBX
004E953E    8D53 0A         LEA EDX,DWORD PTR DS:[EBX+A]   EDX=EBX+A
004E9541    8BCA            MOV ECX,EDX                    ECX=EDX
004E9543    99              CDQ
004E9544    F7F9            IDIV ECX                       整除ECX
004E9546    8BF2            MOV ESI,EDX
004E9548    8BC7            MOV EAX,EDI
004E954A    8D53 14         LEA EDX,DWORD PTR DS:[EBX+14]  EDX=EBX+14
004E954D    8BCA            MOV ECX,EDX
004E954F    99              CDQ
004E9550    F7F9            IDIV ECX                       整除ECX
004E9552    03F2            ADD ESI,EDX                    ESI=ESI+EDX
004E9554    8BC3            MOV EAX,EBX
004E9556    03C0            ADD EAX,EAX                    EAX=EAX+EAX(EAX初始值为1,依次加1)
004E9558    03F0            ADD ESI,EAX                    ESI=ESI+EAX
004E955A    46              INC ESI
004E955B    8D45 E4         LEA EAX,DWORD PTR SS:[EBP-1C]
004E955E    8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
004E9561    0FB6541A FF     MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]
004E9566    03D6            ADD EDX,ESI                     EDX=EDX+ESIEDX的值为依次取A值(就是你的注册码整除3得到的数)的ASCII码
004E9568    E8 FBB4F1FF     CALL 12_.00404A68
004E956D    8B55 E4         MOV EDX,DWORD PTR SS:[EBP-1C]   得到n+1位的值
004E9570    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
004E9573    E8 D0B5F1FF     CALL 12_.00404B48
004E9578    43              INC EBX
004E9579    FF4D EC         DEC DWORD PTR SS:[EBP-14]        跳回,直至算完     循环结束
004E957C  ^ 0F85 73FFFFFF   JNZ 12_.004E94F5                  ————————————————————————————
004E9582    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]    这里为最后算完的值移入EAX
004E9585    BA F8954E00     MOV EDX,12_.004E95F8                     ; ASCII "66FFMJRXJELR"   这是软件赋于的固定值
004E958A    E8 FDB6F1FF     CALL 12_.00404C8C                典型的比较,把算出来的值与66FFMJRXJELR比较
004E958F    75 04           JNZ SHORT 12_.004E9595          


跟进(2)
00404C8A    8BC0            MOV EAX,EAX
00404C8C    53              PUSH EBX
00404C8D    56              PUSH ESI
00404C8E    57              PUSH EDI
00404C8F    89C6            MOV ESI,EAX
00404C91    89D7            MOV EDI,EDX
00404C93    39D0            CMP EAX,EDX
00404C95    0F84 8F000000   JE 12_.00404D2A
00404C9B    85F6            TEST ESI,ESI
00404C9D    74 68           JE SHORT 12_.00404D07
00404C9F    85FF            TEST EDI,EDI
00404CA1    74 6B           JE SHORT 12_.00404D0E
00404CA3    8B46 FC         MOV EAX,DWORD PTR DS:[ESI-4]
00404CA6    8B57 FC         MOV EDX,DWORD PTR DS:[EDI-4]
00404CA9    29D0            SUB EAX,EDX
00404CAB    77 02           JA SHORT 12_.00404CAF
00404CAD    01C2            ADD EDX,EAX
00404CAF    52              PUSH EDX
00404CB0    C1EA 02         SHR EDX,2
00404CB3    74 26           JE SHORT 12_.00404CDB
00404CB5    8B0E            MOV ECX,DWORD PTR DS:[ESI]     你的注册码前四位
00404CB7    8B1F            MOV EBX,DWORD PTR DS:[EDI]    “4792597878n2n9n:im”的前四位
00404CB9    39D9            CMP ECX,EBX                    比较
00404CBB    75 58           JNZ SHORT 12_.00404D15         不等跳走
00404CBD    4A              DEC EDX
00404CBE    74 15           JE SHORT 12_.00404CD5
00404CC0    8B4E 04         MOV ECX,DWORD PTR DS:[ESI+4]  你的注册码第五位至第八位
00404CC3    8B5F 04         MOV EBX,DWORD PTR DS:[EDI+4]  “4792597878n2n9n:im”的第五位至第八位
00404CC6    39D9            CMP ECX,EBX                    比较
00404CC8    75 4B           JNZ SHORT 12_.00404D15         不等跳走
00404CCA    83C6 08         ADD ESI,8
00404CCD    83C7 08         ADD EDI,8
00404CD0    4A              DEC EDX
00404CD1  ^ 75 E2           JNZ SHORT 12_.00404CB5
00404CD3    EB 06           JMP SHORT 12_.00404CDB
00404CD5    83C6 04         ADD ESI,4
00404CD8    83C7 04         ADD EDI,4
00404CDB    5A              POP EDX
00404CDC    83E2 03         AND EDX,3
00404CDF    74 22           JE SHORT 12_.00404D03
00404CE1    8B0E            MOV ECX,DWORD PTR DS:[ESI]     
00404CE3    8B1F            MOV EBX,DWORD PTR DS:[EDI]
00404CE5    38D9            CMP CL,BL                     比较两者第九位
00404CE7    75 41           JNZ SHORT 12_.00404D2A       不等跳走,完了
00404CE9    4A              DEC EDX
00404CEA    74 17           JE SHORT 12_.00404D03
00404CEC    38FD            CMP CH,BH                     比较两者第十位
00404CEE    75 3A           JNZ SHORT 12_.00404D2A       不等跳走,完了
00404CF0    4A              DEC EDX
00404CF1    74 10           JE SHORT 12_.00404D03
00404CF3    81E3 0000FF00   AND EBX,0FF0000
00404CF9    81E1 0000FF00   AND ECX,0FF0000
00404CFF    39D9            CMP ECX,EBX
00404D01    75 27           JNZ SHORT 12_.00404D2A
00404D03    01C0            ADD EAX,EAX
00404D05    EB 23           JMP SHORT 12_.00404D2A        返回

算法总结:
一、注册码和用户名无关;
二、注册码须十位;
三、注册码是根据字符串“66FFMJRXJELR”算出来,下面具体分析一下:
                 6     6     F     F    M     J     R     X      J      E     L       R
ASCII码         36    36    46    46   4D    4A     52    58     4A     45    4C      52
EBX              1          2           3           4            5             6    
EAX              1          2           3           4            5             6
EBX*EBX*EBX      1          8          1B           40          7D            D8
ECX=EBX+14      15         16           17          18          19            1A
EDX1=MOD ECX     1          8           4           10           0             8
ECX=EBX+A        B          C           D            E           F            10
EDX2=MOD ECX     1          4           9            2           A             4
EAX=EAX+EAX      2          4           6            8           A             C           
EDX=EDX2+EDX1    2          C           D           12           A             C
ESI=EAX+EDX      4         10          13           1A          14            18
EDX=ESI+1      5         11          14           1B          15            19
ASCII码-EDX     31         35          39           37          35            33
十进制           1          5           9            7           5             3

得到值159753,再×3=479259
再和字符串“4792597878n2n9n:im”比较,相等则取前十位,就是真注册码。
我认为软件作者在加密中,拿“4792597878n2n9n:im”这个字符串去比较可算是败笔!这样的话,前面的算法都是白搭,直接跟进004B82CC这个CALL就容易找到注册码!一点小见解!