首页
社区
课程
招聘
[原创]全球卫片超级下载2006(GoogleMapSuperGet2006)算法分析及注册机源码(菜鸟级,破解失败,但过程不错)
2007-4-9 09:15 21416

[原创]全球卫片超级下载2006(GoogleMapSuperGet2006)算法分析及注册机源码(菜鸟级,破解失败,但过程不错)

2007-4-9 09:15
21416
【破文标题】全球卫片超级下载2006(GoogleMapSuperGet2006)算法分析及注册机编写
【破文作者】藍色の夢(shenhaiyu)
【破解工具】OD,破解计算工具,VB6.0
【破解平台】XP SP2
【软件名称】全球卫片超级下载2006(GoogleMapSuperGet2006) 企业版 V 10.25.201
【软件大小】4027K
【原版下载】http://cn.arceyes.net/
【保护方式】隐蔽注册码
【软件简介】
    全球卫片超级下载[GoogleMapSuperGet]是一款基于Google服务器的多线程高速卫片下载、超大图无缝拼接工具,它可以高速下载您所指定的任意经纬度范围的卫片,并可将所下载卫片无缝拼接为超大图片,使您可以充分利用Google免费卫片资源,享受遨游世界的乐趣。该软件的主要特点包括:
1.下载速度快:下载速度快是本软件的最大优点之一,经测试,最佳状态一分钟可下载68张,平均每0.88秒即可下载一张。
2.资源消耗少:经测试,本软件在下载卫片时通常所占内存资源仅为11兆左右;所占CPU(2.4G)资源≤2%。
3.无缝拼接超大图:本软件能对卫片进行较为良好的无缝拼接,最大JPEG拼图文件为8192×8192像素;最大BMP拼图文件为无穷大,但普通的图像处理软件(如PHOTOSHOP)所支持的最大BMP文件为30000×30000像素,因此对卫片进行超大图拼接时建议选择生成多个16384×16384像素的BMP文件。
4.下载范围自定义:您可以通过输入下载范围的左下角和右上角经纬度坐标的方式自定义下载范围,系统将会根据您所指定的下载范围自动计算URL并进行下载。
5.多任务同时下载:多任务同时下载功能在同一时刻最多支持5个任务同时下载,以避免对服务器造成过大的负载。
6.计划任务待下载:如果当前已经有5个下载任务,当再启动其它下载任务时,该任务将会自动被转换为等待下载的计划任务,每当下载任务小于5个时,系统会自动启动计划任务进行下载。
7.断点续传下载:当下载任务被人为暂停、软件或系统异常引起系统崩溃、断电等人为或非人为因素导致下载任务被强制中断时,该任务将会被置为暂停下载状态,当被中断的任务被再次启动时,系统不会对已下载的数据进行重复下载,断点续传功能有效地保证了下载任务的正确高效执行。
8.卫片分级下载:卫片分级下载是指按卫片的精度等级对卫片进行分级下载,在下载任务所对应的下载目录中以卫片的精度等级进行分类,并以精度等级(01≤精度等级≤20)命名文件夹(如05、06、07等)。卫片分级下载有效地保证了卫片的完整性,避免了因某些卫片无法下载导致拼图产生空白的缺点。
9.地标分类管理:您可以跟据你的个人需求,对地标进行分类管理,轻易实现对地标类别和地标(下载任务)进行添加、删除、重命名等管理操作。
0.绿色免安装:本软件是一款免安装绿色软件,不对操作系统进行任何恶意设置;不捆绑任何流氓软件;不捆绑任何第三方插件;通过正版卡巴斯基扫描后发布,无病毒,可放心使用。

【破解说明】
    作为一名搞GIS的人,不可能没与 GoogleEarth 打过交道。上面又多又全又清晰的卫星图片让人有一种见到就想搞到手的冲动。可是高昂的费用让人望而却步,再加上 GoogleEarth 的数据加密,几乎不可能以免费的方式获得它的卫星图片。值得庆幸的是,http://maps.google.cpm 为我们提供了一个便捷的方法:就是从IE缓存中保存每一景图片,然后拼接到一起。这样虽然得到了图片,可是巨大的工作量又让我望洋兴叹,仅仅一个北京市的20级全图就有上千张图片需要拼接,那个汗啊!!本来想自己做一个程序用来图片的自动拼接,可是上网一搜居然发现了这款小软件,不但可以根据地理坐标自动下载每景图片,还有很方便的自动拼接功能,简直是踏破铁鞋无觅处,得来全。。。。等等,注册!!!这种软件还要注册,作者真是不知怎么想的,编写个软件盗用人家 Google 的数据居然还进行商业活动,企业版的居然要 1998 元这么多!不注册的话下载下来的卫片被弄得一个一个的窟窿,还真没法使用。作为一名 Cracker 为了把免费贯彻到底,二话不说索性再来Crack一个!
    对于绝大多数Cracker来说,这个软件相当的容易爆破,但是这篇文章重点落在算法分析以及注册机的编写,应该算是一篇简单详细的入门教程吧。

