首页
社区
课程
招聘
[原创][看雪读书月]《2008看雪论坛读书月第一题crackMe01》破解随笔
发表于: 2008-7-13 20:41 16111

[原创][看雪读书月]《2008看雪论坛读书月第一题crackMe01》破解随笔

2008-7-13 20:41
16111

【文章标题】: 【原创】【看雪读书月】《2008看雪论坛读书月第一题crackMe01》破解随笔
【文章作者】: NBA2005
【作者QQ号】: 382309369
【软件名称】: 2008看雪论坛读书月第一题crackMe01
【软件大小】: 24KB
【下载地址】: http://bbs.pediy.com/showthread.php?t=68174
【加壳方式】: 无
【保护方式】: 六神合体
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD
【操作平台】: WIN XP
【软件介绍】: 2008看雪论坛读书月第一题
【作者声明】: 为了庆贺《加密和解密III》的正式发行,为了体现我等菜鸟同乐的心情,特写此文共同娱乐!!!
--------------------------------------------------------------------------------

看雪论坛读书月
六神合体难上难
山重水复疑无路
柳暗花明又一神

【详细过程】

                          第一部分   明明白白我的心。

      2008年7月11日上午八时,朋友QQ就问候:2008看雪论坛读书月第一题crackMe01你做了吗?挺有意思的。上网一看,果然有。这看雪老大也是的,干吗不在周末发布呢?再一想,周末未必就有充足的时间。中午看看吧,第一题不会太难吧。
  
      焚香,下载,试运行。中午吃过饭,立刻OD动态调试,开始一探究竟:
      1.用户名什么都不输入,提示"请输入用户名"。随便输入用户名,提示非法用户。看来用户名有限制条件。
        大写、小写和数字,发现要小写。
      2.注册码什么都不输入,提示"请输入注册码"。随便输入注册码,出现错误提示。
  
      为什么叫六神合体呢?我看到CRACK ME的标题,觉得奇怪。
  
      先用我的常用断点系统第一招:字符串查找。
  
      Ultra String Reference
  Address    Disassembly                               Text String
  00401059   mov     dword ptr [eax], 00403260         h"@
  00401155   push    00402629                          葛5@
  004012AB   mov     dword ptr [eax], 00403390         r#@
  004013C7   mov     dword ptr [ecx], 0040346C         r#@
  004015D5   push    004026B9                          辅6@
  00401655   push    004026D9                          感6@
  0040177B   push    0040354C                          恭喜!
  00401780   push    00403544                          过关!
  004017BB   push    00403560                          错了!
  004017C0   push    00403554                          继续努力!
  004017FC   mov     dword ptr [ebp-4], 00403588       abcdefghijklmnopqrstuvwxy
  004018BD   push    00403560                          错了!
  004018C2   push    00403554                          继续努力!
  0040195F   mov     dword ptr [ebp-3C], 00403578      abcdefghijklmn
  00401966   mov     dword ptr [ebp-40], 00403568      opqrstuvwxyz
  00401AF9   push    004035A4                          explorer.exe
  00401BB5   push    004026F0                          给6@
  00401D4A   push    004035D0                          请输入用户名!
  00401D70   push    004035C0                          请输入注册码!
  00401DC7   push    004035B4                          非法用户!
  00402418   push    ebp                               (initial cpu selection)
  
  首先我看到了:
  00401BB5   push    004026F0                          给6@
  00401D4A   push    004035D0                          请输入用户名!
  00401D70   push    004035C0                          请输入注册码!
  00401DC7   push    004035B4                          非法用户!
  
  哈哈,这么快就确定了注册判断的地方。
  
  双击之,来到:
  
  00401D39  |.  52            push    edx                              ; /s
  00401D3A  |.  E8 C1060000   call    <jmp.&MSVCRT.strlen>             ; \strlen
  00401D3F  |.  83C4 04       add     esp, 4
  00401D42  |.  85C0          test    eax, eax
  00401D44  |.  75 16         jnz     short 00401D5C
  00401D46  |.  6A 00         push    0
  00401D48  |.  6A 00         push    0
  00401D4A  |.  68 D0354000   push    004035D0                         ;  请输入用户名!
  00401D4F  |.  8B4D FC       mov     ecx, [local.1]
  00401D52  |.  E8 2B060000   call    <jmp.&MFC42.#4224>
  00401D57  |.  E9 B3000000   jmp     00401E0F
  00401D5C  |>  8B45 F8       mov     eax, [local.2]
  00401D5F  |.  50            push    eax                              ; /s
  00401D60  |.  E8 9B060000   call    <jmp.&MSVCRT.strlen>             ; \strlen
  00401D65  |.  83C4 04       add     esp, 4
  00401D68  |.  85C0          test    eax, eax
  00401D6A  |.  75 16         jnz     short 00401D82
  00401D6C  |.  6A 00         push    0
  00401D6E  |.  6A 00         push    0
  00401D70  |.  68 C0354000   push    004035C0                         ;  请输入注册码!
  00401D75  |.  8B4D FC       mov     ecx, [local.1]
  
  这段肯定是对用户名和注册码的限制条件的验证。
  
  往下看:
  
  00401D89  |> /8B4D F4       /mov     ecx, [local.3]
  00401D8C  |. |034D F0       |add     ecx, [local.4]
  00401D8F  |. |0FBE11        |movsx   edx, byte ptr [ecx]
  00401D92  |. |85D2          |test    edx, edx
  00401D94  |. |74 27         |je      short 00401DBD
  00401D96  |. |8B45 F4       |mov     eax, [local.3]
  00401D99  |. |0345 F0       |add     eax, [local.4]
  00401D9C  |. |0FBE08        |movsx   ecx, byte ptr [eax]
  00401D9F  |. |83F9 61       |cmp     ecx, 61
  00401DA2  |. |7E 19         |jle     short 00401DBD
  00401DA4  |. |8B55 F4       |mov     edx, [local.3]
  00401DA7  |. |0355 F0       |add     edx, [local.4]
  00401DAA  |. |0FBE02        |movsx   eax, byte ptr [edx]
  00401DAD  |. |83F8 7A       |cmp     eax, 7A
  00401DB0  |. |7D 0B         |jge     short 00401DBD
  00401DB2  |. |8B4D F0       |mov     ecx, [local.4]
  00401DB5  |. |83C1 01       |add     ecx, 1
  00401DB8  |. |894D F0       |mov     [local.4], ecx
  00401DBB  |.^\EB CC         \jmp     short 00401D89
  00401DBD  |>  837D F0 06    cmp     [local.4], 6
  00401DC1  |.  74 13         je      short 00401DD6
  00401DC3  |.  6A 00         push    0
  00401DC5  |.  6A 00         push    0
  00401DC7  |.  68 B4354000   push    004035B4                         ;  非法用户!
  
  61和7A,a和z的外号。用户名必须是a-z的24个小写字母(不含a、z),长度必须是六位。
  
  
  000401DD9  |.  52            push    edx                              ; /src
  00401DDA  |.  68 6C414000   push    0040416C                         ; |bcdefg
  00401DDF  |.  E8 2E060000   call    <jmp.&MSVCRT.strcpy>             ; \strcpy
  00401DE4  |.  83C4 08       add     esp, 8
  00401DE7  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
  00401DEA  |.  50            push    eax                              ; /src
  00401DEB  |.  68 EC404000   push    004040EC                         ; |1234567890
  00401DF0  |.  E8 1D060000   call    <jmp.&MSVCRT.strcpy>             ; \strcpy
  00401DF5  |.  83C4 08       add     esp, 8
  
  复制用户名和注册码到内存地址。
  
  00401E03  |.  8B45 EC       mov     eax, dword ptr [ebp-14]
  00401E06  |.  50            push    eax
  00401E07  |.  E8 A4FDFFFF   call    00401BB0
  
  call    00401BB0  应该是关键CALL。进入。。。。。。
  
  看来作者手下留情了。简单的限制条件、没有加密的字符串。
  
  这么简单?刚开始发现字符串时的激动渐渐消去,失望的情绪开始蔓延。困意开始向我涌来。

                           第二部分:山重水复疑无路。
  
  进入call    00401BB0:
  
  00401BB0   $  55            push    ebp
  00401BB1   .  8BEC          mov     ebp, esp                         ;  (initial cpu selection)
  00401BB3   .  6A FF         push    -1
  00401BB5   .  68 F0264000   push    004026F0                         ;  给6@; SE 处理程序安装
  00401BBA   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
  00401BC0   .  50            push    eax
  00401BC1   .  64:8925 00000>mov     dword ptr fs:[0], esp
  00401BC8   .  51            push    ecx
  00401BC9   .  83EC 50       sub     esp, 50
  00401BCC   .  53            push    ebx
  00401BCD   .  56            push    esi
  00401BCE   .  57            push    edi
  00401BCF   .  8965 F0       mov     dword ptr [ebp-10], esp
  00401BD2   .  8B45 08       mov     eax, dword ptr [ebp+8]
  00401BD5   .  83E8 10       sub     eax, 10
  00401BD8   .  8945 EC       mov     dword ptr [ebp-14], eax
  00401BDB   .  8B4D EC       mov     ecx, dword ptr [ebp-14]
  00401BDE   .  C701 F0174000 mov     dword ptr [ecx], 004017F0
  00401BE4   .  C745 E8 00000>mov     dword ptr [ebp-18], 0
  00401BEB   .  C745 E4 00000>mov     dword ptr [ebp-1C], 0
  
  初始化的过程。
  
  00401BF2   . /EB 05         jmp     short 00401BF9
  00401BF4   . |F9            stc
  00401BF5   . |73 01         jnb     short 00401BF8
  00401BF7   . |C3            retn
  00401BF8   . |FFE8          jmp     far eax                          ;  非法使用寄存器
  00401BFA   .  F6FF          idiv    bh
  00401BFC   .  FFFF          ???                                      ;  未知命令
  
  似乎是花指令?我的精神一振,难道亮点在这?
  
  00401BFE   > /837D E8 06    cmp     dword ptr [ebp-18], 6
  00401C02   ? |7D 6D         jge     short 00401C71
  
  00401C10   .  8B55 0C       mov     edx, dword ptr [ebp+C]
  00401C13   .  0355 E8       add     edx, dword ptr [ebp-18]
  00401C16   .  0FBE02        movsx   eax, byte ptr [edx]
  00401C19   .  8B4D 10       mov     ecx, dword ptr [ebp+10]
  00401C1C   .  034D E4       add     ecx, dword ptr [ebp-1C]
  00401C1F   .  0FBE11        movsx   edx, byte ptr [ecx]
  00401C22   .  83C2 1B       add     edx, 1B
  00401C25   .  3BC2          cmp     eax, edx
  00401C27   .  74 05         je      short 00401C2E
  00401C29   .  E8 82FBFFFF   call    004017B0                         ;  错误提示
  
  
  用户名和注册码奇数位的对应关系。
  
  00401C3A   .  8B45 0C       mov     eax, dword ptr [ebp+C]
  00401C3D   .  0345 E8       add     eax, dword ptr [ebp-18]
  00401C40   .  0FBE08        movsx   ecx, byte ptr [eax]
  00401C43   .  8B55 10       mov     edx, dword ptr [ebp+10]
  00401C46   .  0355 E4       add     edx, dword ptr [ebp-1C]
  00401C49   .  0FBE42 01     movsx   eax, byte ptr [edx+1]
  00401C4D   .  83C0 20       add     eax, 20
  00401C50   .  3BC8          cmp     ecx, eax
  00401C52   . /7E 09         jle     short 00401C5D
  
  用户名和注册码偶数位的对应关系。
  
  00401C54   . |8B4D EC       mov     ecx, dword ptr [ebp-14]
  00401C57   . |C701 B0174000 mov     dword ptr [ecx], 004017B0        ;  入口地址
  00401C5D   > \8B55 E4       mov     edx, dword ptr [ebp-1C]
  
  错误提示的入口地址。
  
  00401C84   .  C745 E0 9C020>mov     dword ptr [ebp-20], 29C
  00401C8B   .  8B4D E0       mov     ecx, dword ptr [ebp-20]
  00401C8E   .  C601 06       mov     byte ptr [ecx], 6
  00401C91   .  EB 0B         jmp     short 00401C9E
  
  调试执行到这,突然无声地退出。我愣住了,一时没明白过来,不知发生了什么事情。
  看来机关在这。我的睡意突然消失得无影无踪。难道是SEH异常处理?
  
  
  00401BB5   .  68 F0264000   push    004026F0                         ;  给6@; SE 处理程序安装
  
  对应byte ptr [ecx]的异常处理:
  00401BDE   .  C701 F0174000 mov     dword ptr [ecx], 004017F0
  
  .......
  
      好了,中场休息。我将目光转向了前几天未看完的碟片,轻松一下,换换脑子。剧中的
  男主角一边大喊:“快来看啊,有美女裸奔啊”,一边向聚拢来的人群发放广告。
  
      我忽然脑中灵光一闪,依稀中Netwind就是男主角。不是吗?他用简单的字符串提示,制
  造了这个CRACK ME很简单的初步印象,吸引来做他的作品。都到半路了,他突然抛出一个
  对菜鸟来说重量级的破解难题。可怜的菜鸟我一不小心上了贼船,欲罢不能。
  
      其实可做性是衡量一个CRACK ME好坏的一个判断标准。Netwind自然是深谙其道。第一部分自始自终
  贯彻了可做性的原则,吸引了无数破解爱好者的兴趣,达到了他的广告效应。
  
      第一部分的标题就是:明明白白我的心。
  
      许多人被困在了第二部分,在此迷茫、彷徨。
  
      第二部分的标题就是:山重水复疑无路。相信许多人有同感。
  
      让我们一起曲径探幽,走出困境。
  
      从现象上看,肯定是利用SEH异常处理来进行预定的跳转。但是,单独运行CRACK ME,却发现并没有
  无声地退出,而是出现了错误的提示。然而在OD的动态调试中,在此它却没出现任何的提示。这说明,还有
  其他的机关在其中。
  
      通常情况下,这种情况的可能性有:
      1.反调试。  我的第一直觉就是反调试。
      2.自校验。  可能性不大。因为我在动态调试时,没有进行任何的代码改写。
  
      认真地单步跟进异常处理机制,跟了一会儿我就确定确实有反调试。让我们认真地回顾中间这部分的难点,认真地进行思考,作者的加密思想在我们的脑海中渐渐清晰明了:
  
       该CRACK ME加密思想的核心是三种加密手段的有机组合威力。三种加密手段分别是花指令、SEH异常跳转和反调试。大概就是六神中的三神吧。花指令主要作用是对付静态汇编,同时动态调试时干扰代码的可读性。SEH异常处理机制来进行预定的跳转,是常用的加密手段,具有一定的隐蔽性。作者对它进行了改进:与反调试有机地结合,增加了隐蔽性和欺骗性。三种加密手段
