飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8371|回复: 18

[转贴] Pj一个超简单的Crackme,适合像我一样的新手~_~

[复制链接]

该用户从未签到

发表于 2006-11-13 09:38:41 | 显示全部楼层 |阅读模式
标 题: 【原创】Pj一个超简单的Crackme,适合像我一样的新手~_~
作 者:
易leww
时 间: 2006-11-09,21:27
链 接: http://bbs.pediy.com/showthread.php?threadid=34667
【文章标题】: Pj一个超简单的Crackme,适合像我一样的新手~_~
【文章作者】: 易leww/今朝/Perforce
【下载地址】:
http://rapidshare.com/files/2627049/crackme.rar.html
【使用工具】: Peid,Ollydbg
【作者声明】: 新手入门ing,将自己刚取得的一点成就拿出来与大家分享,不足之处大虾们多多指教(哦,由于文章太初级,老鸟不看也罢

)。
     也就Crackmes.de上最简单级别的一个Crackme,建议最好不要先看本文,自己去调试一下到不会的地方再来参考;这也是我的体会,总觉得不少时候自己去分析还好,越是看别人的分析还就越迷,看着看着就头大了……(唉,没办法,人太笨了

) 好了,废话少说,开始::)
**********************************************************************
                        *>>>PART    1
     左边的汇编语句是几个Push然后后面一个Call,看来就是这个CALL把那个NAG给CALL了出来,得,干掉它!
     怎么干?
     Nop!!  (选中那行之后,按空格键,弹出的框里填Nop)
     既然那几个Push是给CALL送东西(参数)的,也同时Nop掉 。  
     好,现在我们已经把从0010103C到0040104A的四个PUSH和一个CALL都NOP掉了;按一下OD中有两个向左箭头的按钮(或Ctrl+F12)重新加载程序,F9运行。。。
      "What???"
      "Patch me if you can"!!!!
       明明NOP掉了呀


       怎么办?再看看喽~~~~~

     
  注:NOP掉之后,再CTRL+F12重新加载程序的话,原来NOP掉的东西会又出现,但是将以灰颜色显示。
     我们先不要CTRL+F12,看一下原来NOP掉的地方~~~~~发现什么了?   哪里NOP了,分明都还在嘛!但是,,,我们的的确确NOP过呀!
     怎么回事?  
     好,在NOP过的地方下断,我们看看到底怎么一回事。为了保险我们断点稍微靠前下些,我就在00401031处的PUSH处按F2(下断点)。
     CTRL+F12重新加载程序,将刚才的NOP(0040103C-0040104A)过程重复一遍,然后F9运行,程序断在我们所设的断点处,好,看好了:
     现在0010103C至0040104A显示的还是NOP,我们按F8步过这几个汇编指令:PUSH-->MOV-->ADD(F8到这里时看下下面是不是NOP,好,没有变)-->CALL(到这里时再看下下面是不是NOP,还好,还是没变),打住!
     等下再F8,怎么?你偏打不住?那好,你再F8,注意到下面没~~~~~什么?代码一下子又回来了!!!
     怎么回事??
     哦,原来那个CALL又把我们NOP掉的代码给CALL了回来!!!  嘿!好哇,谁怕谁呀,以为我不敢我把你这个CALL也给NOP掉!!
     再CTRL+F12,将00401037-0040104A全给NOP掉,F9运行,哈,哈哈,NAG没了!!!


     --------不要忘了保存哦,不然又要NOP半天(右键--复制到可执行文件--所有修改/全部复制>在弹出的窗口里单击右键,选保存文件,覆盖原文件)
       注:1.其实在00401037处也可以直接JMP到0040104F,省得NOP半天。
           2.仅仅如此的话,程序按下Check退出时会报错。(00401449处的CALL crackme.004015B3引起,要把这个CALL也给NOP掉才行,至于具体原因我也没搞太清楚

,还望高手指点迷津)
**********************************************************************
                        *>>>PART    2查找-->当前模块中的名称(标签),我们找到GetWindowTextA(此函数用来取我们输入文本框里的用户名和密码),双击进入反汇编窗口,前后看看,哦,下面还有一个长像差不多的GetWindowTextLengthA,从名字猜一下它的用途?
       对,它用来计算我们所输入内容的长度,两个函数中间的是此看不懂的东西不用去管了,我们就在GetWindowTextLengthA函数的00401290处按F2切换断点。
       好了,CTRL+F12,F9运行,输入Perforce/123456,Check!
       程序断在了我们设断的00401290,F8一下,注意EAX的值(为什么是8??还记不记得GetWindowTextLengthA是干什么用的?)
