首页
社区
课程
招聘
[原创]菜鸟学crackMe (二)
发表于: 2010-3-31 16:51 3745

[原创]菜鸟学crackMe (二)

2010-3-31 16:51
3745
【文章标题】: 菜鸟学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直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 148
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我申请邀请码~
2010-3-31 17:11
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
现在还看不懂,以后再说
2010-3-31 18:00
0
雪    币: 505
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持原创,楼主努力
2010-3-31 18:59
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
额。。。刚学破解,看着有点晕晕的,有没初学者的Crackme
2010-3-31 19:32
0
雪    币: 148
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
这就很适合初学者啊
算法简单,就那么简单几行而已啊
2010-3-31 19:37
0
雪    币: 423
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我是初学者~楼主还是比我强的!
2010-3-31 19:58
0
雪    币: 148
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
其实这个crackMe的注册机应该很好写啦
贴下我自己写的一个主要代码,有什么问题请大家批评指正:
           UpdateData();
        if ( m_name.IsEmpty())
        {
                AfxMessageBox("不可以为空哦!");
                return;
        }
       
        unsigned int i=-880;
        unsigned long b=0;
        int len=strlen(m_name);
        b=((len*554445)/100)*i;
        double f=b;         //这个地方要把它转为double
        int* f1=(int*)&f;   //这里要用int,取它的高位,前四个字节
        b=(long)(*f1);
                sprintf((LPSTR)(LPCTSTR)m_serial,"%u-x019871",b);
        UpdateData(FALSE);
2010-4-1 09:42
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
2009/8 的临时用户.. 你注册晚了一点点
2010-4-1 09:50
0
雪    币: 148
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
终于升级啦

2010-4-1 17:31
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
恭喜楼主了.
2010-4-2 06:32
0
游客
登录 | 注册 方可回帖
返回
//