感谢guantao兄弟送的正式版安装程序, 昨天网络出现故障, 所以来分析下该软件的注册思路. 由于软件明码, 本文简单分析下软件的注册算法, 重点放在如何暴破思路上, 同时也是对该软件注册验证方式的一个剖析.

原版网上没有下载, 对该软件有兴趣的朋友可以到我的网盘http://nisy.ys168.com/下载已打包好的文件, 脱壳后即可调试. 小Q由于某些原因进期可能无法常来上网, 怀念前些天一起调试屏录的时光, 写此文以示怀念.

软件压缩壳,我们带壳调试, 找到软件算法验证的地址下断运行:


0050B43D    51              PUSH ECX                                 ; 软件注册部分 我们再这里下断点
0050B43E    51              PUSH ECX
0050B43F    51              PUSH ECX
0050B440    51              PUSH ECX
0050B441    53              PUSH EBX
0050B442    8BD8            MOV EBX,EAX
0050B444    33C0            XOR EAX,EAX
0050B446    55              PUSH EBP
0050B447    68 1CB55000     PUSH folderlo.0050B51C
0050B44C    64:FF30         PUSH DWORD PTR FS:[EAX]
0050B44F    64:8920         MOV DWORD PTR FS:[EAX],ESP
0050B452    8D55 F8         LEA EDX,DWORD PTR SS:[EBP-8]
0050B455    8B83 D4040000   MOV EAX,DWORD PTR DS:[EBX+4D4]
0050B45B    E8 DCA5F3FF     CALL folderlo.00445A3C
0050B460    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
0050B463    50              PUSH EAX
0050B464    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
0050B467    8B83 E8040000   MOV EAX,DWORD PTR DS:[EBX+4E8]
0050B46D    E8 CAA5F3FF     CALL folderlo.00445A3C
0050B472    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
0050B475    50              PUSH EAX
0050B476    8D55 F0         LEA EDX,DWORD PTR SS:[EBP-10]
0050B479    8B83 C8040000   MOV EAX,DWORD PTR DS:[EBX+4C8]
0050B47F    E8 B8A5F3FF     CALL folderlo.00445A3C
0050B484    8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]            ; [EBP-10]中存放我们输入的用户名
0050B487    8B83 E4040000   MOV EAX,DWORD PTR DS:[EBX+4E4]
0050B48D    59              POP ECX
0050B48E    E8 01A5FEFF     CALL folderlo.004F5994                   ; 软件注册验证的关键CALL F7跟进
0050B493    84C0            TEST AL,AL
0050B495    75 2C           JNZ SHORT folderlo.0050B4C3
0050B497    8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
0050B49A    BA 30B55000     MOV EDX,folderlo.0050B530                ; 【提示信息】:未输入注册码或者输入的注册码不正确,请重新输入或者与软件供应商联系!
0050B49F    E8 8096EFFF     CALL folderlo.00404B24
0050B4A4    6A 40           PUSH 40
0050B4A6    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
0050B4A9    E8 8E9AEFFF     CALL folderlo.00404F3C
0050B4AE    8BD0            MOV EDX,EAX
0050B4B0    B9 84B55000     MOV ECX,folderlo.0050B584                ; 提示信息
0050B4B5    A1 B4035100     MOV EAX,DWORD PTR DS:[5103B4]
0050B4BA    8B00            MOV EAX,DWORD PTR DS:[EAX]
0050B4BC    E8 83B4F5FF     CALL folderlo.00466944
0050B4C1    EB 36           JMP SHORT folderlo.0050B4F9
0050B4C3    8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
0050B4C6    BA 98B55000     MOV EDX,folderlo.0050B598                ; 请重新启动软件以验证注册码!\n感谢您对我们的支持,我们将为您提供终身免费升级。
0050B4CB    E8 5496EFFF     CALL folderlo.00404B24
0050B4D0    6A 40           PUSH 40
0050B4D2    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
0050B4D5    E8 629AEFFF     CALL folderlo.00404F3C
0050B4DA    8BD0            MOV EDX,EAX
0050B4DC    B9 84B55000     MOV ECX,folderlo.0050B584                ; 提示信息

我们F7跟进软件注册验证的关键Call 004F5994

