• 标 题:处子之作(心梦网页特效精灵6.0 XP特别版) (1千字)
  • 作 者:NewHand  
  • 时 间:2003-11-07 22:12:25
  • 链 接:http://bbs.pediy.com

发言人:NewHand[BCG]
研究目标:心梦网页特效精灵6.0 XP特别版
使用工具:olldbg、trw2000、filemon、Regmon、FI、Import REConstructo
软件保护方式:使用次数限制、自校验防脱壳、两重注册码验证
工作平台:Win98
软件评级:不难不易(典型的明码比较)
下载地址:自己用搜索引擎找
展示内容:手动脱壳、解除自校验、爆破、解除使用次数限制、注册机和算法。
研究原因:首次加入BCG,觉得应该勇于实践,展示自我,让别人指正我的不足,
          促进自我与爱好者的技术交流,学人之长,补已之短,若有更好的方法,望不吝赐教。
声明:可能网上已经有人破解了,但本文绝对是本人独立完成的,如有雷同,实属不幸。。。
      本文只是研究学习交流技术,别无它意,请不要用作不法用途,否则后果本人概不负责。
      内容已经容写得相当详细,希望能对一些和我一起的初学者有点帮助。很多人会写“高手莫入”,
      其意图相当明显,何必这么狡猾,我觉得只要是用心去写,哪怕是普通的,也会得到别人的尊重和帮助!

我对策的方式(仅供参考,你完全可以按你的方式去DO--毕竟行行出状元):
        了解: 看看说明,运行一下该软件先,大概知道一下都有些什么功能以及注册方法等等...
        侦测:可用FI、Pe-scan、PEiD等侦测工具,测试软件是否加壳或加密方式。
(可选)脱壳:软件加壳的可用脱壳软件解除或手动脱壳(本人刚刚入行,正努力学习中。。。)
              脱壳后有自校验的除之,有Anti-dbg的就小心了(我也没有什么心得经验,也想学…)
(可选)静态分析:脱壳后可根据软件编译语言,用w32dasm等或对应反汇编、反编译工具进行静态分析(看你哪样在行裸)
(可选)动态跟踪:olldbg和trw2000结合:trw2000使用稳定、灵活(要走要跟任我行),OD信息详尽丰富,满足你瞬间的视野(接近目的地附近)。


若你是个不爱记断点函数或经常一时忘记要下函数名字,就要记Hmemcpy,用trw2000的Hmemcpy断下,
                  用F12和F10配合使用令其返回程序领空(记下断点)----做“探子”,用olldbg--做“武将”在(记下断点)下断,中断后进行
                  粗略跟踪,有头绪就进行细跟踪,没头绪就再来,如此是也,然后就要看看“主帅”的你怎么看怎么办。。。

施工过程:
一、【手动脱壳】:
用olldbg加载程序,提示有压缩加密,选择“否”,开始我们手动脱壳之旅…
00585001 > 60               PUSHAD                                    看…Aspak的压栈标志
00585002   E8 72050000      CALL SM60.00585579
00585007   EB 33            JMP SHORT SM60.0058503C
00585009   87DB             XCHG EBX,EBX
0058500B   90               NOP
省略部分代码。。。在搜索“命令”Ctrl+F,填写“POPAD”向下进行搜索,可找到如下特征:
005854F3   61               POPAD                                     看…Aspak的出栈标志,它解压完毕了,就要返回程序入口
005854F4   75 08            JNZ SHORT SM60.005854FE
005854F6   B8 01000000      MOV EAX,1
005854FB   C2 0C00          RETN 0C
005854FE   68 90654D00      PUSH SM60.004D6590                        这里保存程序入口的地址
00585503   C3               RETN                                      按一下F8,就可抵达程序入口进行Dump,要记住入口地址,以后可能有用。
若Dump出的File不能运行,运行原程序(最好是在OEP处挂起),可用Import REConstructo等PE工具进行修复,全Yes后就选Dump出的File进行Fix,这样可以运行了。

二、【脱壳后解除自校验】:
软件本身自校验----跳出对话,告知文件被破坏,不予运行。出现这种情况,你就crack这对话框,一般问题就解决了。
分析:①软件的这种自校验肯定是在程序开始运行的时候就要比较的,所以这段代码一定在程序的入口不远处。
      ②另外,在“GetFileSize函数”等获取文件大小的函数上下断点,返回程序领空进行跟踪,
        往后看见“JE或JNE”可尝试修改,校验可能从此消失!
      ③自校验的地方可能不止一个,你就要逐一进行击破,哈哈,要给些耐性哦!
