wuhanqi 发表于 2009-10-26 21:54

Binerus 3D Image Commander算法分析

【文章标题】: 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:,ECX
005294CB|.8955 F8       MOV DWORD PTR SS:,EDX
005294CE|.8945 FC       MOV DWORD PTR SS:,EAX
005294D1|.33C0          XOR EAX,EAX
005294D3|.55            PUSH EBP
005294D4|.68 4F955200   PUSH 0052954F
005294D9|.64:FF30       PUSH DWORD PTR FS:
005294DC|.64:8920       MOV DWORD PTR FS:,ESP
005294DF|.8D55 F4       LEA EDX,DWORD PTR SS:
005294E2|.8B45 FC       MOV EAX,DWORD PTR SS:
005294E5|.8B80 38040000 MOV EAX,DWORD PTR DS:
005294EB|.E8 7C7CF6FF   CALL 0049116C
005294F0|.8B45 F4       MOV EAX,DWORD PTR SS:
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:,1
00529503|.8A15 20AE5300 MOV DL,BYTE PTR DS:
00529509|.80F2 01       XOR DL,1
0052950C|.8B45 FC       MOV EAX,DWORD PTR SS:
0052950F|.8B80 1C040000 MOV EAX,DWORD PTR DS:
00529515|.E8 2E5AF9FF   CALL 004BEF48
0052951A|.8A15 20AE5300 MOV DL,BYTE PTR DS:
00529520|.80F2 01       XOR DL,1
00529523|.8B45 FC       MOV EAX,DWORD PTR SS:
00529526|.8B80 F0040000 MOV EAX,DWORD PTR DS:
0052952C|.8B08          MOV ECX,DWORD PTR DS:
0052952E|.FF51 58       CALL DWORD PTR DS:
00529531|>8B45 FC       MOV EAX,DWORD PTR SS:
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:,EDX
00529541|.68 56955200   PUSH 00529556
00529546|>8D45 F4       LEA EAX,DWORD PTR SS:
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:,EAX
00525B93|.33C0          XOR EAX,EAX
00525B95|.55            PUSH EBP
00525B96|.68 385D5200   PUSH 00525D38
00525B9B|.64:FF30       PUSH DWORD PTR FS:
00525B9E|.64:8920       MOV DWORD PTR FS:,ESP
00525BA1|.C645 FB 00    MOV BYTE PTR SS:,0
00525BA5|.8D45 F4       LEA EAX,DWORD PTR SS:
00525BA8|.8B55 FC       MOV EDX,DWORD PTR SS:
00525BAB|.E8 BCE8EDFF   CALL 0040446C
00525BB0|.8B55 F4       MOV EDX,DWORD PTR SS:
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:
00525BC3|.807D FB 00    CMP BYTE PTR SS:,0
00525BC7|.74 09         JE SHORT 00525BD2
00525BC9|.C645 FB 00    MOV BYTE PTR SS:,0
00525BCD|.E9 0B010000   JMP 00525CDD
00525BD2|>C645 FB 00    MOV BYTE PTR SS:,0
00525BD6|.8B45 FC       MOV EAX,DWORD PTR SS:
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:
00525BEA|.66:8378 08 2D CMP WORD PTR DS:,2D
00525BEF|.0F85 E8000000 JNZ 00525CDD                           ;检验是否按这样的格式输入了注册码xxxx-xxxx-xxxx-xxxx
00525BF5|.8B45 FC       MOV EAX,DWORD PTR SS:
00525BF8|.66:8378 12 2D CMP WORD PTR DS:,2D
00525BFD|.0F85 DA000000 JNZ 00525CDD
00525C03|.8B45 FC       MOV EAX,DWORD PTR SS:
00525C06|.66:8378 1C 2D CMP WORD PTR DS:,2D
00525C0B|.0F85 CC000000 JNZ 00525CDD
00525C11|.8D55 EC       LEA EDX,DWORD PTR SS:
00525C14|.A1 BCB15300   MOV EAX,DWORD PTR DS:
00525C19|.8B00          MOV EAX,DWORD PTR DS:
00525C1B|.E8 14C0F3FF   CALL 00461C34
00525C20|.8B55 EC       MOV EDX,DWORD PTR SS:            ;出现固定字符串
00525C23|.8D45 F0       LEA EAX,DWORD PTR SS:
00525C26|.E8 61EEEDFF   CALL 00404A8C
00525C2B|.8B55 F0       MOV EDX,DWORD PTR SS:            ;这几句比较是否我们输入的是固定字符串
00525C2E|.8B45 FC       MOV EAX,DWORD PTR SS:
00525C31|.E8 8EEFEDFF   CALL 00404BC4
00525C36|.74 30         JE SHORT 00525C68
00525C38|.8D55 E4       LEA EDX,DWORD PTR SS:
00525C3B|.A1 BCB15300   MOV EAX,DWORD PTR DS:
00525C40|.8B00          MOV EAX,DWORD PTR DS:
00525C42|.E8 EDBFF3FF   CALL 00461C34
00525C47|.8B55 E4       MOV EDX,DWORD PTR SS:
00525C4A|.8D45 E8       LEA EAX,DWORD PTR SS:
00525C4D|.E8 3AEEEDFF   CALL 00404A8C
00525C52|.8B45 E8       MOV EAX,DWORD PTR SS:
00525C55|.E8 1EFDFFFF   CALL 00525978                            ;算法call,结果到eax
00525C5A|.8BD8          MOV EBX,EAX                              ;固定字符串计算后的结果到ebx
00525C5C|.8B45 FC       MOV EAX,DWORD PTR SS:             ;假码到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:,AL
00525C71|.8D55 DC       LEA EDX,DWORD PTR SS:
00525C74|.A1 BCB15300   MOV EAX,DWORD PTR DS:
00525C79|.8B00          MOV EAX,DWORD PTR DS:
00525C7B|.E8 B4BFF3FF   CALL 00461C34
00525C80|.8B55 DC       MOV EDX,DWORD PTR SS:
00525C83|.8D45 E0       LEA EAX,DWORD PTR SS:
00525C86|.E8 01EEEDFF   CALL 00404A8C
00525C8B|.8B45 E0       MOV EAX,DWORD PTR SS:
00525C8E|.E8 E5FCFFFF   CALL 00525978
00525C93|.8BD8          MOV EBX,EAX
00525C95|.8B45 FC       MOV EAX,DWORD PTR SS:
00525C98|.E8 DBFCFFFF   CALL 00525978
00525C9D|.3BD8          CMP EBX,EAX
00525C9F|.75 3C         JNZ SHORT 00525CDD
00525CA1|.8D55 D0       LEA EDX,DWORD PTR SS:
00525CA4|.A1 BCB15300   MOV EAX,DWORD PTR DS:
00525CA9|.8B00          MOV EAX,DWORD PTR DS:
00525CAB|.E8 84BFF3FF   CALL 00461C34
00525CB0|.8B55 D0       MOV EDX,DWORD PTR SS:
00525CB3|.8D45 D4       LEA EAX,DWORD PTR SS:
00525CB6|.E8 D1EDEDFF   CALL 00404A8C
00525CBB|.8B45 D4       MOV EAX,DWORD PTR SS:
00525CBE|.8D55 D8       LEA EDX,DWORD PTR SS:
00525CC1|.E8 DAB6FAFF   CALL 004D13A0
00525CC6|.8B55 D8       MOV EDX,DWORD PTR SS:
00525CC9|.8B4D FC       MOV ECX,DWORD PTR SS:
00525CCC|.B8 685D5200   MOV EAX,00525D68                         ;UNICODE "software\ksdev"
00525CD1|.E8 16FDFFFF   CALL 005259EC
00525CD6|.C605 20AE5300>MOV BYTE PTR DS:,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:,EDX
00525CE5|.68 3F5D5200   PUSH 00525D3F
00525CEA|>8D45 D0       LEA EAX,DWORD PTR SS:
00525CED|.E8 F2E4EDFF   CALL 004041E4
00525CF2|.8D45 D4       LEA EAX,DWORD PTR SS:
00525CF5|.BA 02000000   MOV EDX,2
00525CFA|.E8 09ECEDFF   CALL 00404908
00525CFF|.8D45 DC       LEA EAX,DWORD PTR SS:
00525D02|.E8 DDE4EDFF   CALL 004041E4
00525D07|.8D45 E0       LEA EAX,DWORD PTR SS:
00525D0A|.E8 E1EBEDFF   CALL 004048F0
00525D0F|.8D45 E4       LEA EAX,DWORD PTR SS:
00525D12|.E8 CDE4EDFF   CALL 004041E4
00525D17|.8D45 E8       LEA EAX,DWORD PTR SS:
00525D1A|.E8 D1EBEDFF   CALL 004048F0
00525D1F|.8D45 EC       LEA EAX,DWORD PTR SS:
00525D22|.E8 BDE4EDFF   CALL 004041E4
00525D27|.8D45 F0       LEA EAX,DWORD PTR SS:
00525D2A|.E8 C1EBEDFF   CALL 004048F0
00525D2F|.8D45 F4       LEA EAX,DWORD PTR SS:
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:
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:,EAX
00525981|.33C0          XOR EAX,EAX
00525983|.8945 F8       MOV DWORD PTR SS:,EAX
00525986|.8B45 FC       MOV EAX,DWORD PTR SS:             ;取固定字符串"3D Image Commander"
00525989|.E8 1EF1EDFF   CALL 00404AAC                            ;计算位数
0052598E|.8945 F0       MOV DWORD PTR SS:,EAX            ;位数到ebp-10,就是存到堆栈
00525991|.837D F0 0A    CMP DWORD PTR SS:,0A             ;比较是否小于10位
00525995|.7E 07         JLE SHORT 0052599E                     ;小于实现跳转
00525997|.C745 F0 0A000>MOV DWORD PTR SS:,0A             ;大于的话强行把大小赋值为10,即只计算前十位
0052599E|>8B45 F0       MOV EAX,DWORD PTR SS:            ;大小到eax
005259A1|.85C0          TEST EAX,EAX
005259A3|.7E 30         JLE SHORT 005259D5                     ;再看看有没有
005259A5|.8945 EC       MOV DWORD PTR SS:,EAX            ;放到ebp-14里计算
005259A8|.C745 F4 01000>MOV DWORD PTR SS:,1               ;附上一个初始的值。
    //由于初始寄存器都被清空,事实上只取了前9位进行计算,第一次运算可从005259BD开始看