004F5994    55              PUSH EBP
004F5995    8BEC            MOV EBP,ESP
004F5997    83C4 F0         ADD ESP,-10
004F599A    53              PUSH EBX
004F599B    33DB            XOR EBX,EBX
004F599D    895D F0         MOV DWORD PTR SS:[EBP-10],EBX
004F59A0    895D F4         MOV DWORD PTR SS:[EBP-C],EBX
004F59A3    894D F8         MOV DWORD PTR SS:[EBP-8],ECX
004F59A6    8955 FC         MOV DWORD PTR SS:[EBP-4],EDX
004F59A9    8BD8            MOV EBX,EAX
004F59AB    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F59AE    E8 79F5F0FF     CALL folderlo.00404F2C
004F59B3    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
004F59B6    E8 71F5F0FF     CALL folderlo.00404F2C
004F59BB    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
004F59BE    E8 69F5F0FF     CALL folderlo.00404F2C
004F59C3    33C0            XOR EAX,EAX
004F59C5    55              PUSH EBP
004F59C6    68 7E5A4F00     PUSH folderlo.004F5A7E
004F59CB    64:FF30         PUSH DWORD PTR FS:[EAX]
004F59CE    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F59D1    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F59D4    E8 6BF3F0FF     CALL folderlo.00404D44
004F59D9    3B43 4C         CMP EAX,DWORD PTR DS:[EBX+4C]
004F59DC    7F 19           JG SHORT folderlo.004F59F7
004F59DE    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F59E1    E8 5EF3F0FF     CALL folderlo.00404D44
004F59E6    3B43 50         CMP EAX,DWORD PTR DS:[EBX+50]            ; 测试用户名的长度
004F59E9    7C 0C           JL SHORT folderlo.004F59F7
004F59EB    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]             ; 测试第二组KEY的长度
004F59EE    E8 51F3F0FF     CALL folderlo.00404D44
004F59F3    85C0            TEST EAX,EAX
004F59F5    75 04           JNZ SHORT folderlo.004F59FB
004F59F7    33DB            XOR EBX,EBX
004F59F9    EB 60           JMP SHORT folderlo.004F5A5B
004F59FB    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
004F59FE    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
004F5A01    E8 DE37F1FF     CALL folderlo.004091E4                   ; 将注册码中的小写字母转化为大写
004F5A06    8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]
004F5A09    8D45 08         LEA EAX,DWORD PTR SS:[EBP+8]
004F5A0C    E8 13F1F0FF     CALL folderlo.00404B24
004F5A11    8D4D F0         LEA ECX,DWORD PTR SS:[EBP-10]
004F5A14    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004F5A17    8BC3            MOV EAX,EBX
004F5A19    E8 BAFBFFFF     CALL folderlo.004F55D8                   ; 这里是算法CALL
004F5A1E    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]            ; 真码
004F5A21    8B55 F0         MOV EDX,DWORD PTR SS:[EBP+8]             ; 假码
004F5A24    E8 3338F1FF     CALL folderlo.0040925C
004F5A29    85C0            TEST EAX,EAX
004F5A2B    74 04           JE SHORT folderlo.004F5A31               ; 过第一关
004F5A2D    33DB            XOR EBX,EBX
004F5A2F    EB 2A           JMP SHORT folderlo.004F5A5B
004F5A31    8D43 48         LEA EAX,DWORD PTR DS:[EBX+48]
004F5A34    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004F5A37    E8 A4F0F0FF     CALL folderlo.00404AE0
004F5A3C    8D43 54         LEA EAX,DWORD PTR DS:[EBX+54]
004F5A3F    8B55 F8         MOV EDX,DWORD PTR SS:[EBP-8]
004F5A42    E8 99F0F0FF     CALL folderlo.00404AE0
004F5A47    8D43 5C         LEA EAX,DWORD PTR DS:[EBX+5C]
004F5A4A    8B55 F0         MOV EDX,DWORD PTR SS:[EBP+8]             ; 这里又将假码送EDX
004F5A4D    E8 8EF0F0FF     CALL folderlo.00404AE0
004F5A52    8BC3            MOV EAX,EBX
004F5A54    E8 DF010000     CALL folderlo.004F5C38                   ; 跟进这个CALL 还有一处对KEY的验证
004F5A59    B3 01           MOV BL,1
004F5A5B    33C0            XOR EAX,EAX
004F5A5D    5A              POP EDX
004F5A5E    59              POP ECX
004F5A5F    59              POP ECX
004F5A60    64:8910         MOV DWORD PTR FS:[EAX],EDX
004F5A63    68 855A4F00     PUSH folderlo.004F5A85
004F5A68    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
004F5A6B    BA 04000000     MOV EDX,4
004F5A70    E8 3BF0F0FF     CALL folderlo.00404AB0
004F5A75    8D45 08         LEA EAX,DWORD PTR SS:[EBP+8]
004F5A78    E8 0FF0F0FF     CALL folderlo.00404A8C
004F5A7D    C3              RETN
004F5A7E  ^ E9 A9E8F0FF     JMP folderlo.0040432C
004F5A83  ^ EB E3           JMP SHORT folderlo.004F5A68
004F5A85    8BC3            MOV EAX,EBX
004F5A87    5B              POP EBX
004F5A88    8BE5            MOV ESP,EBP
004F5A8A    5D              POP EBP
004F5A8B    C2 0400         RETN 4

我们F7跟进软件的算法CALL