004D6590 > $ 55             PUSH EBP                                 
004D6591   . 8BEC           MOV EBP,ESP
004D6593   . 83C4 F0        ADD ESP,-10
004D6596   . 53             PUSH EBX
004D6597   . B8 D8614D00    MOV EAX,SM6.004D61D8
004D659C   . E8 BF08F3FF    CALL SM6.00406E60
004D65A1   . 8B1D D8954D00  MOV EBX,DWORD PTR DS:[4D95D8]              SM6.004DAC38
004D65A7   . 8B03           MOV EAX,DWORD PTR DS:[EBX]
004D65A9   . E8 BAECF8FF    CALL SM6.00465268
004D65AE   . 8B03           MOV EAX,DWORD PTR DS:[EBX]
004D65B0   . BA 30664D00    MOV EDX,SM6.004D6630
004D65B5   . E8 BAE8F8FF    CALL SM6.00464E74
004D65BA   . 8B0D F4944D00  MOV ECX,DWORD PTR DS:[4D94F4]              SM6.004DAFA4
004D65C0   . 8B03           MOV EAX,DWORD PTR DS:[EBX]
004D65C2   . 8B15 4C194D00  MOV EDX,DWORD PTR DS:[4D194C]              SM6.004D1998
004D65C8   . E8 B3ECF8FF    CALL SM6.00465280                          1号校验call,过了Call,出现警告,多么友善啊!跟入看看,往后还有同样的4个call。
进入CALL SM6.00465280...来到
004652A8   . 8BCE           MOV ECX,ESI
004652AA     83CA FF        OR EDX,FFFFFFFF
004652AD   . 8BC3           MOV EAX,EBX                                这里修改edx为0,可kill校验,但不妥,往后有4个同样的call要进入这里,结果令要提交作者的所有注册信息为空
004652AF   . 8B38           MOV EDI,DWORD PTR DS:[EAX]
004652B1   . FF57 2C        CALL DWORD PTR DS:[EDI+2C]                 2号校验call过了Call,出现警告。
这里按上述的方式你可以一层一层地去验证,定会找到最关键的校验跳转(可能挺艰苦的)。
我是用了②进行解决的:
省略部分代码。。。按原文件大小直接修改GetFileSize的返回值,虽然能逃过自校验,但有地址访问问题弹出(可能其它地方都要调用它),所以要找出校验关键跳转点,按着顺序你会来到这里
004D3302  |. B9 443A4D00    MOV ECX,SM6.004D3A44                       准备装入“CRC6.dll”
004D3307  |. E8 381AF3FF    CALL SM6.00404D44
004D330C  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]

004D33B0  |. 52             PUSH EDX                                  /Arg2 => 00000000
004D33B1  |. 50             PUSH EAX                                  |Arg1
004D33B2  |. 8D95 14FEFFFF  LEA EDX,DWORD PTR SS:[EBP-1EC]            |
004D33B8  |. B8 08000000    MOV EAX,8                                 |
004D33BD  |. E8 665EF3FF    CALL SM6.00409228                         \SM6.00409228
004D33C2  |. 8B85 14FEFFFF  MOV EAX,DWORD PTR SS:[EBP-1EC]
004D33C8  |. 8D95 18FEFFFF  LEA EDX,DWORD PTR SS:[EBP-1E8]
004D33CE  |. E8 65F0FFFF    CALL SM6.004D2438
004D33D3  |. 8B85 18FEFFFF  MOV EAX,DWORD PTR SS:[EBP-1E8]
004D33D9  |. 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10]
004D33DC  |. E8 5B1AF3FF    CALL SM6.00404E3C
004D33E1     74 16          JE SHORT SM6.004D33F9                      ***********校验关键跳转点,可改成JMP**********


三、【爆破、解除使用次数限制】:
启动比较注册码:(一般用filemon、Regmon等可以检测程序要读取什么,然后就搜索它字符参考位置下断点进行跟踪,若遇上利害的Anti-dbg就麻烦了!)
004D2D23  |. BA 742E4D00    MOV EDX,SM6.004D2E74                       ASCII "Software\smsoft\sm6xp"
004D2D28  |. 8BC3           MOV EAX,EBX
004D2D2A  |. E8 B5FCF9FF    CALL SM6.004729E4
004D2D2F  |. 8D4D F8        LEA ECX,DWORD PTR SS:[EBP-8]
004D2D32  |. BA 942E4D00    MOV EDX,SM6.004D2E94                       ASCII "sm6sn"
004D2D37  |. 8BC3           MOV EAX,EBX
004D2D39  |. E8 8EFEF9FF    CALL SM6.00472BCC                          启动时装入注册表假码
004D2D3E  |. 33C0           XOR EAX,EAX
004D2D40  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
004D2D43  |. 68 A42E4D00    PUSH SM6.004D2EA4                          ASCII "S6L"
省略部分代码。。。
004D2E28  |. E8 8B1FF3FF    CALL SM6.00404DB8                          启动时最后生成真注册码的call
004D2E2D  |. 8B55 D8        MOV EDX,DWORD PTR SS:[EBP-28]
004D2E30  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004D2E33  |. E8 0420F3FF    CALL SM6.00404E3C                          启动时真假注册码比较的call
004D2E38     75 04          JNZ SHORT SM6.004D2E3E                     ***不能跳,爆破点***
004D2E3A  |. B3 01          MOV BL,1