00401290   .  FF15 683C4000 call    [403C68]             ;  
00401296   .  83F8 05       cmp     eax, 5           ;将用户名长度与5比较
00401299   .  0F8C 43010000 jl      004013E2         ;小于5跳走
0040129F   .  83F8 08       cmp     eax, 8           ;大于等于8跳走
004012A2   .  0F8D 3A010000 jge     004013E2         ;我第一次输入的Perforce是8位,从这儿跳走了,导致失败
004012A8   .  8BC8          mov     ecx, eax         ;用户名长度赋给计数器
004012AA   .  890D 543C4000 mov     [403C54], ecx
004012B0   .  33DB          xor     ebx, ebx
004012B2   .  8D35 54304000 lea     esi, [403054]    ;Perforc的地址给ESI
004012B8   .  8D3D 54324000 lea     edi, [403254]    ;一个内存地址@1给EDI
004012BE   >  8A4431 FF     mov     al, [ecx+esi-1]  ;取esi处的数据(逆向,即依次为:c-r-o-f-r-e-P)
004012C2   .  80F9 04       cmp     cl, 4            
004012C5   .  74 13         je      short 004012DA   ;循环到CL==4时,将对应位赋值为-后,直接进入下次循环
004012C7   .  3C 4D         cmp     al, 4D           
004012C9   .  7C 04         jl      short 004012CF   ;所输入字符ASCII码值小于4D时,跳到加15处
004012CB   .  2C 11         sub     al, 11           ;不小于4D就减11
004012CD   .  EB 02         jmp     short 004012D1
004012CF   >  04 15         add     al, 15
004012D1   >  32C1          xor     al, cl           ;al与cl异或后,所得值放入al
004012D3   .  34 02         xor     al, 2            ;将上述al值与2异或后,放入al
004012D5   .  88043B        mov     [ebx+edi], al    ;al送至另一内存地址@1(所送数据为WeY-'T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
004012D8   . /EB 04         jmp     short 004012DE
004012DA   > |C6043B 2D     mov     byte ptr [ebx+edi], 2>
004012DE   > \43            inc     ebx
004012DF   .^ E0 DD         loopdne short 004012BE    ;循环ecx次
004012E1   .  8D35 54324000 lea     esi, [403254]     ;将地址@1送esi
004012E7   .  8D3D 54344000 lea     edi, [403454]     ;将另一地址@2送edi
004012ED   .  8B0D 543C4000 mov     ecx, [403C54]     ;循环次数送入ecx
004012F3   .  33DB          xor     ebx, ebx


00401328   >  80F9 04       cmp     cl, 4             ;同上
0040132B   .  74 17         je      short 00401344
0040132D   .  8A4431 FF     mov     al, [ecx+esi-1]   ;将@1处得到的新数据逆向分别送入al(依次为  04 15         add     al, 15
0040133B   >  32C1          xor     al, cl
0040133D   .  34 02         xor     al, 2
0040133F   .  88043B        mov     [ebx+edi], al     ;将得到的新数据送入@2(所送数据为TGH-ITE)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
00401342   . /EB 04          jmp     short 00401348
00401344   > |C6043B 2D      mov     byte ptr [ebx+edi], 2D
00401348   > \43             inc     ebx
00401349   .^ E0 DD          loopdne short 00401328
0040134B   .  C705 603C4000 >mov     dword ptr [403C60],
00401355   .  832D 603C4000 >sub     dword ptr [403C60], 7
***********************************
0040135C   .  68 54324000    push    00403254                       ;  ASCII "WeY-`Tadd     dword ptr [403C5C], 2
0040136D   .  FF15 5C3C4000  call    [403C5C]                       ;  ---连接字符串,得到注册码。
*********************************************************************
第一次我输入的Perforce是8位,从0040129F处跳走了;
既然用户名长度应是5-7位,我只好把名字给割了尾巴:Perforc,密码还是123456。
  上面已经写得很清楚,大体上就是

        A:先将所输入的5至7位的用户名(按逆向)各位所对应的ASCII值进行:若小于4D则加15,否则减去11-->与ecx异或(ecx的值由7至1递减)-->与2异或-->将循环得到的字符串(WeY-`T=8)
   { printf("The len of username must between 5 and 8!\n");
     goto input;}
  printf("The username is:%s\n",user);
  for(j=0;j<i/2;j++)
    { a=user[j];
      user[j]=user[i-j-1];
      user[i-j-1]=a;
    }
  /*printf("user=%s",user);*/
loop:  for(j=0;j<=i-1;j++)
    if   (user[j]<77) user[j]=user[j]+21;
    else  user[j]=user[j]-17;
  for(j=0;j<i;j++)
   {if(j!=i-4){user[j]=user[j]^(i-j);
       user[j]=user[j]^2;
       }
    else user[j]=45;
   }
/*  printf("nnnn:%s\t",user);*/
  for(j=0;j<i;j++)
  user[j+i*(b+1)]=user[j];
  if(b==1)
   {for(j=0;j<i/2;j++)
    { a=user[j];
     user[j]=user[i-j-1];
     user[i-j-1]=a;
    }b=b-1;goto loop;
   }
  if(b==0)
   printf("The serial is:%s\n",user+i);
/*   printf("Press ENTER to quit...");
   scanf("%c",&a);*/
***到这里我总算懂得了以前前辈们写专门供给我们这些菜鸟看的破文时有多辛苦了***
        另:连接之后生成的可执行文件输入用户名之后看不清注册码的就马上退出了,有什么办法让它停下吗?我不是学计算机专业的,才刚开始自学,所以可能许多比较基础的知识都不懂。
crackmeXSPJ.rar (7.79 KB, 下载次数: 8884)

来自:看雪学院

[ 本帖最后由 Mysoft 于 2006-11-13 09:40 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2006-11-13 11:50:01 | 显示全部楼层
多谢兄弟转来好教程,偶认真学习下啊~
PYG19周年生日快乐!

该用户从未签到

发表于 2006-11-13 12:58:38 | 显示全部楼层
先自己破解...如果破解不出来才看看..谢谢
PYG19周年生日快乐!

该用户从未签到

发表于 2006-11-13 14:24:59 | 显示全部楼层
学习中……
感谢分享,收藏!!
PYG19周年生日快乐!

该用户从未签到

发表于 2006-11-14 09:37:49 | 显示全部楼层
问题是自己不知从哪开始破,呵呵,我是新手中的新手~
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2006-11-14 17:56:45 | 显示全部楼层
    谢谢了,我是新手,跟着做了一遍,有些启发,希望能多看到这类普及的东西。
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2019-10-20 00:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2006-11-15 02:13:09 | 显示全部楼层
    下载下来看看,看能不能让自己也喜欢上这个
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-11-15 03:11:38 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-6-11 12:16
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2006-11-15 09:16:15 | 显示全部楼层
    支持再支持
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-11-15 18:31:35 | 显示全部楼层
    下下来学习一下
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表