004F55D8    55              PUSH EBP                                 ; 软件算法CALL部分
004F55D9    8BEC            MOV EBP,ESP
004F55DB    83C4 E0         ADD ESP,-20
004F55DE    53              PUSH EBX
004F55DF    56              PUSH ESI
004F55E0    57              PUSH EDI
004F55E1    33DB            XOR EBX,EBX
004F55E3    895D EC         MOV DWORD PTR SS:[EBP-14],EBX
004F55E6    895D E8         MOV DWORD PTR SS:[EBP-18],EBX
004F55E9    895D E4         MOV DWORD PTR SS:[EBP-1C],EBX
004F55EC    895D E0         MOV DWORD PTR SS:[EBP-20],EBX
004F55EF    8BF9            MOV EDI,ECX
004F55F1    8955 FC         MOV DWORD PTR SS:[EBP-4],EDX
004F55F4    8BF0            MOV ESI,EAX
004F55F6    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F55F9    E8 2EF9F0FF     CALL folderlo.00404F2C
004F55FE    33C0            XOR EAX,EAX
004F5600    55              PUSH EBP
004F5601    68 71574F00     PUSH folderlo.004F5771
004F5606    64:FF30         PUSH DWORD PTR FS:[EAX]
004F5609    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F560C    8D45 EC         LEA EAX,DWORD PTR SS:[EBP-14]
004F560F    BA 88574F00     MOV EDX,folderlo.004F5788                ; 固定字符串:gf258369gf
004F5614    E8 0BF5F0FF     CALL folderlo.00404B24
004F5619    837D EC 00      CMP DWORD PTR SS:[EBP-14],0
004F561D    75 0D           JNZ SHORT folderlo.004F562C
004F561F    8D45 E0         LEA EAX,DWORD PTR SS:[EBP-20]
004F5622    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004F5625    E8 FAF4F0FF     CALL folderlo.00404B24
004F562A    EB 5D           JMP SHORT folderlo.004F5689
004F562C    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
004F562F    E8 10F7F0FF     CALL folderlo.00404D44
004F5634    8BD8            MOV EBX,EAX                              ; 长度A放EBX
004F5636    8D45 E8         LEA EAX,DWORD PTR SS:[EBP-18]
004F5639    50              PUSH EAX
004F563A    8BCB            MOV ECX,EBX
004F563C    D1F9            SAR ECX,1
004F563E    79 03           JNS SHORT folderlo.004F5643
004F5640    83D1 00         ADC ECX,0
004F5643    BA 01000000     MOV EDX,1
004F5648    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
004F564B    E8 4CF9F0FF     CALL folderlo.00404F9C
004F5650    8D45 E4         LEA EAX,DWORD PTR SS:[EBP-1C]
004F5653    50              PUSH EAX
004F5654    8BC3            MOV EAX,EBX
004F5656    D1F8            SAR EAX,1
004F5658    79 03           JNS SHORT folderlo.004F565D
004F565A    83D0 00         ADC EAX,0
004F565D    8BCB            MOV ECX,EBX
004F565F    2BC8            SUB ECX,EAX
004F5661    8BD3            MOV EDX,EBX
004F5663    D1FA            SAR EDX,1
004F5665    79 03           JNS SHORT folderlo.004F566A
004F5667    83D2 00         ADC EDX,0
004F566A    42              INC EDX
004F566B    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
004F566E    E8 29F9F0FF     CALL folderlo.00404F9C
004F5673    FF75 E8         PUSH DWORD PTR SS:[EBP-18]               ; 固定值前5位进栈
004F5676    FF75 FC         PUSH DWORD PTR SS:[EBP-4]                ; 用户名进栈
004F5679    FF75 E4         PUSH DWORD PTR SS:[EBP-1C]               ; 固定值后5位进栈
004F567C    8D45 E0         LEA EAX,DWORD PTR SS:[EBP-20]
004F567F    BA 03000000     MOV EDX,3
004F5684    E8 7BF7F0FF     CALL folderlo.00404E04
004F5689    C745 F0 0000000>MOV DWORD PTR SS:[EBP-10],0              ; 拼接(将用户名连接在固定字符串中间)
004F5690    C745 F4 0000000>MOV DWORD PTR SS:[EBP-C],0
004F5697    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F569A    E8 A5F6F0FF     CALL folderlo.00404D44
004F569F    3B46 4C         CMP EAX,DWORD PTR DS:[ESI+4C]
004F56A2    7F 0D           JG SHORT folderlo.004F56B1               ; 用户名小于63H
004F56A4    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F56A7    E8 98F6F0FF     CALL folderlo.00404D44
004F56AC    3B46 50         CMP EAX,DWORD PTR DS:[ESI+50]
004F56AF    7D 0C           JGE SHORT folderlo.004F56BD              ; 用户名要大于3
004F56B1    8BC7            MOV EAX,EDI
004F56B3    E8 D4F3F0FF     CALL folderlo.00404A8C
004F56B8    E9 91000000     JMP folderlo.004F574E
004F56BD    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]
004F56C0    E8 7FF6F0FF     CALL folderlo.00404D44
004F56C5    8BD8            MOV EBX,EAX
004F56C7    EB 37           JMP SHORT folderlo.004F5700
004F56C9    8B46 68         MOV EAX,DWORD PTR DS:[ESI+68]            ; 算法从这里开始 赋给EAX初试值=06192A89
004F56CC    8B56 6C         MOV EDX,DWORD PTR DS:[ESI+6C]
004F56CF    0345 F0         ADD EAX,DWORD PTR SS:[EBP-10]            ; 加法  初试值=0
004F56D2    1355 F4         ADC EDX,DWORD PTR SS:[EBP-C]             ; 带进位加法
004F56D5    52              PUSH EDX
004F56D6    50              PUSH EAX
004F56D7    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]            ; 将固定字符串地址放EAX中
004F56DA    0FB64418 FF     MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]        ; 先扩展 后传送
004F56DF    50              PUSH EAX
004F56E0    B8 59040000     MOV EAX,459
004F56E5    5A              POP EDX                                  ; 将该字符的ASCII码数值放EDX中
004F56E6    8BCA            MOV ECX,EDX                              ; 放ECX中当除数
004F56E8    33D2            XOR EDX,EDX
004F56EA    F7F1            DIV ECX
004F56EC    8BC2            MOV EAX,EDX                              ; 将余数放EAX中
004F56EE    33D2            XOR EDX,EDX                              ; EDX清0
004F56F0    290424          SUB DWORD PTR SS:[ESP],EAX               ; ESP中数据-余数
004F56F3    195424 04       SBB DWORD PTR SS:[ESP+4],EDX             ; 带借位的减法
004F56F7    58              POP EAX
004F56F8    5A              POP EDX
004F56F9    8945 F0         MOV DWORD PTR SS:[EBP-10],EAX            ; EAX放EBP-10
004F56FC    8955 F4         MOV DWORD PTR SS:[EBP-C],EDX
004F56FF    4B              DEC EBX                                  ; EDC EBX EBX的数值来自这里
004F5700    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]            ; 将字符串地址放EAX
004F5703    E8 3CF6F0FF     CALL folderlo.00404D44                   ; 测试下长度
004F5708    3BD8            CMP EBX,EAX                              ; 长度比较
004F570A    7F 04           JG SHORT folderlo.004F5710
004F570C    85DB            TEST EBX,EBX
004F570E  ^ 7F B9           JG SHORT folderlo.004F56C9               ; 大于0则继续循环
004F5710    8B5E 60         MOV EBX,DWORD PTR DS:[ESI+60]            ; [ESI+60] 这里是A
004F5713    85DB            TEST EBX,EBX
004F5715    7F 11           JG SHORT folderlo.004F5728
004F5717    FF75 F4         PUSH DWORD PTR SS:[EBP-C]
004F571A    FF75 F0         PUSH DWORD PTR SS:[EBP-10]
004F571D    8BD7            MOV EDX,EDI
004F571F    33C0            XOR EAX,EAX
004F5721    E8 8E40F1FF     CALL folderlo.004097B4
004F5726    EB 26           JMP SHORT folderlo.004F574E
004F5728    FF75 F4         PUSH DWORD PTR SS:[EBP-C]
004F572B    FF75 F0         PUSH DWORD PTR SS:[EBP-10]
004F572E    8BD7            MOV EDX,EDI
004F5730    8BC3            MOV EAX,EBX                              ; EAX 和 EBX 都成为A
004F5732    E8 7D40F1FF     CALL folderlo.004097B4                   ; 这个CALL 取计算结果的后10位  限与文章篇幅 这里就不跟入了
004F5737    8B07            MOV EAX,DWORD PTR DS:[EDI]               ; 这里返回数值了 [EDI]中
004F5739    E8 06F6F0FF     CALL folderlo.00404D44
004F573E    8BC8            MOV ECX,EAX
004F5740    2B4E 60         SUB ECX,DWORD PTR DS:[ESI+60]
004F5743    8B56 60         MOV EDX,DWORD PTR DS:[ESI+60]
004F5746    42              INC EDX
004F5747    8BC7            MOV EAX,EDI
004F5749    E8 8EF8F0FF     CALL folderlo.00404FDC
004F574E    33C0            XOR EAX,EAX
004F5750    5A              POP EDX
004F5751    59              POP ECX
004F5752    59              POP ECX
004F5753    64:8910         MOV DWORD PTR FS:[EAX],EDX
004F5756    68 78574F00     PUSH folderlo.004F5778
004F575B    8D45 E0         LEA EAX,DWORD PTR SS:[EBP-20]
004F575E    BA 04000000     MOV EDX,4
004F5763    E8 48F3F0FF     CALL folderlo.00404AB0
004F5768    8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
004F576B    E8 1CF3F0FF     CALL folderlo.00404A8C
004F5770    C3              RETN
004F5771  ^ E9 B6EBF0FF     JMP folderlo.0040432C
004F5776  ^ EB E3           JMP SHORT folderlo.004F575B
004F5778    5F              POP EDI
004F5779    5E              POP ESI
004F577A    5B              POP EBX
004F577B    8BE5            MOV ESP,EBP
004F577D    5D              POP EBP
004F577E    C3              RETN