启动时检测使用限制次数
004D0368  /$ 55             PUSH EBP                                   启动后不进行注册就Call 4D07A7或4D0C3F来到这
省略部分代码。。。
004D0399  |. BA 0C044D00    MOV EDX,SM6.004D040C                       ASCII "Software\Microsoft\Windows\CurrentVersion\Telephony\temp"
004D039E  |. 8BC6           MOV EAX,ESI
004D03A0  |. E8 3F26FAFF    CALL SM6.004729E4
004D03A5  |. BA 50044D00    MOV EDX,SM6.004D0450                       ASCII "smyx"
004D03AA  |. 8BC6           MOV EAX,ESI
004D03AC  |. E8 B329FAFF    CALL SM6.00472D64
004D03B1  |. 84C0           TEST AL,AL
004D03B3  |. 74 24          JE SHORT SM6.004D03D9
004D03B5  |. 8D4D FC        LEA ECX,DWORD PTR SS:[EBP-4]
004D03B8  |. BA 50044D00    MOV EDX,SM6.004D0450                       ASCII "smyx"
004D03BD  |. 8BC6           MOV EAX,ESI
004D03BF  |. E8 0828FAFF    CALL SM6.00472BCC                          读取注册表限制使用次数的键值
004D03C4  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D03C7  |. E8 9C8EF3FF    CALL SM6.00409268
004D03CC  |. 3D A0000000    CMP EAX,0A0                                再次检测限制使用次数
004D03D1  |. 7E 04          JLE SHORT SM6.004D03D7                     这里可以改成“JMP”--解除使用次数限制

004D2A6C  /$ 55             PUSH EBP                                   启动时注册码已通过来自Call 4D40AD
省略部分代码。。。
004D2AA1  |. BA 442B4D00    MOV EDX,SM6.004D2B44                       ASCII "Software\Microsoft\Windows\CurrentVersion\Telephony\temp"
004D2AA6  |. 8BC6           MOV EAX,ESI
004D2AA8  |. E8 37FFF9FF    CALL SM6.004729E4
004D2AAD  |. 8D4D F8        LEA ECX,DWORD PTR SS:[EBP-8]
004D2AB0  |. BA 882B4D00    MOV EDX,SM6.004D2B88                       ASCII "smyx"
004D2AB5  |. 8BC6           MOV EAX,ESI
004D2AB7  |. E8 1001FAFF    CALL SM6.00472BCC                          启动时注册码已通过,读取注册表使用次数限制键值的Call
004D2ABC  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004D2ABF  |. E8 A467F3FF    CALL SM6.00409268
004D2AC4     83C0 08        ADD EAX,8                                  ***运行1次就累加使用次数限制值--爆破点可nop掉它①***
004D2AC7  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
004D2ACA  |. E8 B966F3FF    CALL SM6.00409188
004D2ACF  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004D2AD2  |. BA 882B4D00    MOV EDX,SM6.004D2B88                       ASCII "smyx"
004D2AD7  |. 8BC6           MOV EAX,ESI
004D2AD9  |. E8 C200FAFF    CALL SM6.00472BA0                          增加后的键值装入注册表的Call
004D2ADE  |. 8D4D F4        LEA ECX,DWORD PTR SS:[EBP-C]
004D2AE1  |. BA 882B4D00    MOV EDX,SM6.004D2B88                       ASCII "smyx"
004D2AE6  |. 8BC6           MOV EAX,ESI
004D2AE8  |. E8 DF00FAFF    CALL SM6.00472BCC
004D2AED  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
004D2AF0  |. E8 7367F3FF    CALL SM6.00409268
004D2AF5  |. 3D A8000000    CMP EAX,0A8                                检测是否使用过期
004D2AFA  |. 7E 04          JLE SHORT SM6.004D2B00                     这里可以改成“JMP”--解除使用次数限制

