• 标 题:安装制作Setup2Go算法浅析!
  • 作 者:ShenGe
  • 时 间:2003/07/02 07:21am
  • 链 接:http://bbs.pediy.com

软件大小:  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]