005259AF|>8B45 F8       /MOV EAX,DWORD PTR SS:            ;eax=A
005259B2|.C1E0 02       |SHL EAX,2                               ;A逻辑左移两位
005259B5|.8B55 F8       |MOV EDX,DWORD PTR SS:            ;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:            ;字符串到edx
005259C0|.8B4D F4       |MOV ECX,DWORD PTR SS:            ;初始的值1到ecx
005259C3|.0FB7544A FE   |MOVZX EDX,WORD PTR DS:   ;取第edx+ecx*2-2位,因为是unicode的形式,所以必须取两个字节(word)
005259C8|.33C2          |XOR EAX,EDX                           ;eax与取出的字节做异或运算
005259CA|.8945 F8       |MOV DWORD PTR SS:,EAX            ;eax放到堆栈里保存,设为A
005259CD|.FF45 F4       |INC DWORD PTR SS:                ;初始值+1
005259D0|.FF4D EC       |DEC DWORD PTR SS:               ;位数-1到零即停止运算
005259D3|.^ 75 DA         \JNZ SHORT 005259AF
005259D5|>8B45 F8       MOV EAX,DWORD PTR SS:             ;计算好的数值拉出来。
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:,EDX             ;edx就是真正最后的要求的值,压栈
005259E4|.8B45 F8       MOV EAX,DWORD PTR SS:             ;到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

什么也不是 发表于 2009-10-26 22:23

{:299_842:}
膜拜大牛 作品

热火朝天 发表于 2009-10-26 22:42

嗯,膜拜一下大牛,坐下来慢慢看

我本善良 发表于 2009-10-26 23:10

慢慢看,学习

ZeNiX 发表于 2009-10-27 11:18

雖然沒有注冊机源碼,
但是光看算法分析也覺得很強大.
佩服~~

wuhanqi 发表于 2009-10-27 17:59

5# ZeNiX


老Z。你饶了我吧。我这个后辈还差很多呢。。

a2213572 发表于 2009-11-6 00:52

感謝大大詳細的分析教學.

落雪飞花 发表于 2011-2-10 19:14

不错!收藏了!
页: [1]
查看完整版本: Binerus 3D Image Commander算法分析