省略部分代码。。。
004D2C29  |> 8D4D F4        LEA ECX,DWORD PTR SS:[EBP-C]
004D2C2C  |. BA D42C4D00    MOV EDX,SM6.004D2CD4                       ASCII "smyx"
004D2C31  |. 8BC6           MOV EAX,ESI
004D2C33  |. E8 94FFF9FF    CALL SM6.00472BCC
004D2C38  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
004D2C3B  |. E8 2866F3FF    CALL SM6.00409268                          过了这个Call就在注册表你的使用次数限制
004D2C40  |. A3 A8AF4D00    MOV DWORD PTR DS:[4DAFA8],EAX
004D2C45  |. 813D A8AF4D00 >CMP DWORD PTR DS:[4DAFA8],0A0              比较已运行使用次数
004D2C4F  |. 7E 04          JLE SHORT SM6.004D2C55                     少于等于限制次数可乐了,否则别想美了,可改成Jmp
进行注册部分:
004D095E   . E8 B949F7FF    CALL SM6.0044531C
004D0963   . 837D FC 00     CMP DWORD PTR SS:[EBP-4],0                 比较判断注册码输入是否为空
004D0967   . 74 14          JE SHORT SM6.004D097D                      跳就叫你再输入
004D0969   . 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
004D096C   . 8B83 14030000  MOV EAX,DWORD PTR DS:[EBX+314]
004D0972   . E8 A549F7FF    CALL SM6.0044531C
004D0977   . 837D F8 00     CMP DWORD PTR SS:[EBP-8],0                 比较判断用户名输入是否为空
004D097B   . 75 1D          JNZ SHORT SM6.004D099A                     跳就叫你再输入
004D097D   > 6A 40          PUSH 40
004D097F   . B9 840B4D00    MOV ECX,SM6.004D0B84
004D0984   . BA 8C0B4D00    MOV EDX,SM6.004D0B8C
004D0989   . A1 D8954D00    MOV EAX,DWORD PTR DS:[4D95D8]
004D098E   . 8B00           MOV EAX,DWORD PTR DS:[EAX]
004D0990   . E8 FB4AF9FF    CALL SM6.00465490
004D0995   . E9 79010000    JMP SM6.004D0B13
004D099A   > 8BC3           MOV EAX,EBX
004D099C   . E8 27FEFFFF    CALL SM6.004D07C8                          *****计算比较注册码的关键call****
004D09A1   . 84C0           TEST AL,AL
004D09A3     0F84 5E010000  JE SM6.004D0B07                            ****判断是否写注册码,跳就不写(往下看不就一清二楚)***
004D09A9   . 6A 40          PUSH 40
004D09AB   . B9 840B4D00    MOV ECX,SM6.004D0B84
004D09B0   . BA BC0B4D00    MOV EDX,SM6.004D0BBC
004D09B5   . A1 D8954D00    MOV EAX,DWORD PTR DS:[4D95D8]
004D09BA   . 8B00           MOV EAX,DWORD PTR DS:[EAX]
004D09BC   . E8 CF4AF9FF    CALL SM6.00465490                          提示注册成功的call
004D09C1   . B2 01          MOV DL,1
004D09C3   . A1 E0274700    MOV EAX,DWORD PTR DS:[4727E0]
004D09C8   . E8 131FFAFF    CALL SM6.004728E0
004D09CD   . 8BF0           MOV ESI,EAX
004D09CF   . BA 02000080    MOV EDX,80000002
004D09D4   . 8BC6           MOV EAX,ESI
004D09D6   . E8 A51FFAFF    CALL SM6.00472980
004D09DB   . B1 01          MOV CL,1
004D09DD   . BA D40B4D00    MOV EDX,SM6.004D0BD4                       ASCII "Software\smsoft\sm6xp"
004D09E2   . 8BC6           MOV EAX,ESI
004D09E4   . E8 FB1FFAFF    CALL SM6.004729E4
004D09E9   . 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
004D09EC   . 8B83 10030000  MOV EAX,DWORD PTR DS:[EBX+310]
004D09F2   . E8 2549F7FF    CALL SM6.0044531C
004D09F7   . 8B4D F4        MOV ECX,DWORD PTR SS:[EBP-C]               装入假码
004D09FA   . BA F40B4D00    MOV EDX,SM6.004D0BF4                       ASCII "sm6sn"
004D09FF   . 8BC6           MOV EAX,ESI
004D0A01   . E8 9A21FAFF    CALL SM6.00472BA0                          写假码入注册表的call



