【文章标题】: Binerus 3D Image Commander算法分析
【文章作者】: wuhanqi
【作者邮箱】: wuhanqi@qq.com
【作者QQ号】: 459478830
【软件名称】: Binerus 3D Image Commander 1.70
【下载地址】: http://www.newhua.com/soft/88336.htm
【保护方式】: 无壳,算法
【编写语言】: delphi
【使用工具】: OD peid
【作者声明】: 闲来无事挑个软柿子捏捏
--------------------------------------------------------------------------------
【详细过程】
  peid查壳:Borland Delphi 6.0 - 7.0

代码:
  开始验证:
  005294C0  /.  55            PUSH EBP                                 ;  通过dede可以找到这里
  005294C1  |.  8BEC          MOV EBP,ESP
  005294C3  |.  83C4 F4       ADD ESP,-0C
  005294C6  |.  33C9          XOR ECX,ECX
  005294C8  |.  894D F4       MOV DWORD PTR SS:[EBP-C],ECX
  005294CB  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX
  005294CE  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
  005294D1  |.  33C0          XOR EAX,EAX
  005294D3  |.  55            PUSH EBP
  005294D4  |.  68 4F955200   PUSH 0052954F
  005294D9  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
  005294DC  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
  005294DF  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
  005294E2  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  005294E5  |.  8B80 38040000 MOV EAX,DWORD PTR DS:[EAX+438]
  005294EB  |.  E8 7C7CF6FF   CALL 0049116C
  005294F0  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
  005294F3  |.  E8 88C6FFFF   CALL 00525B80                            ;  关键call,要al==1
  005294F8  |.  84C0          TEST AL,AL
  005294FA  |.  74 35         JE SHORT 00529531
  005294FC  |.  C605 20AE5300>MOV BYTE PTR DS:[53AE20],1
  00529503  |.  8A15 20AE5300 MOV DL,BYTE PTR DS:[53AE20]
  00529509  |.  80F2 01       XOR DL,1
  0052950C  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  0052950F  |.  8B80 1C040000 MOV EAX,DWORD PTR DS:[EAX+41C]
  00529515  |.  E8 2E5AF9FF   CALL 004BEF48
  0052951A  |.  8A15 20AE5300 MOV DL,BYTE PTR DS:[53AE20]
  00529520  |.  80F2 01       XOR DL,1
  00529523  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00529526  |.  8B80 F0040000 MOV EAX,DWORD PTR DS:[EAX+4F0]
  0052952C  |.  8B08          MOV ECX,DWORD PTR DS:[EAX]
  0052952E  |.  FF51 58       CALL DWORD PTR DS:[ECX+58]
  00529531  |>  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00529534  |.  E8 4BFEFFFF   CALL 00529384
  00529539  |.  33C0          XOR EAX,EAX
  0052953B  |.  5A            POP EDX
  0052953C  |.  59            POP ECX
  0052953D  |.  59            POP ECX
  0052953E  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
  00529541  |.  68 56955200   PUSH 00529556
  00529546  |>  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
  00529549  |.  E8 A2B3EDFF   CALL 004048F0
  0052954E  \.  C3            RETN
  0052954F   .^ E9 F4A5EDFF   JMP 00403B48
  00529554   .^ EB F0         JMP SHORT 00529546
  00529556   .  8BE5          MOV ESP,EBP
  00529558   .  5D            POP EBP
  00529559   .  C3            RETN
  
  ===================================================================
  00525B80      55            PUSH EBP
  00525B81      8BEC          MOV EBP,ESP
  00525B83      B9 06000000   MOV ECX,6
  00525B88      6A 00         PUSH 0
  00525B8A  |.  6A 00         |PUSH 0
  00525B8C  |.  49            |DEC ECX
  00525B8D  |.^ 75 F9         \JNZ SHORT 00525B88
  00525B8F  |.  53            PUSH EBX
  00525B90  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
  00525B93  |.  33C0          XOR EAX,EAX
  00525B95  |.  55            PUSH EBP
  00525B96  |.  68 385D5200   PUSH 00525D38
  00525B9B  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
  00525B9E  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
  00525BA1  |.  C645 FB 00    MOV BYTE PTR SS:[EBP-5],0
  00525BA5  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
  00525BA8  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
  00525BAB  |.  E8 BCE8EDFF   CALL 0040446C
  00525BB0  |.  8B55 F4       MOV EDX,DWORD PTR SS:[EBP-C]
  00525BB3  |.  B8 505D5200   MOV EAX,00525D50                         ;  ASCII "6E87-56BE-E484-962F"
  00525BB8  |.  E8 D32AEEFF   CALL 00408690                            ;  黑名单,相等即死
  00525BBD  |.  85C0          TEST EAX,EAX
  00525BBF  |.  0F9445 FB     SETE BYTE PTR SS:[EBP-5]
  00525BC3  |.  807D FB 00    CMP BYTE PTR SS:[EBP-5],0
  00525BC7  |.  74 09         JE SHORT 00525BD2
  00525BC9  |.  C645 FB 00    MOV BYTE PTR SS:[EBP-5],0
  00525BCD  |.  E9 0B010000   JMP 00525CDD
  00525BD2  |>  C645 FB 00    MOV BYTE PTR SS:[EBP-5],0
  00525BD6  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00525BD9  |.  E8 CEEEEDFF   CALL 00404AAC                            ;  比较位数是否是0x13位。
  00525BDE  |.  83F8 13       CMP EAX,13
  00525BE1  |.  0F85 F6000000 JNZ 00525CDD
  00525BE7  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00525BEA  |.  66:8378 08 2D CMP WORD PTR DS:[EAX+8],2D
  00525BEF  |.  0F85 E8000000 JNZ 00525CDD                             ;  检验是否按这样的格式输入了注册码xxxx-xxxx-xxxx-xxxx
  00525BF5  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00525BF8  |.  66:8378 12 2D CMP WORD PTR DS:[EAX+12],2D
  00525BFD  |.  0F85 DA000000 JNZ 00525CDD
  00525C03  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00525C06  |.  66:8378 1C 2D CMP WORD PTR DS:[EAX+1C],2D
  00525C0B  |.  0F85 CC000000 JNZ 00525CDD
  00525C11  |.  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
  00525C14  |.  A1 BCB15300   MOV EAX,DWORD PTR DS:[53B1BC]
  00525C19  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
  00525C1B  |.  E8 14C0F3FF   CALL 00461C34
  00525C20  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]            ;  出现固定字符串
  00525C23  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
  00525C26  |.  E8 61EEEDFF   CALL 00404A8C
  00525C2B  |.  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]            ;  这几句比较是否我们输入的是固定字符串
  00525C2E  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00525C31  |.  E8 8EEFEDFF   CALL 00404BC4
  00525C36  |.  74 30         JE SHORT 00525C68
  00525C38  |.  8D55 E4       LEA EDX,DWORD PTR SS:[EBP-1C]
  00525C3B  |.  A1 BCB15300   MOV EAX,DWORD PTR DS:[53B1BC]
  00525C40  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
  00525C42  |.  E8 EDBFF3FF   CALL 00461C34
  00525C47  |.  8B55 E4       MOV EDX,DWORD PTR SS:[EBP-1C]
  00525C4A  |.  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
  00525C4D  |.  E8 3AEEEDFF   CALL 00404A8C
  00525C52  |.  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
  00525C55  |.  E8 1EFDFFFF   CALL 00525978                            ;  算法call,结果到eax
  00525C5A  |.  8BD8          MOV EBX,EAX                              ;  固定字符串计算后的结果到ebx
  00525C5C  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  假码到eax
  00525C5F  |.  E8 14FDFFFF   CALL 00525978                            ;  算法call,结果到eax
  00525C64  |.  3BD8          CMP EBX,EAX                              ;  比较eax与ebx
  00525C66  |.  74 04         JE SHORT 00525C6C                        ;  相等即赋值1,注册成功
  00525C68  |>  33C0          XOR EAX,EAX
  00525C6A  |.  EB 02         JMP SHORT 00525C6E
  00525C6C  |>  B0 01         MOV AL,1
  00525C6E  |>  8845 FB       MOV BYTE PTR SS:[EBP-5],AL
  00525C71  |.  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
  00525C74  |.  A1 BCB15300   MOV EAX,DWORD PTR DS:[53B1BC]
  00525C79  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
  00525C7B  |.  E8 B4BFF3FF   CALL 00461C34
  00525C80  |.  8B55 DC       MOV EDX,DWORD PTR SS:[EBP-24]
  00525C83  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
  00525C86  |.  E8 01EEEDFF   CALL 00404A8C
  00525C8B  |.  8B45 E0       MOV EAX,DWORD PTR SS:[EBP-20]
  00525C8E  |.  E8 E5FCFFFF   CALL 00525978
  00525C93  |.  8BD8          MOV EBX,EAX
  00525C95  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
  00525C98  |.  E8 DBFCFFFF   CALL 00525978
  00525C9D  |.  3BD8          CMP EBX,EAX
  00525C9F  |.  75 3C         JNZ SHORT 00525CDD
  00525CA1  |.  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
  00525CA4  |.  A1 BCB15300   MOV EAX,DWORD PTR DS:[53B1BC]
  00525CA9  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
  00525CAB  |.  E8 84BFF3FF   CALL 00461C34
  00525CB0  |.  8B55 D0       MOV EDX,DWORD PTR SS:[EBP-30]
  00525CB3  |.  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  00525CB6  |.  E8 D1EDEDFF   CALL 00404A8C
  00525CBB  |.  8B45 D4       MOV EAX,DWORD PTR SS:[EBP-2C]
  00525CBE  |.  8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
  00525CC1  |.  E8 DAB6FAFF   CALL 004D13A0
  00525CC6  |.  8B55 D8       MOV EDX,DWORD PTR SS:[EBP-28]
  00525CC9  |.  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]
  00525CCC  |.  B8 685D5200   MOV EAX,00525D68                         ;  UNICODE "software\ksdev"
  00525CD1  |.  E8 16FDFFFF   CALL 005259EC
  00525CD6  |.  C605 20AE5300>MOV BYTE PTR DS:[53AE20],1
  00525CDD  |>  33C0          XOR EAX,EAX
  00525CDF  |.  5A            POP EDX
  00525CE0  |.  59            POP ECX
  00525CE1  |.  59            POP ECX
  00525CE2  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
  00525CE5  |.  68 3F5D5200   PUSH 00525D3F
  00525CEA  |>  8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
  00525CED  |.  E8 F2E4EDFF   CALL 004041E4
  00525CF2  |.  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
  00525CF5  |.  BA 02000000   MOV EDX,2
  00525CFA  |.  E8 09ECEDFF   CALL 00404908
  00525CFF  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
  00525D02  |.  E8 DDE4EDFF   CALL 004041E4
  00525D07  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
  00525D0A  |.  E8 E1EBEDFF   CALL 004048F0
  00525D0F  |.  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
  00525D12  |.  E8 CDE4EDFF   CALL 004041E4
  00525D17  |.  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
  00525D1A  |.  E8 D1EBEDFF   CALL 004048F0
  00525D1F  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
  00525D22  |.  E8 BDE4EDFF   CALL 004041E4
  00525D27  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
  00525D2A  |.  E8 C1EBEDFF   CALL 004048F0
  00525D2F  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
  00525D32  |.  E8 ADE4EDFF   CALL 004041E4
  00525D37  \.  C3            RETN
  00525D38   .^ E9 0BDEEDFF   JMP 00403B48
  00525D3D   .^ EB AB         JMP SHORT 00525CEA
  00525D3F   .  8A45 FB       MOV AL,BYTE PTR SS:[EBP-5]
  00525D42   .  5B            POP EBX
  00525D43   .  8BE5          MOV ESP,EBP
  00525D45   .  5D            POP EBP
  00525D46   .  C3            RETN
  
  ================================================================
  
  程序对固定字符串和假码进行的是相同的运算。
  
  算法call:
  00525978  /$  55            PUSH EBP
  00525979  |.  8BEC          MOV EBP,ESP
  0052597B  |.  83C4 EC       ADD ESP,-14
  0052597E  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
  00525981  |.  33C0          XOR EAX,EAX
  00525983  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
  00525986  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  取固定字符串"3D Image Commander"
  00525989  |.  E8 1EF1EDFF   CALL 00404AAC                            ;  计算位数
  0052598E  |.  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX            ;  位数到ebp-10,就是存到堆栈
  00525991  |.  837D F0 0A    CMP DWORD PTR SS:[EBP-10],0A             ;  比较是否小于10位
  00525995  |.  7E 07         JLE SHORT 0052599E                       ;  小于实现跳转
  00525997  |.  C745 F0 0A000>MOV DWORD PTR SS:[EBP-10],0A             ;  大于的话强行把大小赋值为10,即只计算前十位
  0052599E  |>  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]            ;  大小到eax
  005259A1  |.  85C0          TEST EAX,EAX
  005259A3  |.  7E 30         JLE SHORT 005259D5                       ;  再看看有没有
  005259A5  |.  8945 EC       MOV DWORD PTR SS:[EBP-14],EAX            ;  放到ebp-14里计算
  005259A8  |.  C745 F4 01000>MOV DWORD PTR SS:[EBP-C],1               ;  附上一个初始的值。
    //由于初始寄存器都被清空,事实上只取了前9位进行计算,第一次运算可从005259BD  开始看
  005259AF  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]            ;  eax=A
  005259B2  |.  C1E0 02       |SHL EAX,2                               ;  A逻辑左移两位
  005259B5  |.  8B55 F8       |MOV EDX,DWORD PTR SS:[EBP-8]            ;  edx=A
  005259B8  |.  C1EA 1E       |SHR EDX,1E                              ;  A逻辑右移30位
  005259BB  |.  0BC2          |OR EAX,EDX                              ;  EAX=EAX与EDX做或运算
  005259BD  |.  8B55 FC       |MOV EDX,DWORD PTR SS:[EBP-4]            ;  字符串到edx
  005259C0  |.  8B4D F4       |MOV ECX,DWORD PTR SS:[EBP-C]            ;  初始的值1到ecx
  005259C3  |.  0FB7544A FE   |MOVZX EDX,WORD PTR DS:[EDX+ECX*2-2]     ;  取第edx+ecx*2-2位,因为是unicode的形式,所以必须取两个字节(word)
  005259C8  |.  33C2          |XOR EAX,EDX                             ;  eax与取出的字节做异或运算
  005259CA  |.  8945 F8       |MOV DWORD PTR SS:[EBP-8],EAX            ;  eax放到堆栈里保存,设为A
  005259CD  |.  FF45 F4       |INC DWORD PTR SS:[EBP-C]                ;  初始值+1
  005259D0  |.  FF4D EC       |DEC DWORD PTR SS:[EBP-14]               ;  位数-1到零即停止运算
  005259D3  |.^ 75 DA         \JNZ SHORT 005259AF
  005259D5  |>  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  计算好的数值拉出来。
  005259D8  |.  B9 FF0F0000   MOV ECX,0FFF                             ;  ecx=0xfff
  005259DD  |.  33D2          XOR EDX,EDX                              ;  清空edx
  005259DF  |.  F7F1          DIV ECX                                  ;  eax/ecx,余数到edx
  005259E1  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX             ;  edx就是真正最后的要求的值,压栈
  005259E4  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  到eax
  005259E7  |.  8BE5          MOV ESP,EBP
  005259E9  |.  5D            POP EBP
  005259EA  \.  C3            RETN
  
--------------------------------------------------------------------------------
【经验总结】
  取固定值3D Image Commander前9位。
  依次取16进制分别左移2位和右移12位,做或运算。
  然后再与下一位的16进制做异或运算。
  如此循环直至算完。
  假码也进行相同的运算,结果与上面算完的结果相同即可
  
  业余玩破解的,写不来注册机。
  有朋友能写个C的注册机给我学习一下的话最好~
  
--------------------------------------------------------------------------------
【版权声明】: 版权没有, 转载不究~

                                                       2009年10月26日 20:05:25