到此,软件的算法已经完成,算法如下:

取固定字符串:gf258369gf;
取用户名:XXXX;
拼接新成新字符串A:gf258XXXX369gf,长度记做e;
取数值B:06192A89H (这里没跟踪是否是固定值,感觉应该是的);
取固定数值C:459H;
依次(从后向前取)取字符串A每一位的ASCII数值记作i;求余数做以下的循环:

循环简单的用C描述:

char i;
int a;
long int b=0X6192A89,f;
for(a=e,a>=0,a--)
 {
  f=0X6192A89 - 0X459 % i;
  b+=f;
  }

此时求得B,转化为十六进制数值取其低十位为软件的注册码。 我们这里重点研究暴破,故算法不再详叙。

我们重点研究暴破,我们这里使用暴破的思路就是让软件将真码保存到系统中,我们退出算法CALL后来到这里:

004F5A19    E8 BAFBFFFF     CALL folderlo.004F55D8                   ; 这里是算法CALL
004F5A1E    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]            ; 真码
004F5A21    8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]            ; 假码 // 这里修改为:MOV EAX,DWORD PTR SS:[EBP-10]
004F5A24    E8 3338F1FF     CALL folderlo.0040925C
004F5A29    85C0            TEST EAX,EAX
004F5A2B    74 04           JE SHORT folderlo.004F5A31               ; 过第一关
004F5A2D    33DB            XOR EBX,EBX
004F5A2F    EB 2A           JMP SHORT folderlo.004F5A5B
004F5A31    8D43 48         LEA EAX,DWORD PTR DS:[EBX+48]
004F5A34    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004F5A37    E8 A4F0F0FF     CALL folderlo.00404AE0
004F5A3C    8D43 54         LEA EAX,DWORD PTR DS:[EBX+54]
004F5A3F    8B55 F8         MOV EDX,DWORD PTR SS:[EBP-8]
004F5A42    E8 99F0F0FF     CALL folderlo.00404AE0
004F5A47    8D43 5C         LEA EAX,DWORD PTR DS:[EBX+5C]
004F5A4A    8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]            ; 这里又将假码送EDX // 注意这里
004F5A4D    E8 8EF0F0FF     CALL folderlo.00404AE0
004F5A52    8BC3            MOV EAX,EBX
004F5A54    E8 DF010000     CALL folderlo.004F5C38                   ; 跟进这个CALL 还有一处对KEY的验证


注意这里:

004F5A4A    8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]            ; 这里又将假码送EDX // 