进行认证码检测(触发条件:过160就过期):......\smyx 运行1次注册表存放的此键值加8,
......\sm6rz 注册表存放验证码的地方 
004D2902  |> 8D45 EC        /LEA EAX,DWORD PTR SS:[EBP-14]
004D2905  |. 50             |PUSH EAX
004D2906  |. B9 01000000    |MOV ECX,1
004D290B  |. 8BD6           |MOV EDX,ESI
004D290D  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]              装入code1
004D2910  |. E8 3B26F3FF    |CALL SM6.00404F50
004D2915  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]             code1逐位装入eax
004D2918  |. E8 D325F3FF    |CALL SM6.00404EF0
004D291D  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]
004D291F  |. 8845 F3        |MOV BYTE PTR SS:[EBP-D],AL
004D2922  |. 8D55 E8        |LEA EDX,DWORD PTR SS:[EBP-18]
004D2925  |. 33C0           |XOR EAX,EAX
004D2927  |. 8A45 F3        |MOV AL,BYTE PTR SS:[EBP-D]                code1逐位装入al
004D292A  |. E8 5968F3FF    |CALL SM6.00409188                         生成对应验证码
004D292F  |. 8B55 E8        |MOV EDX,DWORD PTR SS:[EBP-18]             验证码凑2位入edx
004D2932  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
004D2935  |. E8 C623F3FF    |CALL SM6.00404D00                         验证码进行连接
004D293A  |. 46             |INC ESI
004D293B  |. 4B             |DEC EBX
004D293C  |.^75 C4          \JNZ SHORT SM6.004D2902
004D293E  |> B2 01          MOV DL,1                                   生成前部分认证码code=(计算code1)
004D2940  |. A1 E0274700    MOV EAX,DWORD PTR DS:[4727E0]
004D2945  |. E8 96FFF9FF    CALL SM6.004728E0
004D294A  |. 8BD8           MOV EBX,EAX
004D294C  |. BA 01000080    MOV EDX,80000001
004D2951  |. 8BC3           MOV EAX,EBX
004D2953  |. E8 2800FAFF    CALL SM6.00472980
004D2958  |. B1 01          MOV CL,1
004D295A  |. BA 0C2A4D00    MOV EDX,SM6.004D2A0C                       ASCII "Software\Microsoft\Windows\CurrentVersion\rzsm6"
004D295F  |. 8BC3           MOV EAX,EBX
004D2961  |. E8 7E00FAFF    CALL SM6.004729E4
004D2966  |. BA 442A4D00    MOV EDX,SM6.004D2A44                       ASCII "sm6rz"
004D296B  |. 8BC3           MOV EAX,EBX
004D296D  |. E8 F203FAFF    CALL SM6.00472D64
004D2972  |. 84C0           TEST AL,AL
004D2974  |. 75 13          JNZ SHORT SM6.004D2989                     认证码为0就将ASCII "7211213"写入注册表
004D2976  |. B9 542A4D00    MOV ECX,SM6.004D2A54                       ASCII "7211213"
004D297B  |. BA 442A4D00    MOV EDX,SM6.004D2A44                       ASCII "sm6rz"
004D2980  |. 8BC3           MOV EAX,EBX
004D2982  |. E8 1902FAFF    CALL SM6.00472BA0
004D2987  |. EB 32          JMP SHORT SM6.004D29BB
004D2989  |> 8D4D E4        LEA ECX,DWORD PTR SS:[EBP-1C]
004D298C  |. BA 442A4D00    MOV EDX,SM6.004D2A44                       ASCII "sm6rz"
004D2991  |. 8BC3           MOV EAX,EBX
004D2993  |. E8 3402FAFF    CALL SM6.00472BCC                          装入认证码(假码)的call
004D2998  |. 8B45 E4        MOV EAX,DWORD PTR SS:[EBP-1C]
004D299B  |. 50             PUSH EAX
004D299C  |. 8D45 E0        LEA EAX,DWORD PTR SS:[EBP-20]
004D299F  |. B9 642A4D00    MOV ECX,SM6.004D2A64                       ASCII "0381"
004D29A4  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
004D29A7  |. E8 9823F3FF    CALL SM6.00404D44                          连接认证码:认证码格式--(code+0381)
004D29AC  |. 8B55 E0        MOV EDX,DWORD PTR SS:[EBP-20]
004D29AF  |. 58             POP EAX
004D29B0  |. E8 8724F3FF    CALL SM6.00404E3C                          比较真假认证码的call
004D29B5     75 04          JNZ SHORT SM6.004D29BB                     ***比较验证码的关键跳转--爆破点***


