muckis Crackme#2破解分析
周末,做个Crackme开发一下智力吧。。
该Crackme为小白级别的玩意儿,明码,非压缩壳,算法也简单。
高手请自动绕行。
P.S.凑字数。凑日志数产品。
本文提到的Crackme小程序在文章后面会提供下载。
一、PEiD查壳
PEiD查了下壳,加壳了哦。
是EXECryptor这个壳,MS有脱壳机可以解决。
这个壳MS不会压缩代码。
大D脱壳渣渣,直接OD载入。
二、OllyDbg载入
1.爆破
直接OD载入,发现Crackme程序有侦测是否是Debug程序在加载Crackme程序自身。
直接提示了。
遇到这个问题的,请自行搜索下载隐藏OD标题和隐藏调试器插件并开启。
隐藏标题和调试器后,加载程序,程序顺利载入,运行程序。
首先使用填写假码尝试,出现错误提示了。
使用插件搜索字符串。模式随便选了,本例中都能看到字符串。
得到一些结果,在结果中查找“Wrong serial - try again”。
查找到后,双击或Enter键跟随,查看代码。
1 2 3 4 5 6 7 8 9 10 11 |
00401250 |. E8 DB010000 CALL <JMP.&kernel32.lstrcmpA> ; \lstrcmpA 00401255 75 16 JNZ SHORT crackme2.0040126D 00401257 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 00401259 |. 68 00604000 PUSH crackme2.00406000 ; |crackme2 0040125E |. 68 3D604000 PUSH crackme2.0040603D ; |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 ; |crackme2 00401274 |. 68 60604000 PUSH crackme2.00406060 ; |wrong serial - try again! |
如下代码
[text]00401255 75 16 JNZ SHORT crackme2.0040126D[/text]
就是关键跳转了,JNZ跳转到地址0040126D,在代码中可以看到,跳转到0040126D在以后,紧接着就会弹出注册码错误的提示。
爆破点就在这里,将JNZ SHORT crackme2.0040126D修改成JZ SHORT crackme2.0040126D,然后保存程序就可以了。
2.查找注册码
继续分析代码,同时查看堆栈窗口,发现堆栈窗口中有如下内容。
0012F7B8 0040628B crackme2.0040628B
0012F7BC 00000003
0012F7C0 0012F7EC
0012F7C4 00401255 crackme2.00401255
0012F7C8 004062B6 ASCII "CM2-96D9-734975E4"
0012F7CC 004060B1 ASCII "123456"
0012F7D0 004062B6 ASCII "CM2-96D9-734975E4"
0012F7D4 004060E1 ASCII "CM2-%lX-%lX"
明码比较的Crackme,将正确的注册码和假码压进堆栈,然后进行比较。
且可以发现
CM2-%lX-%lX
这个应该是注册码的格式。
3.分析算法
找到注册码之后就是分析一下算法。继续向上查看代码,一个跳转一个跳转的查看,在跳转语句的附近,往往就会有一下关键的语句。
查找到上面的一个跳转,跳转到一个地址,该地址前面的语句加载了输入的用户名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
004011F6 |> \8D35 84624000 LEA ESI,DWORD PTR DS:[406284] 地址=00406284, (ASCII "derek_s") 跳转来自 004011E3 可见下面的语句是算法部分。 大D直接写注释了。哈哈。偷个懒。 004011F6 |> \8D35 84624000 LEA ESI,DWORD PTR DS:[406284] ;加载用户名 004011FC |. 33C9 XOR ECX,ECX ;对ECX寄存器做异或 004011FE |> 0FBE06 /MOVSX EAX,BYTE PTR DS:[ESI] ;取出存储的用户名,并把用户名的每一位的ASCII码送进EAX寄存器 00401201 |. 8BD8 |MOV EBX,EAX ;EAX寄存器的内容复制到EBX 00401203 |. 2BF2 |SUB ESI,EDX ;ESI减EDX 00401205 |. C1E0 04 |SHL EAX,4 ;EAX左移4 00401208 |. C1EB 05 |SHR EBX,5 ;EBX右移5 0040120B |. 33C3 |XOR EAX,EBX ;EAX异或EBX 0040120D |. 83C0 26 |ADD EAX,26 ;EAX加26 00401210 |. 33C1 |XOR EAX,ECX ;EAX异或EXC 00401212 |. 03C8 |ADD ECX,EAX ;EAC加EAX 00401214 |. 46 |INC ESI ;ESI+1 00401215 |. 803E 00 |CMP BYTE PTR DS:[ESI],0 ;比较一次(这个比较是确认非零值,如果为零了,说明到达用户名结尾,循环结束) ;到这里,ECX寄存器的内容就是注册码的中间那一组的值 00401218 |.^ 75 E4 \JNZ SHORT crackme2.004011FE ;跳转到004011FE地址上 0040121A |. B8 EF0D0C00 MOV EAX,0C0DEF ;EAX = 0x0C0DEF 0040121F |. 2BC1 SUB EAX,ECX ;EAX减ECX 00401221 |. 0FAFC0 IMUL EAX,EAX ;EAX^2(计算得到EAX的值是注册码的最后一组值) |
4.算法分析小结:
基本很简单的说。。嘿嘿。。
循环读取用户名的每一位,转换成ASCII码,分别存储为A和B。
A做左移4位运算。
B做右移5位运算。
A = A xor B
A = A + 26
A = A xor C
C = C + A
A = 0x0C0DEF
A = A - C
A = A * A
5.注册机
既然知道了算法,那么就可以写注册机了。
直接贴代码。。。
C语言写的,写的超级渣渣。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include #include #include #define ZXA 0x0C0DEF int main() { int i; char name[30]; long sum=0,x=0,z=0; printf("ID="); gets(name); while(strlen(name)<=0) { printf("ID="); gets(name); } for(i=0;i<strlen(name);i++) { sum+=(name[i]*16+name[i]/32+0x26)^sum; x=ZXA-sum; z=x*x; } printf("serial=CM2-%lX-%lX\n",sum,z); } |
因左移运算类似于乘法运算。2^x(x为移动位数),得到的就乘的数字了。
右移运算类似出发运算。2^x(x为移动位数),得到的就是除的数字了。
左移四位就是:A*(2^4)
右移五位就是:B/(2^5)
最后放一个图片以证注册机可以运行并计算正确的注册码。
咳咳。。约定好的下载地址。
文件信息
[www.dadclab.com]muckis Crackme#2.zip
大小: 13406 字节
MD5: 65AF80F2DEB99F6192C6D9CAC37018F9
SHA1: FF64B8E87566A33CBE931D60EFFC5A165C40D4DE
CRC32: 66AB152D
大D莫非在学习某些黑客课程?
@dave
不是啦,做个Crackme开发一下智力顺便消磨无聊时光。
@大D 感冒了,好好休息,病好了工作效率高
@dave
嗯嗯。。近期的工作就先放一放,养身体先。
果断YM,完全看不懂![:cry:](https://www.dadclab.com/wp-content/themes/Dadclab_Theme/img/smilies/icon_cry.gif)
@老谢
反YM。。
老谢想学也能会的说。嘿嘿
除了YM 我已经没什么可以说的了~
@xushine
兔兔抵达目的地了?看来是的哦~
@大D 嘿嘿 是的
十分认真的看完了所有的文章发现自己根本不懂编程![:cry:](https://www.dadclab.com/wp-content/themes/Dadclab_Theme/img/smilies/icon_cry.gif)
找到关键跳,然后改掉,不让它跳转,好吧,属于爆破,
后面涉及到算法,不是很懂汇编,嘿嘿,好久木有搞这些东东了,
呵呵。。