【文章标题】: 适合新手学习的crackme
【文章作者】: coldpine
【软件名称】: crackme2.exe
【下载地址】: http://www.crackmes.de/users/mucki/crackme2/
【作者声明】: 失误之处敬请诸位大侠赐教!(最近学习seh感觉头有点大,找个简单的解解气:))
--------------------------------------------------------------------------------
【详细过程】
直接运行,弹出对话框输入
name:heminrui
serial:123456789很容易找到下面这个地方
004011BE |. 57 PUSH EDI
004011BF |. 56 PUSH ESI
004011C0 |. 53 PUSH EBX
004011C1 |> 6A 32 /PUSH 32 ;
004011C3 |. 68 84624000 |PUSH crackme2.00406284 ;
004011C8 |. 6A 01 |PUSH 1 ;
004011CA |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ;
004011CD |. E8 16020000 |CALL <JMP.&user32.GetDlgItemTextA> ; 取用户名函数
004011D2 |. 64:8B15 18000>|MOV EDX, DWORD PTR FS:[18]
004011D9 |. 8B52 30 |MOV EDX, DWORD PTR DS:[EDX+30]
004011DC |. 0FB652 02 |MOVZX EDX, BYTE PTR DS:[EDX+2]
004011E0 |. 83F8 00 |CMP EAX, 0
004011E3 |. 7F 11 |JG SHORT crackme2.004011F6
004011E5 |. 68 D8604000 |PUSH crackme2.004060D8 ; /Text = "nameless"
004011EA |. 6A 01 |PUSH 1 ; |ControlID = 1
004011EC |. FF75 08 |PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011EF |. E8 0C020000 |CALL <JMP.&user32.SetDlgItemTextA> ; \SetDlgItemTextA
004011F4 |.^ EB CB \JMP SHORT crackme2.004011C1
004011F6 |> 8D35 84624000 LEA ESI, DWORD PTR DS:[406284] ;取name的地址到esi
004011FC |. 33C9 XOR ECX, ECX ;清空累加器
004011FE |> 0FBE06 /MOVSX EAX, BYTE PTR DS:[ESI] ;逐位取出name的字符ascii码值运算
00401201 |. 8BD8 |MOV EBX, EAX ;放在ebx
00401203 |. 2BF2 |SUB ESI, EDX
00401205 |. C1E0 04 |SHL EAX, 4 ;将每位ascii码值左移四位
00401208 |. C1EB 05 |SHR EBX, 5 ;将每位ascii码值右移五位
0040120B |. 33C3 |XOR EAX, EBX ;异或以上的两个结果
0040120D |. 83C0 26 |ADD EAX, 26 ;以上的结果加26
00401210 |. 33C1 |XOR EAX, ECX ;先和累加器异或
00401212 |. 03C8 |ADD ECX, EAX ;再累加到累加器上
00401214 |. 46 |INC ESI ;将地址减一
00401215 |. 803E 00 |CMP BYTE PTR DS:[ESI], 0 ;取完了没有,没有的话,再继续取
00401218 |.^ 75 E4 \JNZ SHORT crackme2.004011FE
0040121A |. B8 EF0D0C00 MOV EAX, 0C0DEF
0040121F |. 2BC1 SUB EAX, ECX ;用C0DEF减去累加器
00401221 |. 0FAFC0 IMUL EAX, EAX ;将结果平方
00401224 |. 50 PUSH EAX ; /<%lX>
00401225 |. 51 PUSH ECX ; |<%lX>
00401226 |. 68 E1604000 PUSH crackme2.004060E1 ; |Format = "CM2-%lX-%lX"
0040122B |. 68 B6624000 PUSH crackme2.004062B6
00401230 |. E8 9B010000 CALL <JMP.&user32.wsprintfA> ;格式化函数
00401235 |. 6A 4B PUSH 4B ;
00401237 |. 68 B1604000 PUSH crackme2.004060B1 ;
0040123C |. 6A 02 PUSH 2 ;
0040123E |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ;
00401241 |. E8 A2010000 CALL <JMP.&user32.GetDlgItemTextA> ; 取序列号
00401246 |. 68 B1604000 PUSH crackme2.004060B1 ; 用户输入的序列号
0040124B |. 68 B6624000 PUSH crackme2.004062B6 ; 用户名计算出来的序列号
00401250 |. E8 DB010000 CALL <JMP.&kernel32.lstrcmpA> ; 比较序列号,决定跳向
00401255 |. 75 16 JNZ SHORT crackme2.0040126D ;
00401257 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401259 |. 68 00604000 PUSH crackme2.00406000 ; |Title = "crackme2"
0040125E |. 68 3D604000 PUSH crackme2.0040603D ; |Text = "Valid serial - now write a keygen!"
00401263 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401266 |. E8 89010000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
0040126B |. EB 14 JMP SHORT crackme2.00401281
0040126D |> 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
0040126F |. 68 00604000 PUSH crackme2.00406000 ; |Title = "crackme2"
00401274 |. 68 60604000 PUSH crackme2.00406060 ; |Text = "Wrong serial - try again!"
00401279 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
0040127C |. E8 73010000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00401281 |> 5B POP EBX
00401282 |. 5E POP ESI
00401283 |. 5F POP EDI
00401284 |. C9 LEAVE
00401285 \. C2 0400 RET 4
--------------------------------------------------------------------------------
【经验总结】
算法总结:将用户名每位取出ascii码值计算,设每位为x,C为ecx的值
A=shl(x)
B=shr(x)
A=A XOR B
A=A+26
A=A XOR C
C=C+A
然后在用户名长度之内进行循环计算
A=0C0DEF
A=A-C
A=A*A
最后将CM2,A,C连解成注册码,一组可行的注册码:
name:heminrui
serial:CM2-11739-33FA4964
稍微将以上的过程改改就可以写成注册机了,因为时间关系,以后再补上 ,花了半个多小时,感觉比较简单.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年10月06日 9:47:01
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法