计算注册码算法部分: 
004D2D39  |. E8 8EFEF9FF    CALL SM6.00472BCC                          启动时装入注册表假码
004D2D3E  |. 33C0           XOR EAX,EAX
004D2D40  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX               下面一行就是算法开始了
004D2D43  |. 68 A42E4D00    PUSH SM6.004D2EA4                          ASCII "S6L"
004D2D48  |. 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
004D2D4B  |. B0 63          MOV AL,63
004D2D4D  |. E8 D2F4FFFF    CALL SM6.004D2224                          生成8位数据code1(即C盘卷标值)
004D2D52  |. FF75 F0        PUSH DWORD PTR SS:[EBP-10]
004D2D55  |. 68 B02E4D00    PUSH SM6.004D2EB0
004D2D5A  |. 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
004D2D5D  |. B0 64          MOV AL,64
004D2D5F  |. E8 C0F4FFFF    CALL SM6.004D2224                          生成8位数据code2(即D盘卷标值)
004D2D64  |. FF75 EC        PUSH DWORD PTR SS:[EBP-14]
004D2D67  |. 68 BC2E4D00    PUSH SM6.004D2EBC
004D2D6C  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004D2D6F  |. BA 05000000    MOV EDX,5
004D2D74  |. E8 3F20F3FF    CALL SM6.00404DB8                          按"S6L"+code1+'J'+code2+'L'形式进行连接形成机器码
004D2D79  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
004D2D7C  |. E8 771FF3FF    CALL SM6.00404CF8                          大概是取机器码的长度
004D2D81  |. 8BD8           MOV EBX,EAX
004D2D83  |. 85DB           TEST EBX,EBX
004D2D85  |. 7E 64          JLE SHORT SM6.004D2DEB
004D2D87  |. BE 01000000    MOV ESI,1
004D2D8C  |> 8D45 E8        /LEA EAX,DWORD PTR SS:[EBP-18]
004D2D8F  |. 50             |PUSH EAX
004D2D90  |. 68 A42E4D00    |PUSH SM6.004D2EA4                         ASCII "S6L"
004D2D95  |. 8D55 E0        |LEA EDX,DWORD PTR SS:[EBP-20]
004D2D98  |. B0 63          |MOV AL,63
004D2D9A  |. E8 85F4FFFF    |CALL SM6.004D2224                         取code1
004D2D9F  |. FF75 E0        |PUSH DWORD PTR SS:[EBP-20]
004D2DA2  |. 68 B02E4D00    |PUSH SM6.004D2EB0
004D2DA7  |. 8D55 DC        |LEA EDX,DWORD PTR SS:[EBP-24]
004D2DAA  |. B0 64          |MOV AL,64
004D2DAC  |. E8 73F4FFFF    |CALL SM6.004D2224                         取code2
004D2DB1  |. FF75 DC        |PUSH DWORD PTR SS:[EBP-24]
004D2DB4  |. 68 BC2E4D00    |PUSH SM6.004D2EBC
004D2DB9  |. 8D45 E4        |LEA EAX,DWORD PTR SS:[EBP-1C]
004D2DBC  |. BA 05000000    |MOV EDX,5
004D2DC1  |. E8 F21FF3FF    |CALL SM6.00404DB8
004D2DC6  |. 8B45 E4        |MOV EAX,DWORD PTR SS:[EBP-1C]
004D2DC9  |. B9 01000000    |MOV ECX,1
004D2DCE  |. 8BD6           |MOV EDX,ESI
004D2DD0  |. E8 7B21F3FF    |CALL SM6.00404F50
004D2DD5  |. 8B45 E8        |MOV EAX,DWORD PTR SS:[EBP-18]
004D2DD8  |. E8 1321F3FF    |CALL SM6.00404EF0
004D2DDD  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]
004D2DDF  |. 25 FF000000    |AND EAX,0FF
004D2DE4  |. 0145 FC        |ADD DWORD PTR SS:[EBP-4],EAX
004D2DE7  |. 46             |INC ESI
004D2DE8  |. 4B             |DEC EBX
004D2DE9  |.^75 A1          \JNZ SHORT SM6.004D2D8C
004D2DEB  |> 68 C82E4D00    PUSH SM6.004D2EC8                          ASCII "L6A"
004D2DF0  |. 8D55 D4        LEA EDX,DWORD PTR SS:[EBP-2C]
004D2DF3  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D2DF6  |. 8D0440         LEA EAX,DWORD PTR DS:[EAX+EAX*2]
004D2DF9  |. E8 8A63F3FF    CALL SM6.00409188
004D2DFE  |. FF75 D4        PUSH DWORD PTR SS:[EBP-2C]                 第一部分注册码M1
004D2E01  |. 68 D42E4D00    PUSH SM6.004D2ED4                          ASCII "1213"
004D2E06  |. 68 E42E4D00    PUSH SM6.004D2EE4                          ASCII "XU"
004D2E0B  |. 8D55 D0        LEA EDX,DWORD PTR SS:[EBP-30]
004D2E0E  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D2E11  |. 03C0           ADD EAX,EAX
004D2E13  |. E8 7063F3FF    CALL SM6.00409188
004D2E18  |. FF75 D0        PUSH DWORD PTR SS:[EBP-30]                 第二部分注册码M2
004D2E1B  |. 68 F02E4D00    PUSH SM6.004D2EF0                          ASCII "721"
004D2E20  |. 8D45 D8        LEA EAX,DWORD PTR SS:[EBP-28]
004D2E23  |. BA 06000000    MOV EDX,6
004D2E28  |. E8 8B1FF3FF    CALL SM6.00404DB8                          启动时最后生成真注册码的call,注册码形式就是L6A+M1+1213XU+M2+721
004D2E2D  |. 8B55 D8        MOV EDX,DWORD PTR SS:[EBP-28]
004D2E30  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004D2E33  |. E8 0420F3FF    CALL SM6.00404E3C                          启动时真假注册码比较的call
004D2E38     75 04          JNZ SHORT SM6.004D2E3E                     *****注册码正确,不能跳*****

