【文章标题】: S-demo2.0注册流程分析
【文章作者】: noNaMe-mOnk
【软件名称】: S-demo2.0
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: c++
【使用工具】: od修改版
【操作平台】: xp
【软件介绍】: 经典的录像必备工具,不用多说了吧
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
at first,拿到手里的已经是破解版了,爆破的
手发痒,呵呵,把爆破点修复
用UltraEdit或winhex打开S-Recorder.exe,修改偏移量为0x7FD1处的代码75 1B为74 1B。
双击运行,首先一个要求注册的对话框,说试用时间over了,
输入注册名:noNaMe-mOnk
注册码:9876543210
点确定,Register Failure!
peid无壳
od载入
搜索字符参考
搜索Register Failure!下断
再次注册断下在
0040372D . 8D8D 3C0F0000 LEA ECX,DWORD PTR SS:[EBP+F3C]
00403733 . 8985 F00D0000 MOV DWORD PTR SS:[EBP+DF0],EAX
00403739 . E8 52A80000 CALL S-Record.0040DF90
0040373E . 85C0 TEST EAX,EAX
00403740 . 75 2B JNZ SHORT S-Record.0040376D
00403742 . 6A FF PUSH -1 ; /status = FFFFFFFF (-1.)
00403744 . FF15 E4934100 CALL DWORD PTR DS:[<&MSVCRT.exit>] ; \exit
0040374A > 6A 00 PUSH 0
0040374C . 68 9CD24100 PUSH S-Record.0041D29C ; ASCII "Register Failure!"*****这里
00403751 . 8BCD MOV ECX,EBP
向上看:
00403664 . 8BC8 MOV ECX,EAX
00403666 . 83E1 03 AND ECX,3
00403669 . F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
0040366B . 8D8C24 0401000>LEA ECX,DWORD PTR SS:[ESP+104]
00403672 . 51 PUSH ECX ; /Arg2
00403673 . 52 PUSH EDX ; |Arg1
00403674 . B9 C0E74200 MOV ECX,S-Record.0042E7C0 ; |
00403679 . E8 D24C0000 CALL S-Record.00408350 ; \S-Record.00408350*****关键call,跟进
0040367E . 85C0 TEST EAX,EAX
00403680 . 6A 00 PUSH 0
00403682 . 0F84 C2000000 JE S-Record.0040374A
00403688 . 8D8C24 A800000>LEA ECX,DWORD PTR SS:[ESP+A8]
0040368F . E8 1C520000 CALL S-Record.004088B0
00408350 /$ 81EC 34010000 SUB ESP,134
00408356 |. 53 PUSH EBX
00408357 |. 55 PUSH EBP
00408358 |. 56 PUSH ESI
00408359 |. 8BF1 MOV ESI,ECX
0040835B |. 57 PUSH EDI
0040835C |. 897424 10 MOV DWORD PTR SS:[ESP+10],ESI
00408360 |. E8 A9960000 CALL <JMP.&MFC42.#1168>
00408365 |. 8B8C24 4801000>MOV ECX,DWORD PTR SS:[ESP+148]
0040836C |. 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4]
0040836F |. 8B2D C0934100 MOV EBP,DWORD PTR DS:[<&MSVCRT.sprintf>] ; msvcrt.sprintf
00408375 |. 81C6 D4000000 ADD ESI,0D4
0040837B |. 56 PUSH ESI ; /<%s>
0040837C |. 51 PUSH ECX ; |<%s>
0040837D |. 8D9424 8400000>LEA EDX,DWORD PTR SS:[ESP+84] ; |
00408384 |. 68 C0D44100 PUSH S-Record.0041D4C0 ; |format = "%s%s"
00408389 |. 52 PUSH EDX ; |s
0040838A |. 894424 24 MOV DWORD PTR SS:[ESP+24],EAX ; |
0040838E |. FFD5 CALL EBP ; \连接name和机器码
00408390 |. 8B9C24 5C01000>MOV EBX,DWORD PTR SS:[ESP+15C]
00408397 |. 83C9 FF OR ECX,FFFFFFFF
0040839A |. 8BFB MOV EDI,EBX
0040839C |. 33C0 XOR EAX,EAX
0040839E |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
004083A0 |. F7D1 NOT ECX ; 注册码+1
004083A2 |. 2BF9 SUB EDI,ECX ; edi指向注册码
004083A4 |. 8D5424 28 LEA EDX,DWORD PTR SS:[ESP+28] ; 空指针
004083A8 |. 8BC1 MOV EAX,ECX ; 注册码+1到eax
004083AA |. 8BF7 MOV ESI,EDI ; esi指向注册码
004083AC |. 8BFA MOV EDI,EDX ; edi指向空指针
004083AE |. C1E9 02 SHR ECX,2 ; ecx右移两位:d到3
004083B1 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>; 移动注册码到esp+28
004083B3 |. 8BC8 MOV ECX,EAX ; 注册码+1到eax
004083B5 |. 83E1 03 AND ECX,3 ;
004083B8 |. F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004083BA |. 8D8C24 8C00000>LEA ECX,DWORD PTR SS:[ESP+8C]
004083C1 |. 51 PUSH ECX
004083C2 |. 53 PUSH EBX
004083C3 |. E8 48FCFFFF CALL S-Record.00408010 这里跟进
004083C8 |. 83C4 18 ADD ESP,18
004083CB |. BF D0D14100 MOV EDI,S-Record.0041D1D0 ; ASCII "Clayman" 这个很有意思,呵呵
004083D0 |. 8BF3 MOV ESI,EBX
004083D2 |> 8A16 /MOV DL,BYTE PTR DS:[ESI]
004083D4 |. 8A0F |MOV CL,BYTE PTR DS:[EDI]
004083D6 |. 8AC2 |MOV AL,DL
004083D8 |. 3AD1 |CMP DL,CL
004083DA |. 75 1E |JNZ SHORT S-Record.004083FA
004083DC |. 84C0 |TEST AL,AL
004083DE |. 74 16 |JE SHORT S-Record.004083F6
004083E0 |. 8A4E 01 |MOV CL,BYTE PTR DS:[ESI+1]
004083E3 |. 8A57 01 |MOV DL,BYTE PTR DS:[EDI+1]
004083E6 |. 8AC1 |MOV AL,CL
004083E8 |. 3ACA |CMP CL,DL
004083EA |. 75 0E |JNZ SHORT S-Record.004083FA
004083EC |. 83C6 02 |ADD ESI,2
004083EF |. 83C7 02 |ADD EDI,2
004083F2 |. 84C0 |TEST AL,AL
004083F4 |.^75 DC \JNZ SHORT S-Record.004083D2
004083F6 |> 33C0 XOR EAX,EAX
004083F8 |. EB 05 JMP SHORT S-Record.004083FF
004083FA |> 1BC0 SBB EAX,EAX
004083FC |. 83D8 FF SBB EAX,-1
004083FF |> 85C0 TEST EAX,EAX
00408401 |. 74 74 JE SHORT S-Record.00408477
00408403 |. 8B9424 4801000>MOV EDX,DWORD PTR SS:[ESP+148]
0040840A |. 68 08D54100 PUSH S-Record.0041D508 ; ASCII "29843710000"
0040840F |. 52 PUSH EDX
00408410 |. 8D8424 8400000>LEA EAX,DWORD PTR SS:[ESP+84]
00408417 |. 68 C0D44100 PUSH S-Record.0041D4C0 ; ASCII "%s%s"
0040841C |. 50 PUSH EAX
0040841D |. FFD5 CALL EBP
0040841F |. 8D8C24 8C00000>LEA ECX,DWORD PTR SS:[ESP+8C]
************************************************************
004083C3 |. E8 48FCFFFF CALL S-Record.00408010
00408041 |. 83E1 03 AND ECX,3
00408044 |. F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
00408046 |. 8D7C24 14 LEA EDI,DWORD PTR SS:[ESP+14]
0040804A |. 83C9 FF OR ECX,FFFFFFFF
0040804D |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
0040804F |. F7D1 NOT ECX
00408051 |. 49 DEC ECX ; 注册码数
00408052 |. 8BF1 MOV ESI,ECX
00408054 |. 8A4C24 14 MOV CL,BYTE PTR SS:[ESP+14] ; 第一位到cl
00408058 |. 897424 10 MOV DWORD PTR SS:[ESP+10],ESI ; 保存注册码位数
0040805C |> 3888 28D54100 /CMP BYTE PTR DS:[EAX+41D528],CL ; 查表找第一位在表中的位置,注意这里的查表
00408062 |. 74 33 |JE SHORT S-Record.00408097 ; eax中保存第一位注册码在表中位置,第一位选F,跳
00408064 |. 40 |INC EAX
00408065 |. 83F8 10 |CMP EAX,10
00408068 |.^7C F2 \JL SHORT S-Record.0040805C
0040806A |> BF 68D54100 MOV EDI,S-Record.0041D568 ; ASCII "!@#@#SDFG^*&"
0040806F |. 83C9 FF OR ECX,FFFFFFFF
00408072 |. 33C0 XOR EAX,EAX
00408074 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
00408076 |. F7D1 NOT ECX
00408078 |. 2BF9 SUB EDI,ECX
0040807A |. 8BC1 MOV EAX,ECX
0040807C |. 8BF7 MOV ESI,EDI
0041D528 46 5A 52 48 4B 30 31 57 FZRHK01W 这里就是字母表 按顺序记为:0~f
0041D530 47 54 50 51 53 41 56 43 GTPQSAVC
我的试验码首位选的是F
跳到这里:
00408097 |> 83F8 10 CMP EAX,10
0040809A |.^7D CE JGE SHORT S-Record.0040806A
0040809C |. 8B9C24 E400000>MOV EBX,DWORD PTR SS:[ESP+E4] ; 用户名+机器码到ebx
004080A3 |. BD 0F000000 MOV EBP,0F
004080A8 |. 2BE8 SUB EBP,EAX ; 15-位置数,注意:ebp最后用到
004080AA |. 8BFB MOV EDI,EBX
004080AC |. 83C9 FF OR ECX,FFFFFFFF ; ecx=-1
004080AF |. 33C0 XOR EAX,EAX
004080B1 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
004080B3 |. F7D1 NOT ECX
004080B5 |. 49 DEC ECX ; 用户名+机器码位数
004080B6 |. 33D2 XOR EDX,EDX
004080B8 |. 8BC1 MOV EAX,ECX
004080BA |. B9 07000000 MOV ECX,7
004080BF |. F7F1 DIV ECX ; 用户名+机器码数除7
004080C1 |. 8BCA MOV ECX,EDX
004080C3 |. 85C9 TEST ECX,ECX
004080C5 |. 75 2B JNZ SHORT S-Record.004080F2 ; 余数不为0,则跳
跳到这里:
004080F2 |> 8BC5 MOV EAX,EBP
004080F4 |. 99 CDQ
004080F5 |. F7F9 IDIV ECX
004080F7 |. 0FBE041A MOVSX EAX,BYTE PTR DS:[EDX+EBX] ; 用户名第一位
004080FB |. 25 0F000080 AND EAX,8000000F ; 第一位 and 8000000f
00408100 |. 79 05 JNS SHORT S-Record.00408107
00408102 |. 48 DEC EAX
00408103 |. 83C8 F0 OR EAX,FFFFFFF0
00408106 |. 40 INC EAX
00408107 |> 8A88 28D54100 MOV CL,BYTE PTR DS:[EAX+41D528] ; 根据结果查表,
0040810D |. 8A4424 15 MOV AL,BYTE PTR SS:[ESP+15] ; 注册码第二位,结果为V
00408111 |. 3AC8 CMP CL,AL
00408113 |. 74 0A JE SHORT S-Record.0040811F
00408115 |. BF 5CD54100 MOV EDI,S-Record.0041D55C ; ASCII "99#SDFG^*&"
0040811A |. E9 C5000000 JMP S-Record.004081E4
0040811F |> 8D46 FD LEA EAX,DWORD PTR DS:[ESI-3] ; 注册码数-3到eax
00408122 |. 33FF XOR EDI,EDI
00408124 |. 99 CDQ
00408125 |. 2BC2 SUB EAX,EDX
00408127 |. D1F8 SAR EAX,1 ; sar?右移一位(除2)
00408129 |. 85C0 TEST EAX,EAX
0040812B |. 0F8E 8F000000 JLE S-Record.004081C0
00408131 |. 8D7424 16 LEA ESI,DWORD PTR SS:[ESP+16] ; 取注册码第三位开始的地址
00408135 |> 8A56 01 /MOV DL,BYTE PTR DS:[ESI+1] ; 取第4位 6 8
00408138 |. 33C9 |XOR ECX,ECX
0040813A |> 3891 28D54100 |/CMP BYTE PTR DS:[ECX+41D528],DL ; 查表
00408140 |. 74 1C ||JE SHORT S-Record.0040815E
00408142 |. 41 ||INC ECX
00408143 |. 83F9 10 ||CMP ECX,10
00408146 |.^7C F2 |\JL SHORT S-Record.0040813A
00408148 |> 32D2 |XOR DL,DL
0040814A |> 8A1E |MOV BL,BYTE PTR DS:[ESI] ; 取第3位 5 7
0040814C |. 33C9 |XOR ECX,ECX
0040814E |> 3899 28D54100 |/CMP BYTE PTR DS:[ECX+41D528],BL ; 查表
00408154 |. 74 26 ||JE SHORT S-Record.0040817C
00408156 |. 41 ||INC ECX
00408157 |. 83F9 10 ||CMP ECX,10
0040815A |.^7C F2 |\JL SHORT S-Record.0040814E
0040815C |. EB 3A |JMP SHORT S-Record.00408198
0040815E |> 83F9 10 |CMP ECX,10 根据第4 6 8 。。。位注册码的查表位置
00408161 |.^7D E5 |JGE SHORT S-Record.00408148 计算转换后字母ASCII码低位
00408163 |. 2BCD |SUB ECX,EBP ; ebp=f 13 19 1f 26 2c 32 38
00408165 |. 81C1 803E0000 |ADD ECX,3E80
0040816B |. 8BD1 |MOV EDX,ECX
0040816D |. 81E2 0F000080 |AND EDX,8000000F 跟踪几遍后发现注册码经过这里的转换与跟进前看见的
00408173 |.^79 D5 |JNS SHORT S-Record.0040814A ASCII "Clayman" 比较,也就是注册码转换后为Clayman
此处edx中计算字母的,注册码至少要有17位
00408175 |. 4A |DEC EDX
00408176 |. 83CA F0 |OR EDX,FFFFFFF0
00408179 |. 42 |INC EDX
0040817A |.^EB CE |JMP SHORT S-Record.0040814A
0040817C |> 83F9 10 |CMP ECX,10 根据第3 5 7 。。。位注册码的查表位置
0040817F |. 7D 17 |JGE SHORT S-Record.00408198 计算转换后字母ASCII码高位
00408181 |. 2BCD |SUB ECX,EBP
00408183 |. 81C1 803E0000 |ADD ECX,3E80
00408189 |. 81E1 0F000080 |AND ECX,8000000F
0040818F |. 79 09 |JNS SHORT S-Record.0040819A
00408191 |. 49 |DEC ECX
00408192 |. 83C9 F0 |OR ECX,FFFFFFF0
00408195 |. 41 |INC ECX
00408196 |. EB 02 |JMP SHORT S-Record.0040819A
00408198 |> 32C9 |XOR CL,CL
0040819A |> 8AD9 |MOV BL,CL
0040819C |. 83C6 02 |ADD ESI,2 ; 指针+2
0040819F |. C0E3 04 |SHL BL,4
004081A2 |. 02DA |ADD BL,DL ; bl+dl=Ascii
004081A4 |. 8B9424 E000000>|MOV EDX,DWORD PTR SS:[ESP+E0] ; 取注册码
004081AB |. 0FBEC9 |MOVSX ECX,CL
004081AE |. 881C17 |MOV BYTE PTR DS:[EDI+EDX],BL ; 保存结果,应为:Clayman(43 6C 61 79 6d 61 6e)
004081B1 |. 03E9 |ADD EBP,ECX ; ebp+前一个字母的高位,4 6 6 7 6 6 6
004081B3 |. 47 |INC EDI
004081B4 |. 3BF8 |CMP EDI,EAX 与eax比较
004081B6 |.^0F8C 79FFFFFF \JL S-Record.00408135
004081BC |. 8B7424 10 MOV ESI,DWORD PTR SS:[ESP+10]
004081C0 |> 8D542E FD LEA EDX,DWORD PTR DS:[ESI+EBP-3] 取最后一位注册码
004081C4 |. 81E2 0F000080 AND EDX,8000000F
004081CA |. 79 05 JNS SHORT S-Record.004081D1
004081CC |. 4A DEC EDX
004081CD |. 83CA F0 OR EDX,FFFFFFF0
004081D0 |. 42 INC EDX
004081D1 |> 8A4C34 13 MOV CL,BYTE PTR SS:[ESP+ESI+13] 计算结果
004081D5 |. 8A9A 28D54100 MOV BL,BYTE PTR DS:[EDX+41D528] 查表,为1
004081DB |. 3ACB CMP CL,BL
004081DD |. 74 32 JE SHORT S-Record.00408211
基本搞定了,总结一下:
首先,注册码必须为字母表中的字母组成
查表计算第一位的位置,与ebp相减作为后续转换的因子
注册名第一位与8000000f and 后查表得第二位
第三位到第十六位每两位组合计算出一个ascii值,结果应为43 6C 61 79 6d 61 6e,
ebp=f 13 19 1f 26 2c 32 38
每一位的计算过程:位置-ebp 后+ 3e80 and 8000000f,此处只要相减后低位为对应的正确结果就可以了,因为相当于 xxxx and 000f,只 有低位不变。
每转换一个字母后转换因子与ascii高位相加计算下一个ascii值
最后一位注册码与8000000f and 后查表应与注册码本身相同。
用户名:noNaMe-mOnk 注册码:FVHRTCCP1GSHRAGF1
--------------------------------------------------------------------------------
【经验总结】
呵呵,很久没动刀了,只是工作忙,静不下心来,今天下雨,闲来无事,让大虾们见笑了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年04月21日 23:39:02
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法