我们将软件经过算法CALL之后,将返回的真码放在了我们输入信息的地址,但此时软件还没有将真码保存到系统,
我们又发现这里调用了我们的假码:004F5A4A MOV EDX,DWORD PTR SS:[EBP-10]
经过跟踪下方的CALL,了解到软件在保存注册信息时又调用了算法部分对注册信息做了一次验证,我们跟进 CALL 004F5C38 


004F5C38    55              PUSH EBP
004F5C39    8BEC            MOV EBP,ESP
004F5C3B    81C4 34FDFFFF   ADD ESP,-2CC
004F5C41    53              PUSH EBX
004F5C42    56              PUSH ESI
004F5C43    57              PUSH EDI
004F5C44    33D2            XOR EDX,EDX
004F5C46    8995 34FEFFFF   MOV DWORD PTR SS:[EBP-1CC],EDX
004F5C4C    8BD8            MOV EBX,EAX
004F5C4E    33C0            XOR EAX,EAX
004F5C50    55              PUSH EBP
004F5C51    68 DE5D4F00     PUSH folderlo.004F5DDE
004F5C56    64:FF30         PUSH DWORD PTR FS:[EAX]
004F5C59    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F5C5C    8B43 58         MOV EAX,DWORD PTR DS:[EBX+58]
004F5C5F    E8 28F8FFFF     CALL folderlo.004F548C
004F5C64    84C0            TEST AL,AL
004F5C66    0F84 59010000   JE folderlo.004F5DC5
004F5C6C    B2 01           MOV DL,1
004F5C6E    A1 94C54600     MOV EAX,DWORD PTR DS:[46C594]
004F5C73    E8 1C6AF7FF     CALL folderlo.0046C694
004F5C78    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
004F5C7B    33C0            XOR EAX,EAX
004F5C7D    55              PUSH EBP
004F5C7E    68 BE5D4F00     PUSH folderlo.004F5DBE
004F5C83    64:FF30         PUSH DWORD PTR FS:[EAX]
004F5C86    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F5C89    BA 02000080     MOV EDX,80000002
004F5C8E    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F5C91    E8 9E6AF7FF     CALL folderlo.0046C734
004F5C96    68 F45D4F00     PUSH folderlo.004F5DF4                   ; \software\classes\clsid\
004F5C9B    FF73 58         PUSH DWORD PTR DS:[EBX+58]
004F5C9E    68 185E4F00     PUSH folderlo.004F5E18                   ; \inprocserver32
004F5CA3    8D85 34FEFFFF   LEA EAX,DWORD PTR SS:[EBP-1CC]
004F5CA9    BA 03000000     MOV EDX,3
004F5CAE    E8 51F1F0FF     CALL folderlo.00404E04
004F5CB3    8B95 34FEFFFF   MOV EDX,DWORD PTR SS:[EBP-1CC]
004F5CB9    B1 01           MOV CL,1
004F5CBB    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F5CBE    E8 B56BF7FF     CALL folderlo.0046C878
004F5CC3    8D85 34FDFFFF   LEA EAX,DWORD PTR SS:[EBP-2CC]
004F5CC9    8B53 48         MOV EDX,DWORD PTR DS:[EBX+48]
004F5CCC    B9 FF000000     MOV ECX,0FF
004F5CD1    E8 4AF0F0FF     CALL folderlo.00404D20
004F5CD6    8D95 34FDFFFF   LEA EDX,DWORD PTR SS:[EBP-2CC]
004F5CDC    8D85 38FEFFFF   LEA EAX,DWORD PTR SS:[EBP-1C8]
004F5CE2    B1 64           MOV CL,64
004F5CE4    E8 0FD4F0FF     CALL folderlo.004030F8
004F5CE9    8D85 34FDFFFF   LEA EAX,DWORD PTR SS:[EBP-2CC]
004F5CEF    8B53 54         MOV EDX,DWORD PTR DS:[EBX+54]
004F5CF2    B9 FF000000     MOV ECX,0FF
004F5CF7    E8 24F0F0FF     CALL folderlo.00404D20
004F5CFC    8D95 34FDFFFF   LEA EDX,DWORD PTR SS:[EBP-2CC]
004F5D02    8D85 9DFEFFFF   LEA EAX,DWORD PTR SS:[EBP-163]
004F5D08    B1 64           MOV CL,64
004F5D0A    E8 E9D3F0FF     CALL folderlo.004030F8
004F5D0F    8D85 34FDFFFF   LEA EAX,DWORD PTR SS:[EBP-2CC]
004F5D15    8B53 5C         MOV EDX,DWORD PTR DS:[EBX+5C]
004F5D18    B9 FF000000     MOV ECX,0FF
004F5D1D    E8 FEEFF0FF     CALL folderlo.00404D20
004F5D22    8D95 34FDFFFF   LEA EDX,DWORD PTR SS:[EBP-2CC]
004F5D28    8D85 02FFFFFF   LEA EAX,DWORD PTR SS:[EBP-FE]
004F5D2E    B1 64           MOV CL,64
004F5D30    E8 C3D3F0FF     CALL folderlo.004030F8
004F5D35    BE 285E4F00     MOV ESI,folderlo.004F5E28                ; ASCII 04,"2.00"
004F5D3A    8D7D CC         LEA EDI,DWORD PTR SS:[EBP-34]
004F5D3D    A5              MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>
004F5D3E    A4              MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
004F5D3F    8BC3            MOV EAX,EBX
004F5D41    E8 8AF8FFFF     CALL folderlo.004F55D0                   ; 这里又调用软件的算法CALL进行验证
004F5D46    84C0            TEST AL,AL
004F5D48    75 31           JNZ SHORT folderlo.004F5D7B
004F5D4A    8B43 40         MOV EAX,DWORD PTR DS:[EBX+40]
004F5D4D    8945 E8         MOV DWORD PTR SS:[EBP-18],EAX
004F5D50    8B43 44         MOV EAX,DWORD PTR DS:[EBX+44]
004F5D53    8945 EC         MOV DWORD PTR SS:[EBP-14],EAX
004F5D56    8BC3            MOV EAX,EBX
004F5D58    E8 73FEFFFF     CALL folderlo.004F5BD0
004F5D5D    84C0            TEST AL,AL
004F5D5F    75 12           JNZ SHORT folderlo.004F5D73
004F5D61    E8 3E59F1FF     CALL folderlo.0040B6A4
004F5D66    DC6D E8         FSUBR QWORD PTR SS:[EBP-18]
004F5D69    E8 32CFF0FF     CALL folderlo.00402CA0
004F5D6E    8945 D8         MOV DWORD PTR SS:[EBP-28],EAX
004F5D71    EB 15           JMP SHORT folderlo.004F5D88
004F5D73    8B43 38         MOV EAX,DWORD PTR DS:[EBX+38]
004F5D76    8945 D8         MOV DWORD PTR SS:[EBP-28],EAX
004F5D79    EB 0D           JMP SHORT folderlo.004F5D88
004F5D7B    33C0            XOR EAX,EAX
004F5D7D    8945 E8         MOV DWORD PTR SS:[EBP-18],EAX
004F5D80    8945 EC         MOV DWORD PTR SS:[EBP-14],EAX
004F5D83    33C0            XOR EAX,EAX
004F5D85    8945 D8         MOV DWORD PTR SS:[EBP-28],EAX
004F5D88    68 C0010000     PUSH 1C0
004F5D8D    8D8D 38FEFFFF   LEA ECX,DWORD PTR SS:[EBP-1C8]
004F5D93    BA 385E4F00     MOV EDX,folderlo.004F5E38                ; threadingmodel
004F5D98    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F5D9B    E8 0070F7FF     CALL folderlo.0046CDA0
004F5DA0    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F5DA3    E8 5C69F7FF     CALL folderlo.0046C704
004F5DA8    33C0            XOR EAX,EAX
004F5DAA    5A              POP EDX
004F5DAB    59              POP ECX
004F5DAC    59              POP ECX
004F5DAD    64:8910         MOV DWORD PTR FS:[EAX],EDX
004F5DB0    68 C55D4F00     PUSH folderlo.004F5DC5
004F5DB5    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004F5DB8    E8 DBDDF0FF     CALL folderlo.00403B98
004F5DBD    C3              RETN
004F5DBE  ^ E9 69E5F0FF     JMP folderlo.0040432C
004F5DC3  ^ EB F0           JMP SHORT folderlo.004F5DB5
004F5DC5    33C0            XOR EAX,EAX
004F5DC7    5A              POP EDX
004F5DC8    59              POP ECX
004F5DC9    59              POP ECX
004F5DCA    64:8910         MOV DWORD PTR FS:[EAX],EDX
004F5DCD    68 E55D4F00     PUSH folderlo.004F5DE5
004F5DD2    8D85 34FEFFFF   LEA EAX,DWORD PTR SS:[EBP-1CC]
004F5DD8    E8 AFECF0FF     CALL folderlo.00404A8C
004F5DDD    C3              RETN
004F5DDE  ^ E9 49E5F0FF     JMP folderlo.0040432C
004F5DE3  ^ EB ED           JMP SHORT folderlo.004F5DD2
004F5DE5    5F              POP EDI
004F5DE6    5E              POP ESI
004F5DE7    5B              POP EBX
004F5DE8    8BE5            MOV ESP,EBP
004F5DEA    5D              POP EBP
004F5DEB    C3              RETN