===================================================================================

【破解过程】
    下载后运行软件,居然没有发现注册入口,可是用 Resource Hacker 打开却发现有注册对话框这个资源,看来是被作者隐藏了,估计是用热键或者激活文件什么的激活注册窗口吧,没时间研究这个了,换个思路试试。打开注册表一顿搜索,终于在 HKEY_LOCAL_MACHINE\SOFTWARE\SuperGet2006\Enterprise10.25.201 下发现了 RegCode 这个键值,一看就知道是用来存储注册码的。

【分析过程】
    挂上OD,打开 SuperGet.exe 在反汇编窗口上右击鼠标,选择搜索->所有参考的字符串,然后仔细的找吧,快到底部的时候是否注意到了 00426B6C  PUSH SuperGet.004307DC ASCII "RegCode" 这一行,对,就应该是这里了,双击这一行就在反汇编窗口中定位到这一句了。向上翻翻看,会有不少收获:

===================================================================================
......
00426AAC  |.  3BC3                  CMP EAX,EBX
00426AAE  |.  0F85 1B010000         JNZ SuperGet.00426BCF
00426AB4  |.  8B7424 24             MOV ESI,DWORD PTR SS:[ESP+24]
00426AB8  |.  8D4C24 14             LEA ECX,DWORD PTR SS:[ESP+14]
00426ABC  |.  897424 20             MOV DWORD PTR SS:[ESP+20],ESI
00426AC0  |.  FF15 94D14200         CALL DWORD PTR DS:[<&MFC71.#310_ATL::CStringT<char,>;  MFC71.7C173199
00426AC6  |.  8D5424 1C             LEA EDX,DWORD PTR SS:[ESP+1C]
00426ACA  |.  52                    PUSH EDX
00426ACB  |.  C68424 3C040000 02    MOV BYTE PTR SS:[ESP+43C],2
00426AD3  |.  E8 7E0A0000           CALL <JMP.&Public.GetCPUID>        ;  看来这里是用来计算硬件ID的,只用到了CPU呢
00426AD8  |.  8D4424 20             LEA EAX,DWORD PTR SS:[ESP+20]
00426ADC  |.  8BCC                  MOV ECX,ESP
00426ADE  |.  896424 14             MOV DWORD PTR SS:[ESP+14],ESP
00426AE2  |.  50                    PUSH EAX
00426AE3  |.  C68424 40040000 03    MOV BYTE PTR SS:[ESP+440],3
00426AEB  |.  FF15 C8D24200         CALL DWORD PTR DS:[<&MFC71.#297_ATL::CStringT<char,>;  MFC71.7C14E575
00426AF1  |.  8D4C24 14             LEA ECX,DWORD PTR SS:[ESP+14]
00426AF5  |.  51                    PUSH ECX
00426AF6  |.  E8 AF0A0000           CALL <JMP.&Public.CreateEncrypt>   ;  这是什么?嗯,看来我们要的东西就在这里,明显是一个字串加密函数
00426AFB  |.  83C4 08               ADD ESP,8
00426AFE  |.  50                    PUSH EAX
00426AFF  |.  8D4C24 20             LEA ECX,DWORD PTR SS:[ESP+20]
00426B03  |.  C68424 3C040000 04    MOV BYTE PTR SS:[ESP+43C],4
00426B0B  |.  FF15 E0D24200         CALL DWORD PTR DS:[<&MFC71.#781_ATL::CStringT<char,>;  MFC71.7C150F15
00426B11  |.  8D4C24 10             LEA ECX,DWORD PTR SS:[ESP+10]
00426B15  |.  C68424 38040000 03    MOV BYTE PTR SS:[ESP+438],3
00426B1D  |.  FF15 84D14200         CALL DWORD PTR DS:[<&MFC71.#578_ATL::CStringT<char,>;  MFC71.7C1771B1
00426B23  |.  8D4C24 18             LEA ECX,DWORD PTR SS:[ESP+18]
00426B27  |.  FF15 88D14200         CALL DWORD PTR DS:[<&MFC71.#876_ATL::CSimpleStringT>;  MFC71.7C158BCD
00426B2D  |.  8D5424 10             LEA EDX,DWORD PTR SS:[ESP+10]
00426B31  |.  52                    PUSH EDX
00426B32  |.  68 1F000200           PUSH 2001F
00426B37  |.  53                    PUSH EBX
00426B38  |.  50                    PUSH EAX
00426B39  |.  68 02000080           PUSH 80000002
00426B3E  |.  895C24 24             MOV DWORD PTR SS:[ESP+24],EBX
00426B42  |.  FFD7                  CALL EDI
00426B44  |.  85C0                  TEST EAX,EAX
00426B46  |.  75 15                 JNZ SHORT SuperGet.00426B5D
00426B48  |.  8BC6                  MOV EAX,ESI
00426B4A  |.  3BC3                  CMP EAX,EBX
00426B4C  |.  74 07                 JE SHORT SuperGet.00426B55
00426B4E  |.  50                    PUSH EAX                                            ; /hKey
00426B4F  |.  FF15 00D04200         CALL DWORD PTR DS:[<&ADVAPI32.RegCloseKey>]         ; \RegCloseKey
00426B55  |>  8B7424 10             MOV ESI,DWORD PTR SS:[ESP+10]
00426B59  |.  897424 20             MOV DWORD PTR SS:[ESP+20],ESI
00426B5D  |>  8D4424 10             LEA EAX,DWORD PTR SS:[ESP+10]
00426B61  |.  50                    PUSH EAX
00426B62  |.  8D4C24 30             LEA ECX,DWORD PTR SS:[ESP+30]
00426B66  |.  51                    PUSH ECX
00426B67  |.  68 DC074300           PUSH SuperGet.004307DC                              ;  ASCII "RegCode"
00426B6C  |.  8D4C24 2C             LEA ECX,DWORD PTR SS:[ESP+2C]                       ;  我们刚才找到的地方,剩下的不必关心了
00426B70  |.  E8 5BE8FEFF           CALL SuperGet.004153D0
00426B75  |.  85C0                  TEST EAX,EAX
00426B77  |.  0F85 38010000         JNZ SuperGet.00426CB5
00426B7D  |.  8D5424 2C             LEA EDX,DWORD PTR SS:[ESP+2C]
00426B81  |.  52                    PUSH EDX
00426B82  |.  8D4C24 18             LEA ECX,DWORD PTR SS:[ESP+18]
......

    在 00426AD3 和 00426AF6 分别按 F2 下两个断点,再按 F9 执行程序,会遇到两次异常错误,按 Shift+F9 跳过错误继续执行,最后停在断点 00426AD3 处了,按 F7 跟入,看到了一大串字符处理函数,汗一个!

......
10001C70 >  6A FF                   PUSH -1
10001C72    68 49450010             PUSH Public.10004549
10001C77    64:A1 00000000          MOV EAX,DWORD PTR FS:[0]
10001C7D    50                      PUSH EAX
10001C7E    64:8925 00000000        MOV DWORD PTR FS:[0],ESP
10001C85    83EC 34                 SUB ESP,34
10001C88    A1 B0800010             MOV EAX,DWORD PTR DS:[100080B0]
10001C8D    53                      PUSH EBX
10001C8E    56                      PUSH ESI
10001C8F    33F6                    XOR ESI,ESI
10001C91    8D4C24 08               LEA ECX,DWORD PTR SS:[ESP+8]
10001C95    894424 38               MOV DWORD PTR SS:[ESP+38],EAX
10001C99    897424 0C               MOV DWORD PTR SS:[ESP+C],ESI
10001C9D    FF15 DC500010           CALL DWORD PTR DS:[<&MFC71.#310_ATL::CStringT>; MFC71.7C173199
10001CA3    897424 44               MOV DWORD PTR SS:[ESP+44],ESI
10001CA7    897424 0C               MOV DWORD PTR SS:[ESP+C],ESI
10001CAB    897424 10               MOV DWORD PTR SS:[ESP+10],ESI
10001CAF    B8 01000000             MOV EAX,1
10001CB4    33D2                    XOR EDX,EDX
10001CB6    0FA2                    CPUID
10001CB8    895424 0C               MOV DWORD PTR SS:[ESP+C],EDX
10001CBC    894424 10               MOV DWORD PTR SS:[ESP+10],EAX
10001CC0    8B4C24 10               MOV ECX,DWORD PTR SS:[ESP+10]
10001CC4    8B5424 0C               MOV EDX,DWORD PTR SS:[ESP+C]
10001CC8    33C0                    XOR EAX,EAX
10001CCA    894424 15               MOV DWORD PTR SS:[ESP+15],EAX
10001CCE    894424 19               MOV DWORD PTR SS:[ESP+19],EAX
10001CD2    894424 1D               MOV DWORD PTR SS:[ESP+1D],EAX
10001CD6    894424 21               MOV DWORD PTR SS:[ESP+21],EAX
10001CDA    894424 25               MOV DWORD PTR SS:[ESP+25],EAX
10001CDE    894424 29               MOV DWORD PTR SS:[ESP+29],EAX
10001CE2    51                      PUSH ECX
10001CE3    894424 31               MOV DWORD PTR SS:[ESP+31],EAX
10001CE7    52                      PUSH EDX
10001CE8    894424 39               MOV DWORD PTR SS:[ESP+39],EAX
10001CEC    8D4424 1C               LEA EAX,DWORD PTR SS:[ESP+1C]
10001CF0    68 B0520010             PUSH Public.100052B0                          ; ASCII "%08X%08X"
10001CF5    50                      PUSH EAX
10001CF6    C64424 24 00            MOV BYTE PTR SS:[ESP+24],0
10001CFB    FF15 98510010           CALL DWORD PTR DS:[<&MSVCR71.sprintf>]        ; MSVCR71.sprintf
10001D01    83C4 10                 ADD ESP,10
10001D04    8D4C24 14               LEA ECX,DWORD PTR SS:[ESP+14]
10001D08    51                      PUSH ECX
10001D09    8D4C24 0C               LEA ECX,DWORD PTR SS:[ESP+C]
10001D0D    FF15 30510010           CALL DWORD PTR DS:[<&MFC71.#784_ATL::CStringT>; MFC71.7C14FF74
10001D13    6A 41                   PUSH 41
10001D15    6A 01                   PUSH 1
10001D17    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D1B    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D21    6A 52                   PUSH 52
10001D23    6A 03                   PUSH 3
10001D25    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D29    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D2F    6A 43                   PUSH 43
10001D31    6A 05                   PUSH 5
10001D33    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D37    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D3D    6A 45                   PUSH 45
10001D3F    6A 07                   PUSH 7
10001D41    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D45    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D4B    6A 59                   PUSH 59
10001D4D    6A 09                   PUSH 9
10001D4F    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D53    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D59    6A 45                   PUSH 45
10001D5B    6A 0B                   PUSH 0B
10001D5D    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D61    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D67    6A 53                   PUSH 53
10001D69    6A 0D                   PUSH 0D
10001D6B    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D6F    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D75    6A 4E                   PUSH 4E
10001D77    6A 0F                   PUSH 0F
10001D79    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D7D    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D83    6A 45                   PUSH 45
10001D85    6A 11                   PUSH 11
10001D87    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D8B    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D91    6A 54                   PUSH 54
10001D93    6A 13                   PUSH 13
10001D95    8D4C24 10               LEA ECX,DWORD PTR SS:[ESP+10]
10001D99    FF15 24510010           CALL DWORD PTR DS:[<&MFC71.#3849_ATL::CString>; MFC71.7C189C8A
10001D9F    8B7424 4C               MOV ESI,DWORD PTR SS:[ESP+4C]
10001DA3    8D5424 08               LEA EDX,DWORD PTR SS:[ESP+8]
10001DA7    52                      PUSH EDX
10001DA8    8BCE                    MOV ECX,ESI
10001DAA    FF15 B4500010           CALL DWORD PTR DS:[<&MFC71.#297_ATL::CStringT>; MFC71.7C14E575
10001DB0    8D4C24 08               LEA ECX,DWORD PTR SS:[ESP+8]
10001DB4    FF15 64500010           CALL DWORD PTR DS:[<&MFC71.#578_ATL::CStringT>; MFC71.7C1771B1
10001DBA    8B4C24 3C               MOV ECX,DWORD PTR SS:[ESP+3C]
10001DBE    8BC6                    MOV EAX,ESI
10001DC0    5E                      POP ESI
10001DC1    64:890D 00000000        MOV DWORD PTR FS:[0],ECX
10001DC8    8B4C24 34               MOV ECX,DWORD PTR SS:[ESP+34]
10001DCC    5B                      POP EBX
10001DCD    E8 9D1F0000             CALL Public.10003D6F
10001DD2    83C4 40                 ADD ESP,40
10001DD5    C3                      RETN

    有些晕是不是,没关系,我们大可不必分析它的算法,在 return 之前的 10001DD2 处按 F2 下一个断点,再按 F9 执行到这里看看,你会赫然的发现堆栈窗口中显示这么一串:
0012FA30   003D8830  ASCII "0A3R8C7EFY9EFSFN0E0T000686",
    赶紧运行软件看看机器码,我的老天,这不就是软件中显示的机器码吗?服了作者了,这都懒得加密,直接就拿出来用,倒是给我们破解省了不少事,再汗一个!既然机器码没有二次加密,我们就没有必要分析它的算法了,因为程序已经直接给了我们嘛。
    再按两次 F7 回到了00426AD8 这一句,接下来要关心关心这一句了:
00426AF6   E8 AF0A0000  CALL <JMP.&Public.CreateEncrypt>
    定位到这里后按下 F4 跳到这一句,可以看到机器码已经入栈了,看来注册码就是在这里计算出来的了。按下 F7 跟入:

10001DE0 >  6A FF           PUSH -1
10001DE2    68 7B450010     PUSH Public.1000457B
10001DE7    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]
10001DED    50              PUSH EAX
10001DEE    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
10001DF5    83EC 08         SUB ESP,8
10001DF8    53              PUSH EBX
10001DF9    55              PUSH EBP
10001DFA    56              PUSH ESI
10001DFB    33F6            XOR ESI,ESI
10001DFD    57              PUSH EDI
10001DFE    897424 14       MOV DWORD PTR SS:[ESP+14],ESI
10001E02    68 BC520010     PUSH Public.100052BC                       ; ASCII "ILOVEMYGIRLFRIENDZHENGYANRONG"看来是用于加密算法的字串,经查找是存在Public.dll文件中的资源
10001E07    8D4C24 18       LEA ECX,DWORD PTR SS:[ESP+18]
10001E0B    897424 24       MOV DWORD PTR SS:[ESP+24],ESI
......                                                        ;这一部分不必看,无非就是字串规格化
10001E68    85C0            TEST EAX,EAX
10001E6A    7E 7D           JLE SHORT Public.10001EE9
10001E6C    8BF3            MOV ESI,EBX
10001E6E    2BFB            SUB EDI,EBX
10001E70    8A0437          MOV AL,BYTE PTR DS:[EDI+ESI]
10001E73    3006            XOR BYTE PTR DS:[ESI],AL           ;各取出机器码与加密码对应的一个字符进行异或操作,这是最常用的字串加密手段
10001E75    8A06            MOV AL,BYTE PTR DS:[ESI]           ;保存到AL中,进行ASCII码的比较
10001E77    3C 30           CMP AL,30
10001E79    7C 18           JL SHORT Public.10001E93                   ; if AL<'0' then 跳转
10001E7B    3C 39           CMP AL,39
10001E7D    7E 04           JLE SHORT Public.10001E83                  ; if AL<='9' then 跳转
10001E7F    3C 41           CMP AL,41
10001E81    7C 0C           JL SHORT Public.10001E8F                   ; if AL<'A' then 跳转
10001E83    3C 5A           CMP AL,5A
10001E85    7E 04           JLE SHORT Public.10001E8B                  ; if AL<='Z' then 跳转
10001E87    3C 61           CMP AL,61
10001E89    7C 04           JL SHORT Public.10001E8F                   ; if AL<'a' then 跳转
10001E8B    3C 7A           CMP AL,7A
10001E8D    7E 4A           JLE SHORT Public.10001ED9                  ; if AL<='z' then 跳转
10001E8F    3C 30           CMP AL,30
10001E91    7D 20           JGE SHORT Public.10001EB3                  ; if AL>='0' then 跳转
10001E93    04 30           ADD AL,30                                  ; AL=AL+&H30
10001E95    3C 39           CMP AL,39
10001E97    8806            MOV BYTE PTR DS:[ESI],AL
10001E99    7E 0A           JLE SHORT Public.10001EA5                  ; if AL<='9' then 跳转
10001E9B    3C 41           CMP AL,41
10001E9D    7D 06           JGE SHORT Public.10001EA5                  ; if AL>='A' then 跳转
10001E9F    04 0A           ADD AL,0A                                  ; AL=AL+&H10
10001EA1    8806            MOV BYTE PTR DS:[ESI],AL
10001EA3  ^ EB D0           JMP SHORT Public.10001E75
10001EA5    3C 5A           CMP AL,5A
10001EA7  ^ 7E CC           JLE SHORT Public.10001E75                  ; if AL<='Z' then 跳转
10001EA9    3C 61           CMP AL,61
10001EAB  ^ 7D C8           JGE SHORT Public.10001E75                  ; if AL>='a' then 跳转
10001EAD    04 0A           ADD AL,0A                                  ; AL=AL+&H10
10001EAF    8806            MOV BYTE PTR DS:[ESI],AL
10001EB1  ^ EB C2           JMP SHORT Public.10001E75
10001EB3    3C 39           CMP AL,39
10001EB5    7E 0A           JLE SHORT Public.10001EC1                  ; if AL<='9' then 跳转
10001EB7    3C 41           CMP AL,41
10001EB9    7D 06           JGE SHORT Public.10001EC1                  ; if AL>='A' then 跳转
10001EBB    04 0A           ADD AL,0A                                  ; AL=AL+&H10
10001EBD    8806            MOV BYTE PTR DS:[ESI],AL
10001EBF  ^ EB B4           JMP SHORT Public.10001E75
10001EC1    3C 5A           CMP AL,5A
10001EC3    7E 0A           JLE SHORT Public.10001ECF                  ; if AL<='Z' then 跳转
10001EC5    3C 61           CMP AL,61
10001EC7    7D 06           JGE SHORT Public.10001ECF                  ; if AL>='a' then 跳转
10001EC9    04 0A           ADD AL,0A                                  ; AL=AL+&H0A
10001ECB    8806            MOV BYTE PTR DS:[ESI],AL
10001ECD  ^ EB A6           JMP SHORT Public.10001E75
10001ECF    3C 7A           CMP AL,7A
10001ED1  ^ 7E A2           JLE SHORT Public.10001E75                  ; if AL<='z' then 跳转
10001ED3    2C 7A           SUB AL,7A
10001ED5    8806            MOV BYTE PTR DS:[ESI],AL
10001ED7  ^ EB 9C           JMP SHORT Public.10001E75                  ;到此为止,以上程序的意思就是:在加密码和机器码中取出同一位置的一个字符,将这两个字符的ASCII码进行异或操作,如果异或后得到的数值还是某一数字或字母的ASCII,则把这个数字或者字母作为该位置的注册码,如果不是一个数字或字母的ASCII则进行加减操作,使其成为一个数字或字母的ASCII。

    从 10001E79 到 10001ED7 这一段对于老鸟来说再熟悉不过了,菜鸟看不懂汇编没关系,看注释里的解说。别告诉我看了注释还是很晕,我觉得写的够详细了。下面举个例子来说明:

首先有关ASCII的说明:
数字以及字母字符    ....  0- 9 .....  A- Z .....  a- z ....
对应的16进制ASCII码 --29 30-39 3A-40 41-5A 5B-60 61-7A 7B--
对应的10进制ASCII码 --41 48-57 58-64 65-90 91-96 97-122 123-

加密字串(作者固化到程序中的一串加密用的字符串,呵呵,蛮亲密的,它保存于Public.dll中,不同版本略有区别)
           ILOVEMYGIRLFRIENDZHENGYANRONG
我的机器码:0A3R8C7EFY9EFSFN0E0T000686
计算的结果:yG243Hn2IEu3DJ30tOxA4wiwvd

用16进制ASCII表示则是:
加密字串:49 4C 4F 56 45 4D 59 47 49 52 4C 46 52 49 45 4E 44 5A 48 45 4E 47 59 41 4E 52 4F 4E 47
机 器 码:30 41 33 52 38 43 37 45 46 59 39 45 46 53 46 4E 30 45 30 54 30 30 30 36 38 36
最后结果:79 47 32 34 33 48 6E 32 49 45 75 33 44 4A 33 30 74 4F 78 41 34 77 69 77 76 64

    又有些晕了是不是,比如加密字串的第一个字母是I(49),机器码的第一个字母是0(30),将他们异或 I(49) xor 0(30) =y(79),得到的是一个 y 的 ASCII,所以就将它作为第一位的注册码。再看第二位:L(4C) xor A(41) = 显示不出来(0D),因为 ASCII 码 0D 对应的字符不是数字也不是字母,所以要进行加减运算:0D<30,所以0D=0D+30=(3D),还不是所要的,于是 3D+0A=47。总之就是一个算法:异或得到的16进制数如果小于30,则加上30;如果大于7A,则减去7A;如果处于 3A-40 或 5B-60 之间,则加上0A。这样计算的目的就是为了保证结果一定是某一字母或数字的ASCII码。因此得到的注册码就是一串由大小写字母和数字组成的字符串,长度与机器码相同。
    接下来无非就是判断一下注册表中的注册码与它算出来的是否一致,不一致则关闭一些功能,一致则开启注册版的功能。我们可以用爆破的方法爆掉注册码的判断程序,使其永远都是注册版,但是如果这样的话,就不是本文的意思了,我们既然都知道了机器码如何算出注册码,何不做一个注册机自己算出真正的注册码呢。

=========================================================================

【破解总结】
    先别急,我们先来验证一下刚才的计算结果,新建一个文本文件,写入如内容:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\SuperGet2006\Enterprise10.25.201]
"RegCode"="yG243Hn2IEu3DJ30tOxA4wiwvd"

    保存为 reg 文件,导入注册表后运行程序,怎么样,是不是发现注册用的菜单都没了,使用上也没有了限制,看来注册码没有问题。那么,接下来就用VB写一个注册机吧(为什么用VB?因为我很喜欢VB啊):

=========================================================================
Private Sub cmdExit_Click()
    End
End Sub

Private Sub cmdRegFile_Click()
    On Error GoTo ErrorHandler
    Open "Register.reg" For Output As #1 '打开或生成文件
    Print #1, "Windows Registry Editor Version 5.00"
    Print #1,
    Print #1, "[HKEY_LOCAL_MACHINE\SOFTWARE\SuperGet2006\Enterprise10.25.201]"
    Print #1, Chr(34) + "RegCode" + Chr(34) + "=" + Chr(34) + txtSN.Text + Chr(34)
    Print #1,
    Close #1 '关闭文件
    If MsgBox("已在当前目录下生成 Register.reg 文件,立即导入到注册表完成注册吗?", 49, "提示") = vbOK Then
        Shell "regedit Register.reg", 1  '调用注册表编辑器导入注册信息
    End If
    Exit Sub
ErrorHandler:
    MsgBox "文件写入错误,请检查是否文件只读或者磁盘可写!", vbOKOnly, "错误"
End Sub

Private Sub txtID_Change()
    Dim IDLen As Integer '存储机器码长度
    Dim IDS As Integer '存储每一位机器码的ASCII值
    Dim EPS As Integer '存储每一位加密码的ASCII值
    Dim Rst As Integer '存储运算后的结果
    Dim EPT As String '存储加密码
    EPT = "ILOVEMYGIRLFRIENDZHENGYANRONG" '加密码
    txtID.MaxLength = Len(EPT)
    txtSN.Text = "" '清除原先显示的注册内容
    IDLen = Len(txtID.Text) '获取机器码长度
    If IDLen < 1 Then
        txtSN.Text = "请输入机器码"
        cmdRegFile.Enabled = False
        Exit Sub
    End If
    cmdRegFile.Enabled = True
    For i = 1 To IDLen '开始逐位运算
        IDS = Asc(Mid(txtID.Text, i, 1)) '取机器码的每一位
        EPS = Asc(Mid(EPT, i, 1))  '取加密码的每一位
        Rst = IDS Xor EPS '简单的异或加密运算
        If Rst > 122 Then Rst = Rst - 122 'ASCII码限制转换
        If Rst < 48 Then Rst = Rst + 48
        If Rst > 57 And Rst < 65 Then Rst = Rst + 10
        If Rst > 90 And Rst < 97 Then Rst = Rst + 10
        txtSN.Text = txtSN.Text & Chr(Rst) '得到注册码
    Next i
Exit Sub
End Sub

Private Sub txtID_KeyPress(KeyAscii As Integer) '用于输入机器码的过滤
    If (KeyAscii < 48) Or (KeyAscii > 57 And KeyAscii < 65) Or (KeyAscii > 90 And KeyAscii < 97) Or (KeyAscii > 122) Then '如果输入的不是数字与字母
        If KeyAscii <> 22 And KeyAscii <> 8 Then KeyAscii = 0: Beep '不是按下 Ctrl+V 和 Backspace 的话取消该次按键并发出声音警告
    End If
    If KeyAscii >= 97 And KeyAscii <= 122 Then KeyAscii = KeyAscii - 32 '将小写字母转换成大写字母
End Sub
=========================================================================

    以上程序可以适用于各个版本,只需略微改动加密字串和注册表路径即可。有兴趣你也可以都写入程序,做一个全系列注册机。版本区别如下:
2006 企业版 10.25.201:
加密字串:ILOVEMYGIRLFRIENDZHENGYANRONG
注册表路径:[HKEY_LOCAL_MACHINE\SOFTWARE\SuperGet2006\Enterprise10.25.201]

2006 专业版 10.25.201:
加密字串:PROFESSIONALILOVEMYGIRLFRIENDZHENGYANRONG
注册表路径:[HKEY_LOCAL_MACHINE\SOFTWARE\SuperGet2006\Profession10.25.201]

2006 个人版 10.25.201:
加密字串:ILOVEMYGIRLFRIENDZHENGYANRONG
注册表路径:[HKEY_LOCAL_MACHINE\SOFTWARE\SuperGet2006\Personal10.25.201]

=========================================================================

    也许有的人还会问,我是如何看出来上面那段ASCII码计算过程的。说实话,看了之后我也晕,主要还是凭借经验以及对汇编代码的熟悉程度推断出来的。总之,对于 Cracker 来说,最重要的还是经验以及运气,还有契而不舍的精神。希望高手们不要笑话我这个再简单不过的破文,也希望这篇文章能给初学者带来更多的收获。
    最后再啰嗦一句,虽然软件主要是以窃取 Google 的数据为基础,虽然作者要价很高,但毕竟软件里凝结了劳动的辛勤,请购买正版支持作者吧,不要将此文用作非法的目的,谢谢。(全文完)



另外我在网上找到了最新的2007版,可是发现注册算法没变,但是程序启动时不检查注册码了,跟了半天也没找到猫腻所在。看来作者意识到自己软件注册上的简陋了,呵呵。希望哪位DD或者看过此文的朋友帮忙分析一下2007版的注册过程,帖上来大家一起研究一下,谢谢了。
全球卫片超级下载2007 企业版 10.25.21 下载地址:http://www.onlinedown.net/soft/52016.htm

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (15)
雪    币: 244
活跃值: (28)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
shenhaiyu 3 2007-4-9 09:16
2
0
另外我在网上找到了最新的2007版,可是发现注册算法没变,但是程序启动时不检查注册码了,跟了半天也没找到猫腻所在。看来作者意识到自己软件注册上的简陋了,呵呵。希望哪位DD或者看过此文的朋友帮忙分析一下2007版的注册过程,帖上来大家一起研究一下,谢谢了。

全球卫片超级下载2007 企业版 10.25.21 下载地址:http://www.onlinedown.net/soft/52016.htm
雪    币: 28251
活跃值: (6675)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
风间仁 19 2007-4-9 12:19
3
0
xor字符串加密 ,再次学习。。
雪    币: 437
活跃值: (1319)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
tzl 10 2007-4-9 12:56
4
0
就软件本身来说没什么意思,不如直接用Google Earth,不过解密过程还是值得学习!
雪    币: 244
活跃值: (28)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
shenhaiyu 3 2007-4-9 13:56
5
0
楼上的错了,googleEarth只能看,不能下载,这个软件是用来下载的,还有2007版不会破了,哪位研究一下阿
雪    币: 437
活跃值: (1319)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
tzl 10 2007-4-9 15:25
6
0
需要哪里可以直接在googleEarth上截图啊..这个软件还要下载,真是郁闷
雪    币: 244
活跃值: (28)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
shenhaiyu 3 2007-4-9 15:31
7
0
截图,佩服,光一个北京市20级的清晰度图片就有上百张,一个一个截还得拼接估计一个礼拜能完成。这个软件不但能自动下载所有级别的图片,还可以自动拼接成大图,佩服楼上的耐心与勇气。
雪    币: 244
活跃值: (28)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
shenhaiyu 3 2007-4-9 15:33
8
0
呃,光顾着高兴了,没想到软件有暗桩。。。。。虽然显示注册成功,但下载的图像仍然不完整,服了作者了,看来正式注册用户也许会收到另一个完整的软件吧。
作为补偿,又破解了一个 GoogleMap 下载软件给大家,名叫 卫片快车,希望这个也好用,补丁下载见这里:http://bbs.chinapyg.com/viewthread.php?tid=14372&extra=page%3D1
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
verybigbug 2007-4-9 15:59
9
0
GoogleMap 不能用于商业用途的。这些软件已经违反了使用规则。看看他的key通知google.
雪    币: 234
活跃值: (61)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
benbentaiyang 1 2007-4-9 19:21
10
0
对这个字串感兴趣:
ILOVEMYGIRLFRIENDZHENGYANRONG
I love my girlfriend zhengyanrong.(我爱我的女朋友郑艳蓉),呵呵,这个翻译成明文好玩!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scuCBJ 2007-4-9 22:45
11
0
支持,说得很详细,请楼主多发表,喜欢详细明白的学习资料
再支持一下,楼主好人
雪    币: 244
活跃值: (28)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
shenhaiyu 3 2007-4-10 09:33
12
0
没有哪位DD帮我看看如何完美破解么?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aaak 2007-4-16 13:08
13
0
给的卫片破解进不去呀
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
虾米 1 2007-7-16 21:58
14
0
佩服,高手!!!!
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2007-7-17 00:51
15
0
为啥没有Virtual Machine 呢。。。
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 10 2007-7-17 09:50
16
0
Google Map API而已。 你买个linence也能写出来。lz是搞GIS的?
游客
登录 | 注册 方可回帖
返回