感谢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]-[随意] (第一组和第三组不输入也可)
总结:
通过修改跳转实现软件的暴破,一种是使程序执行到注册功能的代码,另一种就是通过修改跳转使软件向系统保存注册信息,这种方法保存的多是代表软件已注册的特征值,当然也有是保存软件的真码。我们今天使用的这种方法是通过修改程序代码,使软件自动保存正确的注册信息。我们现在暴破尽量要少修改跳转,多使用修改汇编语句来实现向关键地址的赋值从而达到暴破的目的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)