我们F7跟进该函数调用软件算法CALL部分:

004F55D0    E8 D7010000     CALL folderlo.004F57AC               // F7跟进
004F55D5    C3              RETN

以下这个函数系统将多次调用到,包括软件启动时候的对是否注册的验证也在此处进行:

004F57AC    55              PUSH EBP
004F57AD    8BEC            MOV EBP,ESP
004F57AF    6A 00           PUSH 0
004F57B1    53              PUSH EBX
004F57B2    56              PUSH ESI
004F57B3    8BF0            MOV ESI,EAX
004F57B5    33C0            XOR EAX,EAX
004F57B7    55              PUSH EBP
004F57B8    68 23584F00     PUSH folderlo.004F5823
004F57BD    64:FF30         PUSH DWORD PTR FS:[EAX]
004F57C0    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F57C3    837E 5C 00      CMP DWORD PTR DS:[ESI+5C],0
004F57C7    74 42           JE SHORT folderlo.004F580B
004F57C9    837E 48 00      CMP DWORD PTR DS:[ESI+48],0
004F57CD    74 3C           JE SHORT folderlo.004F580B
004F57CF    8D4D FC         LEA ECX,DWORD PTR SS:[EBP-4]
004F57D2    8B56 48         MOV EDX,DWORD PTR DS:[ESI+48]
004F57D5    8BC6            MOV EAX,ESI
004F57D7    E8 FCFDFFFF     CALL folderlo.004F55D8                   ; 这里是跟进算法CALL
004F57DC    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]             ; 真码
004F57DF    8B46 5C         MOV EAX,DWORD PTR DS:[ESI+5C]            ; 输出软件的假码    // 所以第二处修改就在这里
004F57E2    E8 753AF1FF     CALL folderlo.0040925C
004F57E7    85C0            TEST EAX,EAX
004F57E9    75 04           JNZ SHORT folderlo.004F57EF
004F57EB    B3 01           MOV BL,1
004F57ED    EB 1E           JMP SHORT folderlo.004F580D
004F57EF    33DB            XOR EBX,EBX
004F57F1    8D46 5C         LEA EAX,DWORD PTR DS:[ESI+5C]
004F57F4    E8 93F2F0FF     CALL folderlo.00404A8C
004F57F9    8D46 48         LEA EAX,DWORD PTR DS:[ESI+48]
004F57FC    E8 8BF2F0FF     CALL folderlo.00404A8C
004F5801    8D46 54         LEA EAX,DWORD PTR DS:[ESI+54]
004F5804    E8 83F2F0FF     CALL folderlo.00404A8C
004F5809    EB 02           JMP SHORT folderlo.004F580D
004F580B    33DB            XOR EBX,EBX
004F580D    33C0            XOR EAX,EAX
004F580F    5A              POP EDX
004F5810    59              POP ECX
004F5811    59              POP ECX
004F5812    64:8910         MOV DWORD PTR FS:[EAX],EDX
004F5815    68 2A584F00     PUSH folderlo.004F582A
004F581A    8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
004F581D    E8 6AF2F0FF     CALL folderlo.00404A8C
004F5822    C3              RETN
004F5823  ^ E9 04EBF0FF     JMP folderlo.0040432C
004F5828  ^ EB F0           JMP SHORT folderlo.004F581A
004F582A    8BC3            MOV EAX,EBX
004F582C    5E              POP ESI
004F582D    5B              POP EBX
004F582E    59              POP ECX
004F582F    5D              POP EBP
004F5830    C3              RETN


到此,我们找到了软件保存注册信息时的另一处验证,即做如下修改:
004F57DC    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]             ; 真码
004F57DF    8B46 5C         MOV EAX,DWORD PTR DS:[ESI+5C]          // 修改为:MOV EAX,DWORD PTR SS:[EBP-4] 

当然,我们还可以在软件保存注册信息前调用假码的地方做手脚:

即:

004F5A4A    8B55 F0         MOV EDX,DWORD PTR SS:[EBP+8]        //第二处也可以这样修改:MOV EDX,DWORD PTR SS:[EBP-10]

以上两种方法完成了软件注册时的暴破,软件将信息保存在这里:
HKEY_CURRENT_USER\Software\Classes\CLSID\{F651E1F4-2FEA-127E-9C00-E7629AD7E099}\InprocServer32
但是删除此注册表信息后仍然后注册版,莫非做了多处存放???哪位兄弟知道答案后还望赐教。


软件将正确注册信息保存后,重启时一定也会对注册信息做一个验证,于是我们暴破的思路二就出来了。
我们在软件真正的算法CALL地址处下断:004F55D8。然后运行,发现软件从算法CALL返回后来到这个函数:

004F57AC    55              PUSH EBP
004F57AD    8BEC            MOV EBP,ESP
004F57AF    6A 00           PUSH 0
004F57B1    53              PUSH EBX
004F57B2    56              PUSH ESI
004F57B3    8BF0            MOV ESI,EAX
004F57B5    33C0            XOR EAX,EAX
004F57B7    55              PUSH EBP
004F57B8    68 23584F00     PUSH folderlo.004F5823
004F57BD    64:FF30         PUSH DWORD PTR FS:[EAX]
004F57C0    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F57C3    837E 5C 00      CMP DWORD PTR DS:[ESI+5C],0
004F57C7    74 42           JE SHORT folderlo.004F580B               ; 这两个JE,是判断是否有保存注册信息 我们都NOP掉
004F57C9    837E 48 00      CMP DWORD PTR DS:[ESI+48],0
004F57CD    74 3C           JE SHORT folderlo.004F580B
004F57CF    8D4D FC         LEA ECX,DWORD PTR SS:[EBP-4]
004F57D2    8B56 48         MOV EDX,DWORD PTR DS:[ESI+48]
004F57D5    8BC6            MOV EAX,ESI
004F57D7    E8 FCFDFFFF     CALL folderlo.004F55D8                   ; 这里是跟进算法CALL
004F57DC    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]             ; 真码
004F57DF    8B46 5C         MOV EAX,DWORD PTR DS:[ESI+5C]            ; 假码  // 爆破点 在这里用真码对EAX赋值
004F57E2    E8 753AF1FF     CALL folderlo.0040925C
004F57E7    85C0            TEST EAX,EAX
004F57E9    75 04           JNZ SHORT folderlo.004F57EF
004F57EB    B3 01           MOV BL,1
004F57ED    EB 1E           JMP SHORT folderlo.004F580D
004F57EF    33DB            XOR EBX,EBX
004F57F1    8D46 5C         LEA EAX,DWORD PTR DS:[ESI+5C]
004F57F4    E8 93F2F0FF     CALL folderlo.00404A8C
004F57F9    8D46 48         LEA EAX,DWORD PTR DS:[ESI+48]
004F57FC    E8 8BF2F0FF     CALL folderlo.00404A8C
004F5801    8D46 54         LEA EAX,DWORD PTR DS:[ESI+54]
004F5804    E8 83F2F0FF     CALL folderlo.00404A8C
004F5809    EB 02           JMP SHORT folderlo.004F580D
004F580B    33DB            XOR EBX,EBX
004F580D    33C0            XOR EAX,EAX
004F580F    5A              POP EDX
004F5810    59              POP ECX
004F5811    59              POP ECX
004F5812    64:8910         MOV DWORD PTR FS:[EAX],EDX
004F5815    68 2A584F00     PUSH folderlo.004F582A
004F581A    8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
004F581D    E8 6AF2F0FF     CALL folderlo.00404A8C
004F5822    C3              RETN