计算注册码算法细节部分:
004D07FC  |. E8 1B4BF7FF    CALL SM6.0044531C                                取机器码的call
004D0801  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]                     机器码装入eax
004D0804  |. E8 EF44F3FF    CALL SM6.00404CF8
004D0809  |. 8BD8           MOV EBX,EAX
004D080B  |. 85DB           TEST EBX,EBX
004D080D  |. 7E 3F          JLE SHORT SM6.004D084E
004D080F  |. BE 01000000    MOV ESI,1
004D0814  |> 8D45 F0        /LEA EAX,DWORD PTR SS:[EBP-10]
004D0817  |. 50             |PUSH EAX
004D0818  |. 8D55 EC        |LEA EDX,DWORD PTR SS:[EBP-14]
004D081B  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
004D081E  |. 8B80 0C030000  |MOV EAX,DWORD PTR DS:[EAX+30C]
004D0824  |. E8 F34AF7FF    |CALL SM6.0044531C
004D0829  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]                   机器码装入eax
004D082C  |. B9 01000000    |MOV ECX,1
004D0831  |. 8BD6           |MOV EDX,ESI
004D0833  |. E8 1847F3FF    |CALL SM6.00404F50
004D0838  |. 8B45 F0        |MOV EAX,DWORD PTR SS:[EBP-10]
004D083B  |. E8 B046F3FF    |CALL SM6.00404EF0
004D0840  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]
004D0842  |. 25 FF000000    |AND EAX,0FF
004D0847  |. 0145 F8        |ADD DWORD PTR SS:[EBP-8],EAX
004D084A  |. 46             |INC ESI
004D084B  |. 4B             |DEC EBX
004D084C  |.^75 C6          \JNZ SHORT SM6.004D0814                          此循环是计算机器码的字节和
004D084E  |> 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18]
004D0851  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004D0854  |. 8B80 10030000  MOV EAX,DWORD PTR DS:[EAX+310]
004D085A  |. E8 BD4AF7FF    CALL SM6.0044531C                                呼出假码
004D085F  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]                    假码装入eax
004D0862  |. 50             PUSH EAX
004D0863  |. 68 F8084D00    PUSH SM6.004D08F8                                ASCII "L6A"
004D0868  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]                    机器码的字节和(sum)
004D086B  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]                     M1-参算码=机器码的字节和*3
004D086E  |. 8D0440         LEA EAX,DWORD PTR DS:[EAX+EAX*2]
004D0871  |. E8 1289F3FF    CALL SM6.00409188                                生成M1
004D0876  |. FF75 E0        PUSH DWORD PTR SS:[EBP-20]
004D0879  |. 68 04094D00    PUSH SM6.004D0904                                ASCII "1213"
004D087E  |. 68 14094D00    PUSH SM6.004D0914                                ASCII "XU"
004D0883  |. 8D55 DC        LEA EDX,DWORD PTR SS:[EBP-24]
004D0886  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]                     机器码的字节和(sum)
004D0889  |. 03C0           ADD EAX,EAX                                      M2-参算码=机器码的字节和*2
004D088B  |. E8 F888F3FF    CALL SM6.00409188                                生成M2
004D0890  |. FF75 DC        PUSH DWORD PTR SS:[EBP-24]
004D0893  |. 68 20094D00    PUSH SM6.004D0920                                ASCII "721"
004D0898  |. 8D45 E4        LEA EAX,DWORD PTR SS:[EBP-1C]
004D089B  |. BA 06000000    MOV EDX,6
004D08A0  |. E8 1345F3FF    CALL SM6.00404DB8                                计算组装注册码的call
004D08A5  |. 8B55 E4        MOV EDX,DWORD PTR SS:[EBP-1C]
004D08A8  |. 58             POP EAX
004D08A9  |. E8 8E45F3FF    CALL SM6.00404E3C                                关键注册码比较call
004D08AE  |. 75 04          JNZ SHORT SM6.004D08B4