遥相呼应,互相照顾。可以说,作者的构思是成功的,这也是难点所在。但从实战的效果上看,
我直觉这加密思想里隐约有一个巨大的缺陷,即BUG。但一时半会却不能清晰地把握。
  
       上班时间到了。只好暂时放下,准备晚上继续奋战。
  
       。。。。。。
  
       竟忘了是周末,和狐朋狗友玩了一夜。玩乐的间隙中,脑中总是不自禁地试图捕捉那个隐约的BUG。Netwind真害人啊,让我辜负了美女佳肴,做了一夜的柳下惠。那个隐约的BUG在不断地思考中,越来越清晰可见。作者对我的偷懒的想法有没有考虑到而进行防范呢?
  
       回到了家里,已经深夜12点多了。我说服自己,就花一个小时,破不了就放弃,大不了明天继续。
  
      这个加密思想的实战效果主要体现在隐蔽性。一旦被人发现并确定,其加密的效果形同虚设。特别是将反调试与SEH的处理机制相结合,强调的也是隐蔽性。被我们发现后,其弄巧成拙的缺陷就显示出来了。
  
  00401C78     /EB 05         jmp     short 00401C7F
  00401C7A     |F9            stc
  00401C7B     |73 01         jnb     short 00401C7E
  00401C7D     |C3            retn
  00401C7E     |FFE8          jmp     far eax                          ;  非法使用寄存器
  00401C80      F6FF          idiv    bh
  00401C82      FFFF          ???                                      ;  未知命令
  
  00401C84   .  C745 E0 9C020>mov     dword ptr [ebp-20], 29C
  00401C8B   .  8B4D E0       mov     ecx, dword ptr [ebp-20]
  00401C8E   .  C601 06       mov     byte ptr [ecx], 6
  00401C91   .  EB 0B         jmp     short 00401C9E
  
  我们在异常处理前,对花指令全部NOP填充(视觉舒服),然后改写成一句:
  00401C78    ^\E9 74FBFFFF   jmp     004017F0
  00401C7D      90            nop
  00401C7E      90            nop
  00401C7F      90            nop
  00401C80      90            nop
  00401C81      90            nop
  00401C82      90            nop
  00401C83      90            nop
  
  00401C84   .  C745 E0 9C020>mov     dword ptr [ebp-20], 29C
  00401C8B   .  8B4D E0       mov     ecx, dword ptr [ebp-20]
  00401C8E   .  C601 06       mov     byte ptr [ecx], 6
  00401C91   .  EB 0B         jmp     short 00401C9E
  
     什么SEH,什么狗屁反调试,统统和你说再见!!!
  
     哈哈,原来所谓的万人愁、神勇的三神竟是如此的不堪一改。想想那些老老实实在那反调试的高手们,我的嘴角露出了一抹会心地微笑:懒人万岁!!!

     因为懒,所以才会要求进步。这就是懒人的辩证的哲学观。
  
     恍惚中,我忽然成了《笑傲江湖》里的令狐冲:
  
  {
   
                    摘自《笑傲江湖》  第二十六章 围寺
  
       那老者“咦”的一声,脸上微现惊异之色。那老者剑交左手,在身前
  划了两个圆圈。令狐冲见他剑劲连绵,护住全身,竟无半分空隙,暗暗惊异:“我从未见过
  谁的招式之中,竟能如此毫无破绽。他若以此相攻,那可如何破法?任我行前辈剑法或许比
  这位老先生更强,但每一招中难免仍有破绽。难道一人使剑,竟可全无破绽?”
  
      。。。。。。
  
    那老者剑招未曾使老,已然圈转。突然之间,令狐冲眼前出现了几个白色光圈,大圈小
  圈,正圈斜圈,闪烁不已。他眼睛一花,当即回剑向对方剑圈斜攻。当的一响,双剑再交,
  令狐冲只感手臂一阵酸麻。
    那老者剑上所幻的光圈越来越多,过不多时,他全身已隐在无数光圈之中,光圈一个未
  消,另一个再生,长剑虽使得极快,却听不到丝毫金刃劈风之声,足见剑劲之柔韧已达于化
  境。这时令狐冲已瞧不出他剑法中的空隙,只觉似有千百柄长剑护住了他全身。那老者纯采
  守势,端的是绝无破绽。可是这座剑锋所组成的堡垒却能移动,千百个光圈犹如浪潮一般,
  缓缓涌来。那老者并非一招一招的相攻,而是以数十招剑法混成的守势,同时化为攻势。令
  狐冲无法抵御,只得退步相避。
    他退一步,光圈便逼进一步,顷刻之间,令狐冲已连退了七八步。
  
      。。。。。。
  
    他又退几步,凝视对方剑光所幻的无数圆圈,蓦地心想:“说不定这圆圈的中心,便是
  破绽。但若不是破绽,我一剑刺入,给他长剑这么一绞,手臂便登时断了。”
    又想:“幸好他如此攻逼,只能渐进,当真要伤我性命,却也不易。但我一味退避,终
  究是输了。此仗一败,大伙儿心虚气馁,哪里还能去闯少林,救盈盈?”想到盈盈对自己情
  深义重,为她断送一条手臂,又有何妨?内心深处,竟觉得为她断送一条手臂,乃是十分快
  慰之事,又觉自己负她良多,须得为她受到甚么重大伤残,方能稍报深恩。言念及此,内心
  深处,倒似渴望对方能将自己一条手臂斩断,当下手臂一伸,长剑便从老者的剑光圈中刺了
  进去。当的一声大响,令狐冲只感胸口剧烈一震,气血翻涌,一只手臂却仍然完好。那老者
  退开两步,收剑而立,脸上神色古怪,既有惊诧之意,亦有惭愧之色,更带着几分惋惜之情
  ,隔了良久,才道:“令狐公子剑法高明,胆识过人,佩服,佩服!”令狐冲此时方知,适
  才如此冒险一击,果然是找到了对方剑法的弱点所在,只是那老者剑法实在太高,光圈中心
  本是最凶险之处,他居然练得将破绽藏于其中,天下成千成万剑客之中,只怕难得有一个胆
  敢以身犯险。他一逞而成,心下暗叫:“侥幸,侥幸!”只觉得一道道汗水从背脊流下,当
  即躬身道:“前辈剑法通神,承蒙指教,晚辈得益非浅。”这句话倒不是寻常的客套,这一
  战于他武功的进益确是大有好处,令他得知敌人招数中之最强处,竟然便是最弱处,最强处
  都能击破,其余自是迎刃而解了。
    高手比剑,一招而决。那老者即见令狐冲敢于从自己剑光圈中挥刃直入,以后也就不必
  再比。
  
  }
  
      那么,这是不是就证明作者的这种加密思想不成立呢?答案当然是否定的。以Netwind的
  功力,应该会考虑到这种投机取巧的破法。
  
      这种加密思想有实用价值。
  
     我首先肯定它的实用性。其次,我要做的就是对BUG进行完善、改进。我自己设想,对这段
  代码进行简单的自校验就能对我的投机进行有效的防范。最后我破解成功后,自己认为只有五
  神。花指令、SEH异常跳转和反调试,有了三神了。(第四神在最后部分的开始,第五神是最
  后的简单算法)那么,自校验是不是作者心中原来的六神之一呢?当然了,其他还有许多较巧妙
  的弥补缺陷的手段。自校验更容易让我等菜鸟理解。
  
       一个好的CRACK ME,是会留有一个破解的作弊法,类似于游戏中的作弊秘籍。主要目的是提高可玩性、可欣赏性。这样,就不致于不会反调试,就体会不到下面的巧妙。这就是所谓的
