【文章标题】: 菜鸟学crackMe (二)
【文章作者】: shaochem
【作者邮箱】: xiaoqing325@gmail.com
【软件名称】: Crackme v2 by LuCiFeR.exe
【软件大小】: 419k
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 无
【编写语言】: c++
【使用工具】: OD
【操作平台】: windows 2003 Server
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
今天这个crackMe也很简单,无壳,运行了下,是个控制台的应用程序。
打开程序随便输入name和serial,然后回车,出现如下字样“Error :: Not a correct Serial”。
我们直接od载入,查找--所有字符串参考,下断,运行。我们来首先看看代码:
00401668 |. 8D85 F8FEFFFF lea eax, dword ptr [ebp-108] ; |
0040166E |. 890424 mov dword ptr [esp], eax ; |
00401671 |. E8 5AF60000 call <jmp.&msvcrt.strlen> ; \取你输入name的长度
00401676 |. 89C2 mov edx, eax
00401678 |. 69D2 CD750800 imul edx, edx, 875CD ; 长度乘以875CD
0040167E |. B8 1F85EB51 mov eax, 51EB851F
00401683 |. F7E2 mul edx ; 然后再乘以一个立即数
00401685 |. 89D0 mov eax, edx
00401687 |. C1E8 05 shr eax, 5 ; 然后把它右移5位
0040168A |. 69C0 90FCFFFF imul eax, eax, -370 ; 然后把它乘以-370
00401690 |. BA 00000000 mov edx, 0 ; 下面准备构造字符串了
00401695 |. 52 push edx ; ||format => NULL
00401696 |. 50 push eax ; ||s
00401697 |. DF2C24 fild qword ptr [esp] ; ||
0040169A |. 8D6424 08 lea esp, dword ptr [esp+8] ; ||
0040169E |. DD9D F0FBFFFF fstp qword ptr [ebp-410] ; ||
004016A4 |. DD85 F0FBFFFF fld qword ptr [ebp-410] ; ||它是按照浮点数的方式
004016AA |. DD5C24 08 fstp qword ptr [esp+8] ; ||取前面的四个字节
004016AE |. C74424 04 691>mov dword ptr [esp+4], 00401469 ; ||ASCII "%i-x019871"
004016B6 |. 8D85 F8FCFFFF lea eax, dword ptr [ebp-308] ; ||
004016BC |. 890424 mov dword ptr [esp], eax ; ||
004016BF |. E8 FCF50000 call <jmp.&msvcrt.sprintf> ; |\sprintf
004016C4 |. 8D85 F8FCFFFF lea eax, dword ptr [ebp-308] ; |
004016CA |. 894424 04 mov dword ptr [esp+4], eax ; |
004016CE |. 8D85 F8FDFFFF lea eax, dword ptr [ebp-208] ; |
004016D4 |. 890424 mov dword ptr [esp], eax ; |
004016D7 |. E8 D4F50000 call <jmp.&msvcrt.strcmp> ; \把生成的字符串和你输入的serial来做比较
004016DC |. 8985 ECFBFFFF mov dword ptr [ebp-414], eax
004016E2 |. 83BD ECFBFFFF>cmp dword ptr [ebp-414], 0
004016E9 |. 74 2E je short 00401719 ; 相等就跳到成功,否则就完蛋
004016EB |. C74424 04 901>mov dword ptr [esp+4], 00401490 ; ASCII "Error :: Not a correct Serial",LF
004016F3 |. C70424 B07543>mov dword ptr [esp], 004375B0 ; ASCII "lbC"
004016FA |. E8 E1080300 call 00431FE0
004016FF |. C70424 AF1440>mov dword ptr [esp], 004014AF ; ||ASCII "pause"
00401706 |. E8 D5F50000 call <jmp.&msvcrt.system> ; |\system
0040170B |. C70424 8F1340>mov dword ptr [esp], 0040138F ; |ASCII "cls"
00401712 |. E8 C9F50000 call <jmp.&msvcrt.system> ; \system
00401717 |. EB 40 jmp short 00401759
00401719 |> C74424 04 B51>mov dword ptr [esp+4], 004014B5 ; ASCII "Correct :: Good Work",LF
00401721 |. C70424 B07543>mov dword ptr [esp], 004375B0 ; ASCII "lbC"
00401728 |. E8 B3080300 call 00431FE0
0040172D |. C74424 04 CB1>mov dword ptr [esp+4], 004014CB ; ASCII "Now write a KeyGen!",LF,LF,LF
00401735 |. C70424 B07543>mov dword ptr [esp], 004375B0 ; ASCII "lbC"
其实他的算法很简单,就是{【strlen(name)*875cd】>>5}*【-370】,然后把最后的结果构造为一个xxxxxxxx-x019871这样的字符串,然后和你输入的Serial来做比较。
但是这里他在构造那个字符串的时候是按照浮点数的方式取你做运算后的值的前四个字节,这里有点搞人。
我们先看EAX为FF20A810,无符号为4280330256,但是它在构造字符的时候只取了它的高位。如图。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2010年03月31日 下午 04:43:37
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课