软件大小: 990 KB
软件语言: 英文
软件类别: 国外软件 / 共享版 / 安装制作
应用平台: Win9x/NT/2000/XP
界面预览: 无
加入时间: 2003-06-30 18:25:26
下载次数: 1513
推荐等级: ☆☆☆☆
软件下载: http://count.skycn.com/softdown.php?id=10630&url=http://on165-http.skycn.net:8080/down/setup2go.exe
软件简介: Setup2Go 是一个很不错的安装程序制作工具,易于使用且交互性强,它不需要使用者具备多少编程知识和编程经验就可在极短的时间内轻松完成制作,该软件还支持当前所有的 32 位 Windows 操作系统的程序,包括 Windows 95、98、ME、NT4、2000、XP 等。软件还自带工程向导帮助你快速生成安装项目,像建立快捷方式、写入注册表、文件类型关联、定制对话框及屏幕样式、使用外部工具、修改 INI 文件、添加安装密码、测试运行等等这些功能它都具备,并且你还可以利用 Setup2Go 制作出支持多国语言的安装程序,便于你向外国人出售自己的软件产品。
破解工具:OllyDbgV1.09,TRW1.22
作者声明:初学破解,仅作学习交流之用,失误之处敬请大侠赐教!
这个软件检测无壳,可是用Wdasm反汇编的代码和用OD载入看到的代码不一样,不知何故,是用VC编的.用Bpx hmemcpy找中断点,OD载入。
【简要过程】:
用户名:ShenGe[BCG]
试验码:1234567890
.................(略)
00417C87 JE SETUP2GO.00417D4A
00417C8D XOR AL, AL
00417C8F JMP SETUP2GO.00417D5A
.................(略)
00417CE0 CALL DWORD PTR DS:[<&USER32.SendMessa>
00417CE6 MOV EDI, EBX
00417CE8 OR ECX, FFFFFFFF
00417CEB XOR EAX, EAX
00417CED LEA EDX, DWORD PTR SS:[EBP-108]
00417CF3 REPNE SCAS BYTE PTR ES:[EDI]
00417CF5 NOT ECX
00417CF7 SUB EDI, ECX
00417CF9 MOV EAX, ECX
00417CFB MOV ESI, EDI
00417CFD MOV EDI, EDX
00417CFF SHR ECX, 2
00417D02 REP MOVS DWORD PTR ES:[EDI], DWORD P>
00417D04 MOV ECX, EAX
00417D06 LEA EAX, DWORD PTR SS:[EBP-108]
00417D0C PUSH EAX
00417D0D AND ECX, 3
00417D10 LEA EAX, DWORD PTR SS:[EBP-20C]
00417D16 REP MOVS BYTE PTR ES:[EDI], BYTE PTR>
00417D18 PUSH EAX
00417D19 CALL SETUP2GO.0043C6D0
00417D1E MOV ECX, EAX
00417D20 CALL SETUP2GO.00415DEC
<---这个是关键的Call,跟进!①
00417D25 POP EDI
00417D26 POP ESI
00417D27 TEST AL, AL
00417D29 POP EBX
00417D2A JE SETUP2GO.00417C8D
<---关键跳转!
00417D30 PUSH 80D
00417D35 JMP SHORT SETUP2GO.00417D4F
00417D37 PUSH 410
00417D3C PUSH 1
00417D3E CALL SETUP2GO.0043C79A
00417D43 POP ECX
00417D44 POP ECX
00417D45 JMP SETUP2GO.00417C8D
00417D4A PUSH 801
00417D4F PUSH DWORD PTR SS:[EBP+8]
00417D52 CALL DWORD PTR DS:[<&USER32.EndDialog>
★★★★★★★★★
①跟进那个关键的Call,可看到以下代码:
00415DEC PUSH EBP
00415DED MOV EBP, ESP
00415DEF PUSH ECX
00415DF0 PUSH ECX
00415DF1 PUSH EBX
00415DF2 PUSH ESI
00415DF3 PUSH EDI
00415DF4 MOV EDI, DWORD PTR SS:[EBP+8]
00415DF7 PUSH DWORD PTR SS:[EBP+C]
00415DFA MOV EBX, ECX
00415DFC PUSH EDI
00415DFD CALL SETUP2GO.00415D99
<---再跟进此Call,
^-^!②
00415E02 TEST AL, AL
00415E04 JE SETUP2GO.00415ECA
<---此处跳就失败了!
00415E0A XOR ESI, ESI
00415E0C LEA EAX, DWORD PTR SS:[EBP-4]
00415E0F PUSH ESI
00415E10 PUSH EAX
00415E11 PUSH ESI
00415E12 PUSH 0F003F
00415E17 PUSH ESI
.........(省略,是对注册表和使按钮变灰的操作)
00415EBA CALL SETUP2GO.00416CD4
00415EBF MOV BYTE PTR DS:[EBX+6C8], 1
00415EC6 MOV AL, 1
<---AL=1!Good
Luck!
00415EC8 JMP SHORT SETUP2GO.00415ECC
00415ECA XOR AL, AL
<---AL=0!Bad
Boy!
00415ECC POP EDI
00415ECD POP ESI
00415ECE POP EBX
00415ECF LEAVE
00415ED0 RETN 8
★★★★★★★★★
②跟进那个Call:
00415D99 PUSH EBP
00415D9A MOV EBP, ESP
00415D9C PUSH ECX
00415D9D XOR EDX, EDX
<---EDX=0
00415D9F PUSH EDI
<---EDI="ShenGe[BCG]",用户名
00415DA0 CMP DWORD PTR SS:[EBP+8], EDX
<---比较有无输入用户名
00415DA3 JE SHORT SETUP2GO.00415DE5
00415DA5 CMP DWORD PTR SS:[EBP+C], EDX
<---比较有无输入注册码
00415DA8 JE SHORT SETUP2GO.00415DE5
00415DAA MOV EDI, DWORD PTR SS:[EBP+8]
00415DAD OR ECX, FFFFFFFF
00415DB0 XOR EAX, EAX
00415DB2 REPNE SCAS BYTE PTR ES:[EDI]
<---取用户名长度
00415DB4 NOT ECX
00415DB6 DEC ECX
00415DB7 JE SHORT SETUP2GO.00415DE5
00415DB9 MOV EDI, DWORD PTR SS:[EBP+C]
00415DBC OR ECX, FFFFFFFF
00415DBF REPNE SCAS BYTE PTR ES:[EDI]
<---取注册码长度
00415DC1 NOT ECX
00415DC3 DEC ECX
00415DC4 CMP ECX, 0A
<---注册码长度必须为10位
00415DC7 JNZ SHORT SETUP2GO.00415DE5
00415DC9 PUSH DWORD PTR SS:[EBP+C]
<---SS:[EBP+C]中为假码"1234567890"
00415DCC LEA EAX, DWORD PTR SS:[EBP-4]
00415DCF MOV DWORD PTR SS:[EBP-4], EDX
00415DD2 PUSH EAX
00415DD3 PUSH SETUP2GO.0040C560
<---固定串"pasha
and andrey"
00415DD8 PUSH DWORD PTR SS:[EBP+8]
<---SS:[EBP+8]中为用户名"ShenGe[BCG]"
00415DDB CALL SETUP2GO.004284E3
<---显然这个Call也要跟进了!③
00415DE0 ADD ESP, 10
00415DE3 JMP SHORT SETUP2GO.00415DE7
00415DE5 XOR AL, AL
<---AL=0
00415DE7 POP EDI
00415DE8 LEAVE
00415DE9 RETN 8
★★★★★★★★★
③再跟进此Call,总算来到真正的核心部分了:
004284E3 PUSH EBP
004284E4 MOV EBP, ESP
004284E6 PUSH ECX
004284E7 PUSH EBX
004284E8 MOV EBX, DWORD PTR SS:[EBP+14]
<---EBX="1234567890",假码!
004284EB PUSH ESI
004284EC PUSH EDI
004284ED MOV EDI, EBX
004284EF OR ECX, FFFFFFFF
004284F2 XOR EAX, EAX
004284F4 REPNE SCAS BYTE PTR ES:[EDI]
<---取假码位数!
004284F6 NOT ECX
004284F8 DEC ECX
004284F9 MOV EDI, ECX
<---EDI=ECX=假码位数
004284FB LEA EAX, DWORD PTR DS:[EDI+1]
<---EAX=A+1=B
004284FE PUSH EAX
004284FF CALL SETUP2GO.0045A144
00428504 MOV ESI, DWORD PTR SS:[EBP+10]
00428507 POP ECX
00428508 TEST ESI, ESI
0042850A MOV DWORD PTR SS:[EBP-4], EAX
0042850D JE SHORT SETUP2GO.0042853A
0042850F MOV AL, BYTE PTR DS:[EBX+1]
<---取假码第2位"2"
00428512 PUSH EAX
00428513 CALL SETUP2GO.004284C1
<---对字符进行转换(Hex--->Char),我没有跟进
只是用几个字符试了一下,若是小写则转换成大
写,然后Hex值减0x30,其余字符则Hex值减0x07,然后
Hex值减0x30
00428518 MOV EDX, EAX
0042851A MOV AL, BYTE PTR DS:[EBX]
<---取假码第1位
0042851C PUSH EAX
0042851D MOV DWORD PTR SS:[EBP+10], EDX
00428520 CALL SETUP2GO.004284C1
00428525 POP ECX
00428526 POP ECX
00428527 MOV ECX, DWORD PTR SS:[EBP+10]
<---假码第2位转换后的值
0042852A SHL EAX, 4
0042852D ADD ECX, EAX
<---ECX=12,嗬嗬,对数字而言其实上面
这么多就是"12"-->0x12
0042852F XOR ECX, 0FF
<---ECX=0x12^0xFF=0xED
00428535 SUB ECX, 55
<---ECX=0xED-0x55=0x98
00428538 MOV DWORD PTR DS:[ESI], ECX
0042853A PUSH EDI
0042853B PUSH DWORD PTR SS:[EBP-4]
0042853E PUSH DWORD PTR DS:[ESI]
00428540 PUSH DWORD PTR SS:[EBP+C]
00428543 PUSH DWORD PTR SS:[EBP+8]
00428546 CALL SETUP2GO.004283B5
<---跟进此Call才能看到算法!④
0042854B PUSH EDI
0042854C PUSH EBX
<---假码"1234567890"
0042854D PUSH DWORD PTR SS:[EBP-4]
<---真码"12SSH9R3TQ"
00428550 CALL SETUP2GO.0045BD00
<---真假码比对的Call,返回值在EAX中
若想注册成功返回值必须为0
00428555 PUSH DWORD PTR SS:[EBP-4]
---------------------------
00428558 MOV EBX, EAX
0042855A NEG EBX
0042855C SBB BL, BL
0042855E INC BL
---------------------------
00428560 CALL SETUP2GO.00457862
00428565 ADD ESP, 24
00428568 MOV AL, BL
<---AL中的值是由BL中的值确定的
0042856A POP EDI
0042856B POP ESI
0042856C POP EBX
0042856D LEAVE
0042856E RETN
★★★★★★★★★
④跟进算法Call:
004283B5 PUSH EBP
004283B6 MOV EBP, ESP
004283B8 PUSH ECX
004283B9 PUSH ECX
004283BA PUSH EBX
004283BB MOV EBX, DWORD PTR SS:[EBP+18]
004283BE PUSH ESI
004283BF PUSH EDI
004283C0 LEA ESI, DWORD PTR DS:[EBX+1]
004283C3 PUSH ESI
004283C4 CALL SETUP2GO.0045A144
004283C9 PUSH ESI
004283CA MOV DWORD PTR SS:[EBP-4], EAX
004283CD CALL SETUP2GO.0045A144
004283D2 AND DWORD PTR SS:[EBP+18], 0
004283D6 PUSH EBX
<---EBX=0x0A
004283D7 PUSH DWORD PTR SS:[EBP+8]
<---为用户名"ShenGe[BCG]"
004283DA MOV DWORD PTR SS:[EBP-8], EAX
004283DD PUSH DWORD PTR SS:[EBP-4]
004283E0 CALL SETUP2GO.00428316
<---对用户名进行操作,具体如下:若用户名不足10位则
从第1位开始取循环补足,如若用户名为"ShenGe",则操作后
为"ShenGeShen";若大于10位则取前10位,我的
为取用户名"ShenGe[BCG]"的前10位"ShenGe[BCG"
004283E5 PUSH EBX
004283E6 PUSH DWORD PTR SS:[EBP+C]
004283E9 PUSH DWORD PTR SS:[EBP-8]
004283EC CALL SETUP2GO.00428316
<---取固定串"pasha
and andrey"的前10位"pasha and "
004283F1 MOV ESI, DWORD PTR SS:[EBP+10]
<---ESI=0x98,记得怎么算来的吧!
------------------------------
004283F4 MOV EDI, 0FF
004283F9 AND ESI, EDI
004283FB ADD ESI, 55
004283FE XOR ESI, EDI
00428400 MOV EAX, ESI
00428402 SHR EAX, 4
00428405 PUSH EAX
00428406 CALL SETUP2GO.0042837F
0042840B MOV ECX, DWORD PTR SS:[EBP+14]
0042840E AND ESI, 0F
00428411 PUSH ESI
00428412 MOV BYTE PTR DS:[ECX], AL
00428414 CALL SETUP2GO.0042837F
--------------------------
不会吧!又还原回来了!其实往后看你会发现这么多只是软件给
Cracker放了一个烟雾弹,它会把这前两位"12"再合并到
计算得到的字串中!即注册码前2位任意,关键是后8位.
00428419 MOV EDX, DWORD PTR SS:[EBP+14]
0042841C ADD ESP, 28
0042841F XOR ESI, ESI
00428421 TEST EBX, EBX
00428423 MOV BYTE PTR DS:[EDX+1], AL
00428426 JLE SHORT SETUP2GO.0042844E
00428428 MOV EAX, DWORD PTR SS:[EBP+C]
<---SS:[EBP+C]中为"pasha
and "
0042842B MOV ECX, DWORD PTR SS:[EBP+18]
0042842E AND ECX, EDI
<---EDI为0xFF,取低位值
00428430 MOV AL, BYTE PTR DS:[ESI+EAX]
<---按位取"pasha
and "的每个字符
00428433 AND EAX, EDI
00428435 XOR EAX, ECX
00428437 MOV ECX, DWORD PTR SS:[EBP+18]
0042843A SHR ECX, 8
0042843D MOV EAX, DWORD PTR DS:[EAX*4+40D348]
<---查表给EAX赋值,表如下:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
0040D34C 96 30 07 77 2C 61 0E EE BA 51 09 99 19 C4 6D 07
0040D35C 8F F4 6A 70 35 A5 63 E9 A3 95 64 9E 32 88 DB 0E
0040D36C A4 B8 DC 79 1E E9 D5 E0 88 D9 D2 97 2B 4C B6 09
0040D37C BD 7C B1 7E 07 2D B8 E7 91 1D BF 90 64 10 B7 1D
0040D38C F2 20 B0 6A 48 71 B9 F3 DE 41 BE 84 7D D4 DA 1A
0040D39C EB E4 DD 6D 51 B5 D4 F4 C7 85 D3 83 56 98 6C 13
0040D3AC C0 A8 6B 64 7A F9 62 FD EC C9 65 8A 4F 5C 01 14
0040D3BC D9 6C 06 63 63 3D 0F FA F5 0D 08 8D C8 20 6E 3B
0040D3CC 5E 10 69 4C E4 41 60 D5 72 71 67 A2 D1 E4 03 3C
0040D3DC 47 D4 04 4B FD 85 0D D2 6B B5 0A A5 FA A8 B5 35
0040D3EC 6C 98 B2 42 D6 C9 BB DB 40 F9 BC AC E3 6C D8 32
0040D3FC 75 5C DF 45 CF 0D D6 DC 59 3D D1 AB AC 30 D9 26
0040D40C 3A 00 DE 51 80 51 D7 C8 16 61 D0 BF B5 F4 B4 21
0040D41C 23 C4 B3 56 99 95 BA CF 0F A5 BD B8 9E B8 02 28
0040D42C 08 88 05 5F B2 D9 0C C6 24 E9 0B B1 87 7C 6F 2F
0040D43C 11 4C 68 58 AB 1D 61 C1 3D 2D 66 B6 90 41 DC 76
0040D44C 06 71 DB 01 BC 20 D2 98 2A 10 D5 EF 89 85 B1 71
0040D45C 1F B5 B6 06 A5 E4 BF 9F 33 D4 B8 E8 A2 C9 07 78
0040D46C 34 F9 00 0F 8E A8 09 96 18 98 0E E1 BB 0D 6A 7F
0040D47C 2D 3D 6D 08 97 6C 64 91 01 5C 63 E6 F4 51 6B 6B
0040D48C 62 61 6C 1C D8 30 65 85 4E 00 62 F2 ED 95 06 6C
0040D49C 7B A5 01 1B C1 F4 08 82 57 C4 0F F5 C6 D9 B0 65
0040D4AC 50 E9 B7 12 EA B8 BE 8B 7C 88 B9 FC DF 1D DD 62
0040D4BC 49 2D DA 15 F3 7C D3 8C 65 4C D4 FB 58 61 B2 4D
0040D4CC CE 51 B5 3A 74 00 BC A3 E2 30 BB D4 41 A5 DF 4A
0040D4DC D7 95 D8 3D 6D C4 D1 A4 FB F4 D6 D3 6A E9 69 43
0040D4EC FC D9 6E 34 46 88 67 AD D0 B8 60 DA 73 2D 04 44
0040D4FC E5 1D 03 33 5F 4C 0A AA C9 7C 0D DD 3C 71 05 50
0040D50C AA 41 02 27 10 10 0B BE 86 20 0C C9 25 B5 68 57
0040D51C B3 85 6F 20 09 D4 66 B9 9F E4 61 CE 0E F9 DE 5E
0040D52C 98 C9 D9 29 22 98 D0 B0 B4 A8 D7 C7 17 3D B3 59
0040D53C 81 0D B4 2E 3B 5C BD B7 AD 6C BA C0 20 83 B8 ED
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
00428444 XOR
EAX, ECX
00428446 INC ESI
00428447 CMP ESI, EBX
00428449 MOV DWORD PTR SS:[EBP+18], EAX
<---结果存入SS:[EBP+18]中
0042844C JL SHORT SETUP2GO.00428428
<---是否取完字符,我的循环完后EAX=DE928F52
这个值也应该是个固定值!
0042844E CMP EBX, 2
00428451 JLE SHORT SETUP2GO.004284A6
00428453 MOV ESI, DWORD PTR SS:[EBP-4]
<---ESI="ShenGe[BCG"
00428456 LEA EAX, DWORD PTR DS:[EBX-2]
<---EAX=A-2=8
00428459 SUB ESI, EDX
0042845B LEA ECX, DWORD PTR DS:[EDX+2]
0042845E MOV DWORD PTR SS:[EBP+8], ESI
00428461 MOV DWORD PTR SS:[EBP+C], EAX
00428464 JMP SHORT SETUP2GO.00428469
00428466 MOV ESI, DWORD PTR SS:[EBP+8]
下面这一段我就不注释了,同上,这段循环从"ShenGe[BCG"
的第3位开始取后面的8位字符参与运算
-----------------------------
00428469 MOV AL, BYTE PTR DS:[ESI+ECX]
<---按位取"enGe[BCG"
0042846C MOV EDX, DWORD PTR SS:[EBP+18]
0042846F AND EAX, EDI
00428471 AND EDX, EDI
00428473 XOR EAX, EDX
00428475 MOV EDX, DWORD PTR SS:[EBP+18]
<---EDX=DE928F52,上面的计算值
00428478 SHR EDX, 8
0042847B MOV EAX, DWORD PTR DS:[EAX*4+40D348]
-----------------------------
00428482 PUSH 24
00428484 XOR EAX, EDX
00428486 XOR EDX, EDX
00428488 POP ESI
<---ESI=0x24
00428489 MOV DWORD PTR SS:[EBP+18], EAX
0042848C DIV ESI
0042848E CMP EDX, 0A
<---余数值若大于0A,则加0x37,否则加0x30,
确保注册码为数字或字母.
00428491 JNB SHORT SETUP2GO.00428498
00428493 ADD DL, 30
00428496 JMP SHORT SETUP2GO.0042849B
00428498 ADD DL, 37
0042849B MOV BYTE PTR DS:[ECX], DL
<---结果存入DS:[ECX]中,就是正确的注册码!
0042849D INC ECX
0042849E DEC DWORD PTR SS:[EBP+C]
004284A1 JNZ SHORT SETUP2GO.00428466
<---是否取完字符
004284A3 MOV EDX, DWORD PTR SS:[EBP+14]
004284A6 PUSH DWORD PTR SS:[EBP-4]
004284A9 AND BYTE PTR DS:[EDX+EBX], 0
<---D EDX会看到正确的注册码"12SSH9R3TQ"
004284AD CALL SETUP2GO.00457862
004284B2 PUSH DWORD PTR SS:[EBP-8]
004284B5 CALL SETUP2GO.00457862
004284BA POP ECX
004284BB POP ECX
004284BC POP EDI
004284BD POP ESI
004284BE POP EBX
004284BF LEAVE
004284C0 RETN
总结:注册码必须为10位,前2位任意,后8位由固定串"pasha and andrey"
的前10位和用户名计算得到.
软件注册成功后将注册信息保存在注册表的
"HKEY_LOCAL_MACHINE\Software\SDS Software\Setup2Go"下
一个可用注册码:
用户名:ShenGe[BCG]
注册码:12SSH9R3TQ
Cracked By ShenGe[BCG]