zoukankan      html  css  js  c++  java
  • [反汇编练习] 160个CrackMe之005

    [反汇编练习] 160个CrackMe之005.

    本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

    其中,文章中按照如下逻辑编排(解决如下问题):

    1、使用什么环境和工具

    2、程序分析

    3、思路分析和破解流程

    4、注册机的探索

    ----------------------------------

    提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

    ----------------------------------

    1、工具和环境:

    WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

    160个CrackMe的打包文件。

    下载地址: http://pan.baidu.com/s/1xUWOY  密码: jbnq

    注:

    1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

    2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

    wps_clip_image-14282

    2、程序分析:

    想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

    和上一节一样,打开CHM,选择第5个ajj,保存下来。运行程序,程序界面如下:

    wps_clip_image-9527

    这个程序和上一个类似,但是只有一个输入框,下面的“注册按钮”其实就是个摆设,没有什么效果。不管了,先扔进OD探探路。

    3、思路分析和破解流程:

    既然之前的也是Delphi,我们就不用再做无谓的尝试了,直接Ctrl+E(E图标),选中CKme002.exe模块右键->Follow entry,这样我们就在主程序模块,然后右键->中文搜索引擎->智能搜索,拉到最后发现有一个很明显的中文字符串【恭喜恭喜!注册成功】,二话不说,跟进去。

    00447465    BA 8C744400     mov edx,0044748C                         ; 厉害厉害真厉害!佩服佩服真佩服!!
    0044746A    E8 EDC4FBFF     call 0040395C
    0044746F    BA B8744400     mov edx,004474B8                         ; 注册了
    00447474    8B83 EC020000   mov eax,dword ptr ds:[ebx+0x2EC]
    0044747A    E8 3DCCFDFF     call 004240BC
    0044747F    5B              pop ebx
    00447480    C3              retn
    00447481    0000            add byte ptr ds:[eax],al
    00447483    00FF            add bh,bh
    00447485    FFFF            ???                                      ; Unknown command
    00447487    FF22            jmp dword ptr ds:[edx]
    00447489    0000            add byte ptr ds:[eax],al
    0044748B    00C0            add al,al
    0044748D    F7BA A6C0F7BA   idiv dword ptr ds:[edx+0xBAF7C0A6]
    00447493    A6              cmps byte ptr ds:[esi],byte ptr es:[edi]
    00447494    D5 E6           aad 0xE6
    00447496    C0F7 BA         sal bh,0xBA
    00447499    A6              cmps byte ptr ds:[esi],byte ptr es:[edi]
    0044749A    A3 A1C5E5B7     mov dword ptr ds:[0xB7E5C5A1],eax
    0044749F    FEC5            inc ch
    004474A1    E5 B7           in eax,0xB7
    004474A3    FE              ???                                      ; Unknown command
    004474A4    D5 E6           aad 0xE6
    004474A6    C5E5            lds esp,ebp                              ; Illegal use of register
    004474A8    B7 FE           mov bh,0xFE
    004474AA    A3 A1A3A100     mov dword ptr ds:[0xA1A3A1],eax

    纳尼,竟然有各种无法识别的命令,没办法,先用PEID查查壳吧。

    wps_clip_image-9183

    TNND,竟然UPX加壳了,幸好是UPX,找个专门的工具就能搞定。我使用的是论坛里找的UPX GUI工具,脱掉后,继续查看:和上次一样,Deiphi的。

    继续Ctrl+E,选中模块进去,右键,查找中文,智能搜索,拉到最后,双击进去,哦这个世界终于清静了!稍微手工分析下代码:

    004473E4   .  53            push ebx
    004473E5   .  8BD8          mov ebx,eax
    004473E7   .  81BB 04030000>cmp dword ptr ds:[ebx+0x304],0xC34
    004473F1   .  0F84 88000000 je 0044747F                              ;  // 一直在这里主动断下,应该有周期性调用的函数
    004473F7   .  81BB 08030000>cmp dword ptr ds:[ebx+0x308],0x230D
    00447401   .  74 7C         je short 0044747F                        ;  // 判断2
    00447403   .  81BB 10030000>cmp dword ptr ds:[ebx+0x310],0xF94
    0044740D   .  75 70         jnz short 0044747F                       ;  // 判断3
    0044740F   .  8B83 18030000 mov eax,dword ptr ds:[ebx+0x318]
    00447415   .  3B83 14030000 cmp eax,dword ptr ds:[ebx+0x314]
    0044741B   .  75 62         jnz short 0044747F                       ;  // 判断4
    0044741D   .  81BB 1C030000>cmp dword ptr ds:[ebx+0x31C],0x3E7
    00447427   .  74 56         je short 0044747F                        ;  // 判断5
    00447429   .  33D2          xor edx,edx                              ;  // 以下不知道干什么用的,不管它
    0044742B   .  8B83 D8020000 mov eax,dword ptr ds:[ebx+0x2D8]
    00447431   .  8B08          mov ecx,dword ptr ds:[eax]
    00447433   .  FF51 5C       call dword ptr ds:[ecx+0x5C]
    00447436   .  33D2          xor edx,edx
    00447438   .  8B83 DC020000 mov eax,dword ptr ds:[ebx+0x2DC]
    0044743E   .  8B08          mov ecx,dword ptr ds:[eax]
    00447440   .  FF51 5C       call dword ptr ds:[ecx+0x5C]
    00447443   .  33D2          xor edx,edx
    00447445   .  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
    0044744B   .  8B08          mov ecx,dword ptr ds:[eax]
    0044744D   .  FF51 5C       call dword ptr ds:[ecx+0x5C]
    00447450   .  33D2          xor edx,edx
    00447452   .  8B83 E4020000 mov eax,dword ptr ds:[ebx+0x2E4]
    00447458   .  8B08          mov ecx,dword ptr ds:[eax]
    0044745A   .  FF51 5C       call dword ptr ds:[ecx+0x5C]
    0044745D   .  A1 A8984400   mov eax,dword ptr ds:[0x4498A8]
    00447462   .  83C0 70       add eax,0x70
    00447465   .  BA 8C744400   mov edx,0044748C                         ;  厉害厉害真厉害!佩服佩服真佩服!!
    0044746A   .  E8 EDC4FBFF   call 0040395C
    0044746F   .  BA B8744400   mov edx,004474B8                         ;  注册了
    00447474   .  8B83 EC020000 mov eax,dword ptr ds:[ebx+0x2EC]
    0044747A   .  E8 3DCCFDFF   call 004240BC
    0044747F   >  5B            pop ebx                                  ;  // 上面的所有跳转都跳到这里
    00447480   .  C3            retn

    找到代码头,下断!??怎么就段下了???我什么也没点击啊!!可恶的地球人!

    观察下断下的位置,是第一个JE跳转,然后依次将所有的JE和JMP都下断,发现仍然是在第一个JE断下,冥冥之中我想到了最开始的鼠标提示:如果你能不用暴力注册成功,你就知道“层层设防”的意思了!坑啊,大坑!难道就是这几个CMP和JE判断吗??!!

    没办法,观察下CMP的参数,都是[ebx+0x3xx],但是我们无法找到给ebx和ebx+0x3xx赋值的地方!太坑了!

    冷静!我们的初衷是破解它,提示成功的代码就在这几个跳转判断的下面,虽然我们无法知道这些判断的条件能在哪里修改,但是只要我们能让判断的流程走向成功注册就可以了。所以,我想到了JMP,简单,粗暴,但是很有效。既然每次都在第一个JE处断下,我们就可以将第一个JE改为JMP,JMP的目的地肯定是成功注册的位置,看看代码,在“注册了”提示的上面有很多CALL,但是不知道是干什么的,一直到xor edx,edx地方都是不知道干什么的代码,我们先尝试一下,选中je 0044747F,按下空格键,内容改为JMP 00447443,选中左下角的使用nop填充选项,assemble。OD自动将jmp语句修改为jmp short 00447443,不用管他。我们为什么要jmp到00447443,而不是其他地方呢?因为xor edx,edx的地址就是00447443啊!

    好了,现在再试试程序.....什么!程序已经自动变成了“注册了”!!

    wps_clip_image-21580

    4、注册机探索:

    我只想说,上神器吧!我也没办法!

    Dede分析一下:

    wps_clip_image-31303

    wps_clip_image-27965

    看到这里,不知你有什么感想!Timer1Timer:interval=200,Timer2Timer:interval=8000。。。我敢说这完全是在使用时钟定时判断注册码啊!

    赶快将timer事件的RVA记下来,OD跟踪......

    事实证明我错了!继续跟踪其他事件....

    好吧,我承认,我放弃了,请原谅我放荡不羁的爱情!!!这位大爷太难伺候了。以后有好方法了再说吧!

    后记:我是真的被这位兄台的CrackMe整疯了,还是连续俩个的。太捉弄人了,鸡肋啊!

    BY  笨笨D幸福

  • 相关阅读:
    项目中遇到的问题:前台 disabled 与 后台disabled
    差距
    那些零碎的感悟,那些成长的事【壹】
    假期数据结构学习总结
    烟大 2242: 回文(栈和队列)
    烟大 2241: 相同序列(栈和队列)
    烟大 2239: 十进制与八进制的转换(栈和队列)
    烟大 2238: 括号匹配(栈和队列)
    hdu 1018:Big Number(水题)
    hdu 2050:折线分割平面(水题,递归)
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3785146.html
Copyright © 2011-2022 走看看