雅俗共赏吧。高手有高手的正规破解法,我等菜鸟有菜鸟非常规的投机术。各有各的乐趣。
  
       抬眼看去,快半个小时了。算了,以后再试验四神合作的威力吧。破解要紧。我这人就这
  毛病,破解老是去想注册码以外的问题,破解效率一直不高。不要嫌我啰嗦!

                      第三部分:柳暗花明又一神
  
      所谓成也萧何,败也萧何!由于这一次的投机取巧成功,滋生了我的小资产阶级意识。我的思维渐渐被邪门外道占据,以致于在随后的第四神前面,企图一探反调试的奥妙时,尽想走捷径,反而事与愿违,走了许多的弯路,浪费了大量宝贵的睡眠时间(主要是在反调试上,总尝试投机的可能性)。
  
  004018BB  |>  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
  004018BD  |.  68 60354000   push    00403560                         ; |错了!
  004018C2  |.  68 54354000   push    00403554                         ; |继续努力!
  004018C7  |.  0FBE0D F64040>movsx   ecx, byte ptr [4040F6]           ; |
  004018CE  |.  83E9 55       sub     ecx, 55                          ; |
  004018D1  |.  F7D9          neg     ecx                              ; |
  004018D3  |.  1BC9          sbb     ecx, ecx                         ; |
  004018D5  |.  41            inc     ecx                              ; |
  004018D6  |.  51            push    ecx                              ; |hOwner
  004018D7  |.  FF15 00324000 call    dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
  004018DD  |.  8945 D8       mov     dword ptr [ebp-28], eax          ;  12F7C4  EBP-28
  004018E0  |.  837D D8 00    cmp     dword ptr [ebp-28], 0
  
  
     这是又一只拦路虎!但难度低于三神合一。与上面的三神相互照顾,其实战效果我是亲身经历,身有体会啊!好的CRACK ME就是这样,你越琢磨,心里的受惠就越多。(注意,不是受贿)。对作者的钦佩之心就越浓。
  
     第四神其实没什么难度。你只要将下面的出错信息和上面的对比,就会产生许多的疑问:
     1.这两段代码有什么不同?
       2.不同的意义何在?
     3.[4040F6]的内容是什么?
   
  
  004017B0  /$  55            push    ebp
  004017B1  |.  8BEC          mov     ebp, esp
  004017B3  |.  83EC 44       sub     esp, 44
  004017B6  |.  53            push    ebx
  004017B7  |.  56            push    esi
  004017B8  |.  57            push    edi
  004017B9  |.  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
  004017BB  |.  68 60354000   push    00403560                         ; |错了!
  004017C0  |.  68 54354000   push    00403554                         ; |继续努力!
  004017C5  |.  6A 00         push    0                                ; |hOwner = NULL
  004017C7  |.  FF15 00324000 call    dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
  004017CD  |.  FF15 20304000 call    dword ptr [<&KERNEL32.GetCurrent>; [GetCurrentProcess
  004017D3  |.  8945 FC       mov     dword ptr [ebp-4], eax
  004017D6  |.  6A 00         push    0                                ; /ExitCode = 0
  004017D8  |.  8B45 FC       mov     eax, dword ptr [ebp-4]           ; |
  004017DB  |.  50            push    eax                              ; |hProcess
  004017DC  |.  FF15 00304000 call    dword ptr [<&KERNEL32.TerminateP>; \TerminateProcess
  
  **********请先思考***********************************
  
  
  
  
  
    这三个问题很简单,认真思考后,你就会明白是对第六个字符的隐性判断条件:
    004018CE  |.  83E9 55       sub     ecx, 55                          ; |
    。。。。。。
    004018D6  |.  51            push    ecx                              ; |hOwner
   
    破解成功后,周日与朋友交谈。朋友也注意到了此处注册信息的异常,他是一开始就对55进行
了大胆的猜想,一试成功。我反应比较迟钝,对其的实现原理进行了大致猜测和跟踪后,才开始进行破解。

    会汇编编程的很容易理解这个难点。如果硬要说它的成功处,还是注重了隐蔽性。其实作者仁
慈地将异常暴露在最显眼的地方,显然是有意降低了难度。这第四神的加密思想就是注重隐性
判断条件的实现。隐性判断条件的巧妙构建和实现,似乎有流行的趋势。
     
    [PEDIY Crackme 竞赛 2007] [第一回] 第16 队 –topmint里关于用户名的隐性判断
  条件的构建和实现,堪称经典。
  
    让我印象深刻的原因在于:两位作者加密技术的精湛和化腐朽为神奇的功力。他们的共同技术
特点在于:将平凡的编程知识略做雕琢,竟使之立刻成了加密的利器。这似乎就是传说中的飞花摘叶、伤人无形的加密最高境界。

     我的大把时间浪费在手工反调试的研究上,与注册无关,纯粹个人的破解兴趣。主要研究的目标就是如何用简单的手段绕过反调试,也就是如何投机取巧。不知不觉,天已放亮。因此对最后的算法部分花的时间不多。
  
     从作者的CRACK ME的构思创作上,核心是中间的四神合一的组合。(如果加上自校验,就
  是五神合一了,加上最后的简单算法,共六神合体)。前面的简单部分和后面的算法部分,都是
  贯彻可破性和趣味性,给破解者以成就感,同时树立良好的CRACK ME形象,为以后的作品打下破解群众基础。
  
     简单介绍如下:
  
     将用户名第一位和第六位,分别与A-Z的大写字母依次奇数位或偶数位比较,相同就后移一个,大写字母的奇偶数就会发生变化,接着继续比较。

     不相同的字符存入堆栈:
     0012F7C8   48464441
     0012F7CC   504E4C4A
     0012F7D0   58565452
     0012F7D4   48464442
     0012F7D8   504E4C4A
     0012F7DC   58565452
  
     根据用户名第一位的ASCII是奇数或偶数的不同,上述堆栈有两种不同的结果。
  
     0040181F  |> /837D D8 18    /cmp     dword ptr [ebp-28], 18
  00401823  |. |0F84 92000000 |je      004018BB
  00401829  |. |EB 05         |jmp     short 00401830
  0040182B  |. |F9            |stc
  0040182C  |. |73 01         |jnb     short 0040182F
  0040182E  |. |C3            |retn
  0040182F  |. |FFE8          |jmp     far eax                         ;  非法使用寄存器
  00401831  |. |F6FF          |idiv    bh
  00401833  |. |FFFF          |???                                     ;  未知命令
  00401835  |. |0FBE0D 6C4140>|movsx   ecx, byte ptr [40416C]
  0040183C  |. |8B55 FC       |mov     edx, dword ptr [ebp-4]          ;  A-Z大写
  0040183F  |. |0FBE02        |movsx   eax, byte ptr [edx]
  00401842  |. |83C0 20       |add     eax, 20
  00401845  |. |3BC8          |cmp     ecx, eax
  00401847  |. |74 21         |je      short 0040186A
  00401849  |. |68 6C414000   |push    0040416C                        ; /bcdefg
  0040184E  |. |E8 AD0B0000   |call    <jmp.&MSVCRT.strlen>            ; \strlen
  00401853  |. |83C4 04       |add     esp, 4
  00401856  |. |0FBE88 6B4140>|movsx   ecx, byte ptr [eax+40416B]      ;  用户名
  0040185D  |. |8B55 FC       |mov     edx, dword ptr [ebp-4]          ;  A-Z大写
  00401860  |. |0FBE02        |movsx   eax, byte ptr [edx]
  00401863  |. |83C0 20       |add     eax, 20
  00401866  |. |3BC8          |cmp     ecx, eax
  00401868  |. |75 09         |jnz     short 00401873
  0040186A  |> |8B4D FC       |mov     ecx, dword ptr [ebp-4]          ;  A-Z大写字母
  0040186D  |. |83C1 01       |add     ecx, 1                          ;  
  00401870  |. |894D FC       |mov     dword ptr [ebp-4], ecx
  00401873  |> |8B55 D8       |mov     edx, dword ptr [ebp-28]         ;  
  00401876  |. |8B45 FC       |mov     eax, dword ptr [ebp-4]          ;  
  00401879  |. |8A08          |mov     cl, byte ptr [eax]
  0040187B  |. |884C15 DC     |mov     byte ptr [ebp+edx-24], cl
  0040187F  |. |8B55 D8       |mov     edx, dword ptr [ebp-28]
  00401882  |. |83C2 01       |add     edx, 1
  00401885  |. |8955 D8       |mov     dword ptr [ebp-28], edx
  00401888  |. |8B45 FC       |mov     eax, dword ptr [ebp-4]
  0040188B  |. |83C0 02       |add     eax, 2                          ;  A-Z大写字母的奇数位字符
  0040188E  |. |8945 FC       |mov     dword ptr [ebp-4], eax
  00401891  |. |EB 05         |jmp     short 00401898
  00401893  |. |F9            |stc
  00401894  |. |73 01         |jnb     short 00401897
  00401896  |. |C3            |retn
  00401897  |. |FFE8          |jmp     far eax                         ;  非法使用寄存器
  00401899  |. |F6FF          |idiv    bh
  0040189B  |. |FFFF          |???                                     ;  未知命令
  0040189D  |. |8B4D FC       |mov     ecx, dword ptr [ebp-4]
  004018A0  |. |0FBE11        |movsx   edx, byte ptr [ecx]
  004018A3  |. |85D2          |test    edx, edx
  004018A5  |. |75 0F         |jnz     short 004018B6
  004018A7  |. |837D D8 18    |cmp     dword ptr [ebp-28], 18
  004018AB  |. |7D 09         |jge     short 004018B6
  004018AD  |. |8B45 F8       |mov     eax, dword ptr [ebp-8]
  004018B0  |. |83C0 01       |add     eax, 1
  004018B3  |. |8945 FC       |mov     dword ptr [ebp-4], eax
  004018B6  |>^\E9 64FFFFFF   \jmp     0040181F
  004018BB  |>  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
  
  
     将用户名前五个字符和上述的堆栈结果分别分四位一组进行逐位对比,全都符合就成功:
  00401910  |> /837D D8 0C    /cmp     dword ptr [ebp-28], 0C
  00401914  |. |0F84 BB000000 |je      004019D5
  0040191A  |. |8B45 D0       |mov     eax, dword ptr [ebp-30]
  0040191D  |. |8D0C85 FCFFFF>|lea     ecx, dword ptr [eax*4-4]
  00401924  |. |894D C8       |mov     dword ptr [ebp-38], ecx         ;  H 10
  00401927  |> |8B55 D8       |/mov     edx, dword ptr [ebp-28]
  0040192A  |. |0FBE82 EC4040>||movsx   eax, byte ptr [edx+4040EC]     ;  假码
  00401931  |. |8B4D C8       ||mov     ecx, dword ptr [ebp-38]
  00401934  |. |0FBE540D DC   ||movsx   edx, byte ptr [ebp+ecx-24]     ;  参与上述比较的堆栈字符
  00401939  |. |8B4D C8       ||mov     ecx, dword ptr [ebp-38]
  0040193C  |. |83C1 01       ||add     ecx, 1
  0040193F  |. |894D C8       ||mov     dword ptr [ebp-38], ecx
  00401942  |. |3BC2          ||cmp     eax, edx
  00401944  |. |74 13         ||je      short 00401959
  00401946  |. |8B55 CC       ||mov     edx, dword ptr [ebp-34]
  00401949  |. |83C2 01       ||add     edx, 1
  0040194C  |. |8955 CC       ||mov     dword ptr [ebp-34], edx
  0040194F  |. |837D CC 04    ||cmp     dword ptr [ebp-34], 4
  00401953  |. |7E 02         ||jle     short 00401957
  00401955  |. |EB 02         ||jmp     short 00401959
  00401957  |>^|EB CE         |\jmp     short 00401927
  00401959  |> |837D CC 05    |cmp     dword ptr [ebp-34], 5
  0040195D  |. |75 3F         |jnz     short 0040199E
  0040195F  |. |C745 C4 78354>|mov     dword ptr [ebp-3C], 00403578    ;  abcdefghijklmn
  00401966  |. |C745 C0 68354>|mov     dword ptr [ebp-40], 00403568    ;  opqrstuvwxyz
  0040196D  |. |50            |push    eax
  0040196E  |. |8D85 C4FFFFFF |lea     eax, dword ptr [ebp-3C]
  00401974  |. |50            |push    eax
  00401975  |. |FF75 C0       |push    dword ptr [ebp-40]
  00401978  |. |58            |pop     eax
  00401979  |. |58            |pop     eax
  0040197A  |. |58            |pop     eax
  0040197B  |. |8945 CC       |mov     dword ptr [ebp-34], eax
  0040197E  |. |837D CC 00    |cmp     dword ptr [ebp-34], 0
  00401982  |. |7E 07         |jle     short 0040198B
  00401984  |. |E8 27FEFFFF   |call    004017B0                        ;  错误提示
  00401989  |. |EB 0E         |jmp     short 00401999
  0040198B  |> |50            |push    eax
  0040198C  |. |8D85 C4FFFFFF |lea     eax, dword ptr [ebp-3C]
  00401992  |. |50            |push    eax
  00401993  |. |FF75 C0       |push    dword ptr [ebp-40]
  00401996  |. |58            |pop     eax
  00401997  |. |58            |pop     eax
  00401998  |. |58            |pop     eax
  00401999  |> |E8 12FEFFFF   |call    004017B0                        ;  错误提示
  0040199E  |> |8B45 D8       |mov     eax, dword ptr [ebp-28]
  004019A1  |. |83C0 02       |add     eax, 2
  004019A4  |. |8945 D8       |mov     dword ptr [ebp-28], eax
  004019A7  |. |8B4D D0       |mov     ecx, dword ptr [ebp-30]
  004019AA  |. |83E9 01       |sub     ecx, 1
  004019AD  |. |894D D0       |mov     dword ptr [ebp-30], ecx
  004019B0  |. |EB 05         |jmp     short 004019B7
  004019B2  |. |F9            |stc
  004019B3  |. |73 01         |jnb     short 004019B6
  004019B5  |. |C3            |retn
  004019B6  |. |FFE8          |jmp     far eax                         ;  非法使用寄存器
  004019B8  |. |F6FF          |idiv    bh
  004019BA  |. |FFFF          |???                                     ;  未知命令
  004019BC  |. |837D D0 00    |cmp     dword ptr [ebp-30], 0
  004019C0  |. |75 07         |jnz     short 004019C9
  004019C2  |. |C745 D0 06000>|mov     dword ptr [ebp-30], 6
  004019C9  |> |C745 CC 00000>|mov     dword ptr [ebp-34], 0
  004019D0  |.^\E9 3BFFFFFF   \jmp     00401910
  004019D5  |>  E8 96FDFFFF   call    00401770                         ;  注册成功提示CALL
  
  
    按照作者的意思,注册机的制作应该是根据用户名来得出注册码,这就要完全弄懂、掌握这段
  算法的精髓。我觉得,根据堆栈里的结果反推用户名较容易实现,但那似乎不是作者的本意。Netwind是一个很注重实用性的作者。星期天尝试了一下,用用户名反推注册码的注册机是可行的。但算法很繁琐,自己不满意。有些地方还需要完善。希望向高手学习,看看他们简洁的注册机算法。
  
     第三部分的标题就叫:柳暗花明又一神。历经艰难,终成正果!心如枯木逢春、饮甘露,悠然神仙感。

     一个字:
  
     爽
  
     爽
  
     爽
  
     爽
  
     爽
  
     爽
  
   

     为了庆贺《加密和解密III》的正式发行,为了体现我等菜鸟同乐的心情,特写此文共同娱乐!!!也记录自己难得的熬夜。
  
附一组成功注册的:
用户名:ddlddp
注册码:IIIIQQIIIIUP

    在雅俗共赏里,我这篇应该算是俗的吧。和我一样的菜鸟应该受欢迎吧。期待高手的雅文。。。

看雪论坛读书月
六神合体难上难
山重水复疑无路
柳暗花明又一神

      神之所以称为神,是因为他做了常人做不到的事情。当你经历了五神的艰难考验,完成了看上去似乎以前不可能完成的破解任务,你也许就是作者心中的第六神。(自校验是第六神只是我猜测的另一种可能性)

     《加密和解密III》的正式出版和发行,会令你成为破解之神的概率更多一些,道路更为宽广一些。

--------------------------------------------------------------------------------
【经验总结】
    针对现在CRACK ME论坛上的CRACK ME创作标准问题,我简单谈了谈自己的判断标准:
  
    1.较有新意的加密思想。通常是创作的核心,同时也是破解的难点。
  
      可以是巧妙的算法构思,也可以是常规反破解手段的有机组合(如本例),
      也可以是隐性判断条件的隐蔽实现。也可以是资源的加密或防断(如小蜜蜂)。
      创作原则是有新意。
  
    2.可做性和娱乐性。增加破解者的成就感。尽可能做到雅俗共赏,不过不容易。
  
    3.注意编写的层次和难度搭配。本CRACK ME开始很简单,容易上手。中间部分
      难倒一片菜鸟。后面的部分是很好的点缀。作者的创作节奏把握很到位,
      极好地抓住了破解者的破解心理变化。
  
      其他的请高手指点一二!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年07月12日 下午 06:21:21


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (29)
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
2
由于本文主要是谈CRACK ME创作标准的理解。
故在CRACK ME 论坛发表,望坛主谅解!!!

标 题: 【原创】 一个利用SEH进行跳转的CrackME分析【原创】
作 者: petnt
时 间: 2008-01-04,20:43
链 接: http://bbs.pediy.com/showthread.php?t=57692
2008-7-13 20:49
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
晕,每次都看不完你打得字,我投降

我是这样的,当晚赶速度,见到第一段花后,NOP 掉 ,当我见到第二段后 IDA 写个脚本 (练习)

#include <idc.idc>

static main()
{
   auto i,j,code,size;
   code=0x401000; //起始地址
   size=0x2000;//扫描数据块大小

   for ( i=0; i < size;i++ )
   {

      if ((Byte(code)==0xEB)&&(Byte(code+1)==0x5)&&(Byte(code+4)==0x1))
     {
          for(j=0;j<12;j++)
          {
               PatchByte(code,0x90);
              code++;
            }
            continue;
       }
         code++;
    }

}

然后在 IDA 里一搜,所有位置出来了 (当时我就所看雪放水,故意给我们一点甜头的)

,然后我立刻把 +0X1B 的位置下面的 CALL nop 掉

(这样的理由是可以乱输入不会退出,不同于爆破,直接到达最后一段判断代码 ,看到了 -0x55

知道了最后一个用户名可以固定了,然后下推到最后一段,那段是属于半明码比较(再次防水)

一看你就知道如何组合出来了 ,当晚破解出来后,见到已经有人往上贴出成功对话框了 (打击啊 )

所以没贴出我的 , 还需要努力,但我想 下一题 我都不知道搞不搞得定呢
2008-7-13 21:03
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
不错,学习。。。
2008-7-13 21:23
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
btw:关税加八卦一下。
猜测6神为6个字符的用户名。
2008-7-13 21:38
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
6
好文章,加精。。
2008-7-14 00:08
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
LZ有写小说的潜质

精力不减啊
2008-7-14 11:06
0
雪    币: 212
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
LZ的写作能力深受我等的佩服,简直就是文武双全!
2008-7-14 11:41
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
nba2005文采很好,置顶鼓励
2008-7-15 10:22
0
雪    币: 716
活跃值: (162)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
文武双全,学习。
2008-7-15 10:38
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
11
我不看我不看
我一定要靠自己的努力.
2008-7-15 11:49
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
12
sessiondiy出手必杀
2008-7-15 12:46
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
Support.
2008-7-15 20:21
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好文章  好文采  
  很好
2008-7-19 06:00
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
15
楼主文笔不错啊,赞一个
2008-7-21 11:40
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习个,楼主很强……
2008-7-21 16:32
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
不错文才飞扬!  顶啊!  
2008-7-22 22:55
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
发重了!请管理删掉吧!
2008-7-22 22:56
0
雪    币: 656
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
恩那 赞一个
2008-8-1 06:43
0
雪    币: 433
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
深受鼓舞,努力学习!
2008-8-4 09:48
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
文笔不错,引人入胜……
仿佛回到了猫扑……呵呵
2008-8-4 14:21
0
雪    币: 194
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
为什么我查看String Reference 什么也没有啊
2008-8-16 17:43
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
23
不是OD自带的查找-->字符串查找。

而是字符串插件。右键菜单下列的Ultra string reference选项FIND ASCII 和FIND UNICODE。
2008-8-18 11:58
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
文采很好 就是贴的代码段 太长 。。
2008-8-21 14:04
0
雪    币: 194
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
ok 找是找到了 就是搞不定啊 好难啊 我是菜鸟
2008-8-24 19:43
0
游客
登录 | 注册 方可回帖
返回
//