这种修改方案使软件无需注册即可实现软件的暴破。


SMC补丁方案:

ESP到这里:005A53B0  修改JNE 为 JMP XXXX(这个地址就是我们写入SMC补丁数据的地址,补丁数据的最后再返回即可)

005A53B0   /E9 5E710000     JMP folderlo.005AC513     // ESP定律来到这里。
005A53B5   |90              NOP
005A53B6   |90              NOP
005A53B7   |C2 0C00         RETN 0C
005A53BA   |68 9CCF5000     PUSH folderlo.0050CF9C
005A53BF   |C3              RETN


方案一:输入任意KEY注册成功

005AC513    C705 04705000 2>MOV DWORD PTR DS:[507004],BCC4CE20       ; 以下8行为软件标题的修改
005AC51D    C705 08705000 F>MOV DWORD PTR DS:[507008],CBD3BCFE
005AC527    C705 0C705000 F>MOV DWORD PTR DS:[50700C],C6F5CDF8
005AC531    C705 10705000 F>MOV DWORD PTR DS:[507010],B0B5D2F3
005AC53B    C705 14705000 E>MOV DWORD PTR DS:[507014],D4AEC6E6
005AC545    C705 18705000 C>MOV DWORD PTR DS:[507018],C2F3B8C6
005AC54F    C705 1C705000 D>MOV DWORD PTR DS:[50701C],B7B3CCDB
005AC559    C705 20705000 E>MOV DWORD PTR DS:[507020],0CDCBEE
005AC563    C705 2C705000 4>MOV DWORD PTR DS:[50702C],7973694E       ; 这里修改显示注册给
005AC56D    C605 235A4F00 F>MOV BYTE PTR DS:[4F5A23],0F0             ; 以下两行实现软件的暴破
005AC574    C605 4C5A4F00 F>MOV BYTE PTR DS:[4F5A4C],0F0
005AC57B    C605 30705000 0>MOV BYTE PTR DS:[507030],0               ; 注册给字符串的结束标志
005AC582  ^ E9 338EFFFF     JMP folderlo.005A53BA                    ; 返回

方案二:输入任意KEY注册成功

005AC513    C705 04705000 2>MOV DWORD PTR DS:[507004],BCC4CE20
005AC51D    C705 08705000 F>MOV DWORD PTR DS:[507008],CBD3BCFE
005AC527    C705 0C705000 F>MOV DWORD PTR DS:[50700C],C6F5CDF8
005AC531    C705 10705000 F>MOV DWORD PTR DS:[507010],B0B5D2F3
005AC53B    C705 14705000 E>MOV DWORD PTR DS:[507014],D4AEC6E6
005AC545    C705 18705000 C>MOV DWORD PTR DS:[507018],C2F3B8C6
005AC54F    C705 1C705000 D>MOV DWORD PTR DS:[50701C],B7B3CCDB
005AC559    C705 20705000 E>MOV DWORD PTR DS:[507020],0CDCBEE
005AC563    C605 E0574F00 4>MOV BYTE PTR DS:[4F57E0],45
005AC56A    C605 E1574F00 F>MOV BYTE PTR DS:[4F57E1],0FC
005AC571    C605 225A4F00 5>MOV BYTE PTR DS:[4F5A22],55
005AC578    C605 235A4F00 F>MOV BYTE PTR DS:[4F5A23],0F0
005AC57F    C705 2C705000 4>MOV DWORD PTR DS:[50702C],7973694E
005AC589    66:C705 3070500>MOV WORD PTR DS:[507030],0
005AC592  ^ E9 238EFFFF     JMP folderlo.005A53BA


方案三:不输入信息直接显示已注册

005AC513    C705 04705000 2>MOV DWORD PTR DS:[507004],BCC4CE20
005AC51D    C705 08705000 F>MOV DWORD PTR DS:[507008],CBD3BCFE
005AC527    C705 0C705000 F>MOV DWORD PTR DS:[50700C],C6F5CDF8
005AC531    C705 10705000 F>MOV DWORD PTR DS:[507010],B0B5D2F3
005AC53B    C705 14705000 E>MOV DWORD PTR DS:[507014],D4AEC6E6
005AC545    C705 18705000 C>MOV DWORD PTR DS:[507018],C2F3B8C6
005AC54F    C705 1C705000 D>MOV DWORD PTR DS:[50701C],B7B3CCDB
005AC559    C705 20705000 E>MOV DWORD PTR DS:[507020],0CDCBEE
005AC563    C705 2C705000 4>MOV DWORD PTR DS:[50702C],7973694E
005AC56D    66:C705 C7574F0>MOV WORD PTR DS:[4F57C7],9090
005AC576    66:C705 CD574F0>MOV WORD PTR DS:[4F57CD],9090
005AC57F    C605 235A4F00 F>MOV BYTE PTR DS:[4F5A23],0F0
005AC586    C605 30705000 0>MOV BYTE PTR DS:[507030],0
005AC58D  ^ E9 288EFFFF     JMP folderlo.005A53BA

软件明码比较,这里也提供一组可用KEY:

附赠一组可用KEY:
用户名:Nisy
注册码:[随意]-[00556050BD]-[随意] (第一组和第三组不输入也可)


总结:
      通过修改跳转实现软件的暴破,一种是使程序执行到注册功能的代码,另一种就是通过修改跳转使软件向系统保存注册信息,这种方法保存的多是代表软件已注册的特征值,当然也有是保存软件的真码。我们今天使用的这种方法是通过修改程序代码,使软件自动保存正确的注册信息。我们现在暴破尽量要少修改跳转,多使用修改汇编语句来实现向关键地址的赋值从而达到暴破的目的。