五、【注册机和算法】:
机器码="S6L"+变code1+'J'+变code2+'L'(21位)
注册码="L6A"+M1+"1213XU"+M2+"721"
认证码=code+"0381"
Sum=机器码的字节和
M1-参算码=sum*3
M2-参算码=sum*2
code1=(C盘卷标值)
M1、M2和(code1每位)都是参与计算注册码和认证码的部分

公共计算参算码的代码部分:
省略大量代码。。。跟踪算码部分来到这个关键地方。。。
eax装入参算码(被除数)
00409DEE  |$ B9 0A000000    MOV ECX,0A                                 置除数Ah
00409DF3  |> 8D75 9F        LEA ESI,DWORD PTR SS:[EBP-61]
00409DF6  |> 31D2           /XOR EDX,EDX                               余数位置清零
00409DF8  |. F7F1           |DIV ECX                                   eax/A
00409DFA  |. 80C2 30        |ADD DL,30                                 余数+30h
00409DFD  |. 80FA 3A        |CMP DL,3A
00409E00  |. 72 03          |JB SHORT SM6.00409E05                     >=3Ah,dl+7h
00409E02  |. 80C2 07        |ADD DL,7                                
00409E05  |> 4E             |DEC ESI
00409E06  |. 8816           |MOV BYTE PTR DS:[ESI],DL                  结果放入预定位置(注意:顺序为倒序)
00409E08  |. 09C0           |OR EAX,EAX
00409E0A  |.^75 EA          \JNZ SHORT SM6.00409DF6                    被除数为0就结束


下面是我在Turbo C下勉强通过的算法注册机:欢迎指正(语病、精简、更好的便径)
#include 
#include 

unsigned int r,i;
unsigned char q[20];
unsigned int f(int n)
{i=0;
 while(n!=0)
   {r=n%0xa+0x30;
    n=n/0xa;
    if(r>=0x3A)
    {r+=7;}
    q[i]=r;
    i+=1;
   }
 return(q[0]);
}

main()
{unsigned int code_len,sum=0,r,i,j,n,m1,m2,temp;
unsigned char code[21],x,y,z,resn[8];
start: printf("\n");
         printf(" *************************************************************\n");
         printf("*            XXXX网页特效精灵6.0 XP特别版 KeyGen              *\n");
         printf("*                    Code by NewHand[BCG]                     *\n");
         printf("*   Copyright-2003 [BCG] All Rights Reserved    2003-10-30    *\n");
         printf(" *************************************************************\n");
printf("提示:\n注册码在主程序sm6.exe注册框输入!\n认证码在sm6reg.exe认证框输入!\n\n");
printf("请输入你的机器码:");
gets(code);
printf("\n");
code_len=strlen(code);
if(code_len!=21)
{
printf("\n你输入的机器码不对!\n\n");
goto start;
}
else
{for(i=0;i<=code_len;i++)
sum=sum+code[i];
m1=sum*3;
m2=sum*2;

printf("\n你的认证码是:");
for(i=0;i<=7;i++)
{resn[i]=code[3+i];
z=f(resn[i]);
printf("%c%c",q[1],q[0]);
}
printf("0381\n");

x=f(m1);
for(j=0;j<=strlen(q)/2;j++)
{temp=q[j];q[j]=q[strlen(q)-1-j];q[strlen(q)-1-j]=temp;
}
printf("\n你的注册码是:L6A");
printf("%s",q);
printf("1213XU");

y=f(m2);
for(j=0;j<=strlen(q)/2;j++)
{temp=q[j];q[j]=q[strlen(q)-1-j];q[strlen(q)-1-j]=temp;
}
printf("%s",q);
printf("721");
         printf("\n\n\n");
printf("              _/_/_/   _/_/_/   _/_/_/ \n");
printf("              _/  _/ _/     _/        \n");
printf("             _/_/_/  _/     _/ _/_/   \n");
printf("             _/  _/ _/     _/  _/    \n");
printf("            _/_/_/   _/_/_/   _/_/_/     \n");
}
}