发言人: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");
}
}