【文章标题】: riijj_mfccm1_r2的破解经过
【文章作者】: dewar
【软件名称】: riijj_mfccm1_r2.EXE
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【编写语言】: VC
【使用工具】: OD
【操作平台】: WINXP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
本人刚接触破解,这是本人的第一篇破文,各位大侠见笑,有不对之处请指正,不胜感谢!
1.OD载入,F9运行,输入用户名:dewar,注册码:1234,用消息断点法,在register按钮上设[202 WM_LBUTTONUP]断点,可断在00401140处(具体方法参见OLLYDBG入门系列(五) 消息断点与RUN跟踪).在该处下F2断点,清除其它断点,重新载入.
......
00401140 /$ 6A FF PUSH -1 ;<====断在这里,在这里下F2断点
00401142 |. 68 BE3B4000 PUSH 00403BBE ; 给e@; SE 处理程序安装
00401147 |. 64:A1 0000000>MOV EAX, DWORD PTR FS:[0]
0040114D |. 50 PUSH EAX
0040114E |. 64:8925 00000>MOV DWORD PTR FS:[0], ESP
00401155 |. 81EC D0000000 SUB ESP, 0D0
0040115B |. 8A4C24 03 MOV CL, BYTE PTR SS:[ESP+3]
0040115F |. 8A4424 03 MOV AL, BYTE PTR SS:[ESP+3]
00401163 |. 53 PUSH EBX
00401164 |. 55 PUSH EBP
00401165 |. 56 PUSH ESI
00401166 |. 884C24 15 MOV BYTE PTR SS:[ESP+15], CL
0040116A |. 57 PUSH EDI
0040116B |. 8D4C24 18 LEA ECX, DWORD PTR SS:[ESP+18]
0040116F |. 884424 18 MOV BYTE PTR SS:[ESP+18], AL
00401173 |. C64424 20 00 MOV BYTE PTR SS:[ESP+20], 0
00401178 |. E8 831C0000 CALL 00402E00
0040117D |. 8A5424 13 MOV DL, BYTE PTR SS:[ESP+13]
00401181 |. 8A4424 13 MOV AL, BYTE PTR SS:[ESP+13]
00401185 |. 33ED XOR EBP, EBP
00401187 |. 8D4C24 28 LEA ECX, DWORD PTR SS:[ESP+28]
0040118B |. 89AC24 E80000>MOV DWORD PTR SS:[ESP+E8], EBP
00401192 |. 885424 28 MOV BYTE PTR SS:[ESP+28], DL
00401196 |. 884424 29 MOV BYTE PTR SS:[ESP+29], AL
0040119A |. C64424 30 00 MOV BYTE PTR SS:[ESP+30], 0
0040119F |. E8 5C1C0000 CALL 00402E00
004011A4 |. 8D4C24 18 LEA ECX, DWORD PTR SS:[ESP+18]
004011A8 |. 8D5424 28 LEA EDX, DWORD PTR SS:[ESP+28]
004011AC |. 51 PUSH ECX
004011AD |. 52 PUSH EDX
004011AE |. C68424 F00000>MOV BYTE PTR SS:[ESP+F0], 1
004011B6 |. E8 45FEFFFF CALL 00401000
004011BB |. 8B9C24 F80000>MOV EBX, DWORD PTR SS:[ESP+F8]
004011C2 |. 83C4 08 ADD ESP, 8
004011C5 |. 8A03 MOV AL, BYTE PTR DS:[EBX] ; 注册名的第一个字母送AL
004011C7 |. 0FBEF0 MOVSX ESI, AL ; 符号扩展至ESI
004011CA |. 3BF5 CMP ESI, EBP ; 是否为空(检查有无输入)
004011CC 75 2A JNZ SHORT 004011F8 ; 不是就跳
004011CE |. 8D4C24 28 LEA ECX, DWORD PTR SS:[ESP+28]
004011D2 |. C68424 E80000>MOV BYTE PTR SS:[ESP+E8], 0
004011DA |. E8 11150000 CALL 004026F0
004011DF |. 8D4C24 18 LEA ECX, DWORD PTR SS:[ESP+18]
004011E3 |. C78424 E80000>MOV DWORD PTR SS:[ESP+E8], -1
004011EE |. E8 FD140000 CALL 004026F0
004011F3 |. E9 CA010000 JMP 004013C2
004011F8 |> 84C0 TEST AL, AL ; 是否为空
004011FA |. 74 0F JE SHORT 0040120B ; 是就跳
004011FC |> 0FBEC0 /MOVSX EAX, AL ; 符号扩展至EAX
004011FF |. 0FAFF0 |IMUL ESI, EAX ; 第一位字符的ASCII依次与各位的ASCII相乘
00401202 |. 8A442B 01 |MOV AL, BYTE PTR DS:[EBX+EBP+1] ; 取下一位字符
00401206 |. 45 |INC EBP ; 指针加1(最后可得出注册名的位数)
00401207 |. 84C0 |TEST AL, AL ; 是否为空(是表示用户名取完)
00401209 |.^ 75 F1 \JNZ SHORT 004011FC ; 是就得出结果A
0040120B |> 8D7C24 40 LEA EDI, DWORD PTR SS:[ESP+40]
0040120F |. C74424 14 100>MOV DWORD PTR SS:[ESP+14], 10 ; 初始化循环变量(I=16)
00401217 |> 8BC6 /MOV EAX, ESI ; 取结果A
00401219 |. 8D4C24 28 |LEA ECX, DWORD PTR SS:[ESP+28]
0040121D |. 50 |PUSH EAX
0040121E |. 51 |PUSH ECX
0040121F |. 46 |INC ESI ; A=A+1
00401220 |. E8 FBFDFFFF |CALL 00401020 ; 对EAX中数据进行处理(除以300,根据余数对应得到数B(J),J=16-I+1,B(J)是通过上面的CALL 00402E00和CALL 00401000产生)
00401225 |. 8907 |MOV DWORD PTR DS:[EDI], EAX ; B(J)存在堆栈中的指定位置
00401227 |. 8B4424 1C |MOV EAX, DWORD PTR SS:[ESP+1C] ; 取循环变量
0040122B |. 83C4 08 |ADD ESP, 8 ; 平衡堆栈
0040122E |. 83C7 04 |ADD EDI, 4 ; 在堆栈中分配B(J+1)的存放地址
00401231 |. 48 |DEC EAX ; 循环变量减1(I=I-1)
00401232 |. 894424 14 |MOV DWORD PTR SS:[ESP+14], EAX
00401236 |.^ 75 DF \JNZ SHORT 00401217 ; 是0就退出循环(重复16次,堆栈中得出16个数)
00401238 |. 8D7C24 40 LEA EDI, DWORD PTR SS:[ESP+40] ; 临时结果的首地址送EDI
0040123C |. C74424 14 100>MOV DWORD PTR SS:[ESP+14], 10 ; 初始化循环变量I=16
00401244 |> 83C6 14 /ADD ESI, 14 ; ESI=ESI+20
00401247 |. 8D5424 28 |LEA EDX, DWORD PTR SS:[ESP+28]
0040124B |. 8BC6 |MOV EAX, ESI ; EAX<-----ESI
0040124D |. 46 |INC ESI ; ESI=ESI+1
0040124E |. 50 |PUSH EAX
0040124F |. 52 |PUSH EDX
00401250 |. E8 CBFDFFFF |CALL 00401020 ; 对EAX中数据进行处理(除以300,根据余数对应得到数C(J),J=16-I+1)
00401255 |. 8D0440 |LEA EAX, DWORD PTR DS:[EAX+EAX*2] ; 结果C(J)×3
00401258 |. 8B0F |MOV ECX, DWORD PTR DS:[EDI]
0040125A |. D1E0 |SHL EAX, 1 ; 再×2
0040125C |. 99 |CDQ
0040125D |. F7FD |IDIV EBP ; 再除以注册名的位数
0040125F |. 83C4 08 |ADD ESP, 8
00401262 |. 83C7 04 |ADD EDI, 4
00401265 |. 8BC2 |MOV EAX, EDX ; 取余数
00401267 |. 99 |CDQ
00401268 |. 33C2 |XOR EAX, EDX
0040126A |. 2BC2 |SUB EAX, EDX ; 取余数的绝对值得数D(J)
0040126C |. 0FBE0418 |MOVSX EAX, BYTE PTR DS:[EAX+EBX] ; 取注册名中的第(D(J)+1)位的ASCII
00401270 |. 33C1 |XOR EAX, ECX ; 该ASCII和相应B(J)进行异或
00401272 |. B9 1A000000 |MOV ECX, 1A
00401277 |. 99 |CDQ
00401278 |. F7F9 |IDIV ECX ; 异或后再除以1A(=26)
0040127A |. 8B4424 14 |MOV EAX, DWORD PTR SS:[ESP+14]
0040127E |. 83C2 41 |ADD EDX, 41 ; 余数加65,得结果E(J),即注册码相应位的ASCII,可见注册码应该为大写字母的组合
00401281 |. 48 |DEC EAX ; 循环变量减1(I=I-1)
00401282 |. 8957 FC |MOV DWORD PTR DS:[EDI-4], EDX ; 结果E存入在相应的位置
00401285 |. 894424 14 |MOV DWORD PTR SS:[ESP+14], EAX ; 保存循环变量
00401289 |.^ 75 B9 \JNZ SHORT 00401244 ; 循环,直到算出全部的16位注册码(E(1)到E(16))
0040128B |. 8BB424 F40000>MOV ESI, DWORD PTR SS:[ESP+F4] ; 取假注册码
00401292 |. 33FF XOR EDI, EDI
00401294 |. 33C0 XOR EAX, EAX
00401296 |. 8D4C24 40 LEA ECX, DWORD PTR SS:[ESP+40] ; 取真注册码(这里D ECX可看到真正的注册码)
0040129A |> 8A1430 /MOV DL, BYTE PTR DS:[EAX+ESI]
0040129D |. 8A19 |MOV BL, BYTE PTR DS:[ECX]
0040129F |. 3AD3 |CMP DL, BL ; 依次比较真假注册码的各位
004012A1 0F85 34010000 JNZ 004013DB ; 不等就跳,这里不能跳(爆破点)
004012A7 |. 40 |INC EAX
004012A8 |. 83C1 04 |ADD ECX, 4
004012AB |. 83F8 10 |CMP EAX, 10
004012AE |.^ 7C EA \JL SHORT 0040129A ; 循环比较注册码各位
004012B0 |. 57 PUSH EDI
004012B1 |. 8D8C24 840000>LEA ECX, DWORD PTR SS:[ESP+84]
004012B8 |. E8 03240000 CALL 004036C0 ; 成功
......
2.算法分析见上面的注释.最后可得出正确注册码:ORRSIJQDENDFUBBH.
3.CALL 00402E00和CALL 00401000具体是怎么运算的,还请高手指点一 二.
4.发现本CRACKERME的一个BUG:用户名里输入的字符不能改,改了后实际运算的用户名并非显示的用户名,而是你输入的所有的字符。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年12月25日 15:08:57
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!