-
-
[原创]CrackMe2详细破解过程
-
发表于: 2012-5-13 15:23 2958
-
本人水平很菜,第一次写破文,若有不对之处,还请各位指出。前几天在论坛里看到有个CrackMe0-9系列,也就去下载了下来练手。
现在做到第三个了,我把这一个的破解过程给大家分享一下,大神们就飘过吧!
打开后,界面如下:
随便输入后按确定,发现没有反应。
直接 用OD载入看看吧,先设个断点看看,Ctrl+G跟踪表达式“GetWindowTextA”,F2设断,
然后按F9跑起来,发现还没有弹出界面就断在了GetWindowTextA处了。不管它,再按次F9,出现界面 后,NAME栏随便写,下面的SERIAL要输入数字,要不然还没进入验证就退出 了。不信可以试试。这里我输入yingzi(长度是六位,后面会解释) 123456,点击确定后,出现断在了刚才的那个点,按Ctrl+F9,几次后停在下图所示:
往上翻,有第一个retn后面设一个断点,重新加载程序。可以看到这个程序没有明显的函数调用!重新加载后,按F9运行,直到出现界面,按上面的输入,来到断点处。然后按F8单步调试。到00401638这一步注意,后面是将一个地址送进EAX,然后将EAX压栈,而且看后面的CALL,很像一个函数的调用,那就在数据窗口中跟随这个地址吧。单步运行,过了CALL过后,发现刚才跟随的地址中的值变了,选中地址中的值,在数据窗口中跟随,刚才输入的字符串就出现 了。 同理,单步运行过下一个CALL,再看ESI中的数据, 数据按正常顺序就是1E240,换成十进制就是123456。到这可以猜想刚才那两个CALL就是GetWindowTextA函数。
继续按几次Crtl+F9,来到这个地方:
发现这是要返回,往上翻,在这个函数的开头处下个断点,并取消之前的断点。
重新加载程序。单击确定之后,程序会断在刚才设的点上。单步运行,一直到
发现调用了地址0018FEC0,并将其传入ECX中,进行一个函数调用。再往下走,过 了CALL之后,看寄存器的值,EAX=002D4920 ASCII “yingzi” ,证明下面要对输入的数进行处理。往下走,到一个循环 这个循环是依次将输入的NAME放入EDX所指向的地方,查看EDX知道是放在栈中。
004015A2 |. 8A4424 16 MOV AL,BYTE PTR SS:[ESP+16]
004015A6 |. 84C0 TEST AL,AL 测试第七个字符是否为空
004015A8 |. 75 50 JNZ SHORT CRECKME_.004015FA 所以NAME是6个字符
004015AA |. 8A5424 15 MOV DL,BYTE PTR SS:[ESP+15]
004015AE |. 84D2 TEST DL,DL 测试第六个字条是否为空
004015B0 |. 74 48 JE SHORT CRECKME_.004015FA
004015B2 |. 8B43 78 MOV EAX,DWORD PTR DS:[EBX+78] 拿出我们的KEY
004015B5 |. 3D A0860100 CMP EAX,186A0 测试是否大于186A0=100000(十进制)
004015BA |. 7C 3E JL SHORT CRECKME_.004015FA
004015BC |. 0FBE7424 12 MOVSX ESI,BYTE PTR SS:[ESP+12] “n”
004015C1 |. 0FBE4C24 11 MOVSX ECX,BYTE PTR SS:[ESP+11] “i”
004015C6 |. 0FBE7C24 14 MOVSX EDI,BYTE PTR SS:[ESP+14] “z”
004015CB |. 03CE ADD ECX,ESI “ecx=i+n”
004015CD |. 0FBE7424 10 MOVSX ESI,BYTE PTR SS:[ESP+10] “y”
004015D2 |. 03CE ADD ECX,ESI ECX=ecx+y(前三个字母相加)
004015D4 |. 0FBE7424 13 MOVSX ESI,BYTE PTR SS:[ESP+13] “g”
004015D9 |. 0FBED2 MOVSX EDX,DL
004015DC |. 03F7 ADD ESI,EDI
004015DE |. 03F2 ADD ESI,EDX 后三个字母相加
004015E0 |. 99 CDQ
004015E1 |. BF E8030000 MOV EDI,3E8 3E8=1000(十进制)
004015E6 |. F7FF IDIV EDI 我们的KEY(123456)/1000
004015E8 |. 3BC8 CMP ECX,EAX 比较商,等于前三个字母相加则进行下一步
004015EA |. 75 0E JNZ SHORT CRECKME_.004015FA
004015EC |. 3BF2 CMP ESI,EDX 比较余数,等于后三个字母相加则进行下一步
004015EE |. 75 0A JNZ SHORT CRECKME_.004015FA
004015F0 |. 8B03 MOV EAX,DWORD PTR DS:[EBX]
004015F2 |. 8BCB MOV ECX,EBX
004015F4 |. FF90 54010000 CALL DWORD PTR DS:[EAX+154]
004015FA |> 8B8C24 940000>MOV ECX,DWORD PTR SS:[ESP+94]
00401601 |. E8 43040000 CALL CRECKME_.00401A49
00401606 |. 5F POP EDI
00401607 |. 5E POP ESI
00401608 |. 5B POP EBX
00401609 |. 8BE5 MOV ESP,EBP
经过以上分析,其实注册的算法很简单,主要是如何找到算法在哪个地方进行。
针对yingzi的KEY如下:
y+i+n=150
150*3E8=52080=336000(十进制)
g+z+i=14A=330(十进制)
于是相加便得到注册KEY:336000+330=336330,单击确定出现这个界面,表示成功
现在做到第三个了,我把这一个的破解过程给大家分享一下,大神们就飘过吧!
打开后,界面如下:
随便输入后按确定,发现没有反应。
直接 用OD载入看看吧,先设个断点看看,Ctrl+G跟踪表达式“GetWindowTextA”,F2设断,
然后按F9跑起来,发现还没有弹出界面就断在了GetWindowTextA处了。不管它,再按次F9,出现界面 后,NAME栏随便写,下面的SERIAL要输入数字,要不然还没进入验证就退出 了。不信可以试试。这里我输入yingzi(长度是六位,后面会解释) 123456,点击确定后,出现断在了刚才的那个点,按Ctrl+F9,几次后停在下图所示:
往上翻,有第一个retn后面设一个断点,重新加载程序。可以看到这个程序没有明显的函数调用!重新加载后,按F9运行,直到出现界面,按上面的输入,来到断点处。然后按F8单步调试。到00401638这一步注意,后面是将一个地址送进EAX,然后将EAX压栈,而且看后面的CALL,很像一个函数的调用,那就在数据窗口中跟随这个地址吧。单步运行,过了CALL过后,发现刚才跟随的地址中的值变了,选中地址中的值,在数据窗口中跟随,刚才输入的字符串就出现 了。 同理,单步运行过下一个CALL,再看ESI中的数据, 数据按正常顺序就是1E240,换成十进制就是123456。到这可以猜想刚才那两个CALL就是GetWindowTextA函数。
继续按几次Crtl+F9,来到这个地方:
发现这是要返回,往上翻,在这个函数的开头处下个断点,并取消之前的断点。
重新加载程序。单击确定之后,程序会断在刚才设的点上。单步运行,一直到
发现调用了地址0018FEC0,并将其传入ECX中,进行一个函数调用。再往下走,过 了CALL之后,看寄存器的值,EAX=002D4920 ASCII “yingzi” ,证明下面要对输入的数进行处理。往下走,到一个循环 这个循环是依次将输入的NAME放入EDX所指向的地方,查看EDX知道是放在栈中。
004015A2 |. 8A4424 16 MOV AL,BYTE PTR SS:[ESP+16]
004015A6 |. 84C0 TEST AL,AL 测试第七个字符是否为空
004015A8 |. 75 50 JNZ SHORT CRECKME_.004015FA 所以NAME是6个字符
004015AA |. 8A5424 15 MOV DL,BYTE PTR SS:[ESP+15]
004015AE |. 84D2 TEST DL,DL 测试第六个字条是否为空
004015B0 |. 74 48 JE SHORT CRECKME_.004015FA
004015B2 |. 8B43 78 MOV EAX,DWORD PTR DS:[EBX+78] 拿出我们的KEY
004015B5 |. 3D A0860100 CMP EAX,186A0 测试是否大于186A0=100000(十进制)
004015BA |. 7C 3E JL SHORT CRECKME_.004015FA
004015BC |. 0FBE7424 12 MOVSX ESI,BYTE PTR SS:[ESP+12] “n”
004015C1 |. 0FBE4C24 11 MOVSX ECX,BYTE PTR SS:[ESP+11] “i”
004015C6 |. 0FBE7C24 14 MOVSX EDI,BYTE PTR SS:[ESP+14] “z”
004015CB |. 03CE ADD ECX,ESI “ecx=i+n”
004015CD |. 0FBE7424 10 MOVSX ESI,BYTE PTR SS:[ESP+10] “y”
004015D2 |. 03CE ADD ECX,ESI ECX=ecx+y(前三个字母相加)
004015D4 |. 0FBE7424 13 MOVSX ESI,BYTE PTR SS:[ESP+13] “g”
004015D9 |. 0FBED2 MOVSX EDX,DL
004015DC |. 03F7 ADD ESI,EDI
004015DE |. 03F2 ADD ESI,EDX 后三个字母相加
004015E0 |. 99 CDQ
004015E1 |. BF E8030000 MOV EDI,3E8 3E8=1000(十进制)
004015E6 |. F7FF IDIV EDI 我们的KEY(123456)/1000
004015E8 |. 3BC8 CMP ECX,EAX 比较商,等于前三个字母相加则进行下一步
004015EA |. 75 0E JNZ SHORT CRECKME_.004015FA
004015EC |. 3BF2 CMP ESI,EDX 比较余数,等于后三个字母相加则进行下一步
004015EE |. 75 0A JNZ SHORT CRECKME_.004015FA
004015F0 |. 8B03 MOV EAX,DWORD PTR DS:[EBX]
004015F2 |. 8BCB MOV ECX,EBX
004015F4 |. FF90 54010000 CALL DWORD PTR DS:[EAX+154]
004015FA |> 8B8C24 940000>MOV ECX,DWORD PTR SS:[ESP+94]
00401601 |. E8 43040000 CALL CRECKME_.00401A49
00401606 |. 5F POP EDI
00401607 |. 5E POP ESI
00401608 |. 5B POP EBX
00401609 |. 8BE5 MOV ESP,EBP
经过以上分析,其实注册的算法很简单,主要是如何找到算法在哪个地方进行。
针对yingzi的KEY如下:
y+i+n=150
150*3E8=52080=336000(十进制)
g+z+i=14A=330(十进制)
于是相加便得到注册KEY:336000+330=336330,单击确定出现这个界面,表示成功
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [原创]浅谈windows下的隐藏 32410
- [原创]重载内核全程分析笔记 101267
- [原创]一枚CrackMe分析 25287
- [七夕]一枚好玩的KeygenMe 17883
看原图
赞赏
雪币:
留言: