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

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

    本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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-142827

     

    2、程序分析:

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

    和上一节一样,打开CHM,选择第18个Brad Soblesky.1.exe,保存下来。运行程序,程序界面如下:

    4

    3、思路分析和破解流程

    又见信息框,哈哈哈!

    PEID查看: Microsoft Visual C++ 6.0

    和以前的一样,直接上步骤:

    1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

    2、在exe中输入伪码:123123。点击OK按钮,弹出错误信息框,不要关闭。

    3、在OD中点击暂停按钮(Ctrl+F12),再点击堆栈K按钮(Ctrl+K),可以看到当前堆栈情况。堆栈区很长,我们从底部开始看:

    2

    由于大量地使用了mfc42模块,基本100%可断定使用的是C++的MFC框架写的。下面的那部分属于消息派遣,在最后的一个调用的地方,我们右键跟进去看看:

    00401C73  |.  50            push eax                                 ; /pStartupinfo
    00401C74  |.  FF15 0C204000 call dword ptr ds:[<&KERNEL32.GetStartup>; GetStartupInfoA
    00401C7A  |.  F645 D0 01    test byte ptr ss:[ebp-0x30],0x1
    00401C7E  |.  74 11         je short 00401C91
    00401C80  |.  0FB745 D4     movzx eax,word ptr ss:[ebp-0x2C]
    00401C84  |.  EB 0E         jmp short 00401C94
    00401C86  |>  803E 20       /cmp byte ptr ds:[esi],0x20
    00401C89  |.^ 76 D8         |jbe short 00401C63
    00401C8B  |.  46            |inc esi
    00401C8C  |.  8975 8C       |mov [local.29],esi
    00401C8F  |.^ EB F5         jmp short 00401C86
    00401C91  |>  6A 0A         push 0xA
    00401C93  |.  58            pop eax
    00401C94  |>  50            push eax
    00401C95  |.  56            push esi
    00401C96  |.  53            push ebx
    00401C97  |.  53            push ebx                                 ; /pModule
    00401C98  |.  FF15 08204000 call dword ptr ds:[<&KERNEL32.GetModuleH>; GetModuleHandleA
    00401C9E  |.  50            push eax
    00401C9F  |.  E8 5E000000   call 00401D02
    00401CA4  |.  8945 98       mov [local.26],eax
    00401CA7  |.  50            push eax                                 ; /status
    00401CA8  |.  FF15 AC214000 call dword ptr ds:[<&MSVCRT.exit>]       ; exit
    00401CAE  |.  8B45 EC       mov eax,[local.5]
    00401CB1  |.  8B08          mov ecx,dword ptr ds:[eax]
    00401CB3  |.  8B09          mov ecx,dword ptr ds:[ecx]
    00401CB5  |.  894D 88       mov [local.30],ecx
    00401CB8  |.  50            push eax
    00401CB9  |.  51            push ecx
    00401CBA  |.  E8 15000000   call <jmp.&MSVCRT._XcptFilter>
    00401CBF  |.  59            pop ecx
    00401CC0  |.  59            pop ecx
    00401CC1  .  C3            retn

    根据GetStartUp,GetModuleHandleA很容易判断出不是进行注册码处理的,所以,我们还要继续向上看信息框部分:

    1

    这里就很容易地发现了信息框部分!并且注意到在信息框被调用之前有一个exe模块调用的函数,<jmp.&MFC42.#4224>被调用的函数为Brad_sob.004015BC,我们选中这一句,右键->Show call。

    4、在反汇编窗口向上浏览相关代码,发现两处很明显的提示内容:

    0040155F  |.  50            push eax                                 ; /String
    00401560  |.  FF15 04204000 call dword ptr ds:[<&KERNEL32.lstrlenA>] ; lstrlenA
    00401566  |.  8945 F0       mov [local.4],eax
    00401569  |.  837D F0 01    cmp [local.4],0x1
    0040156D  |.  73 16         jnb short 00401585
    0040156F  |.  6A 40         push 0x40
    00401571  |.  68 2C304000   push 0040302C                            ;  ASCII "CrackMe"
    00401576  |.  68 34304000   push 00403034                            ;  ASCII "Enter Registration Number"
    0040157B  |.  8B4D E0       mov ecx,[local.8]
    0040157E  |.  E8 7B050000   call <jmp.&MFC42.#4224>
    00401583  |.  EB 3C         jmp short 004015C1
    00401585  |>  8D4D E4       lea ecx,[local.7]
    00401588  |.  51            push ecx                                 ; /String2 = "<BrD-SoB>"
    00401589  |.  8D55 F4       lea edx,[local.3]                        ; |
    0040158C  |.  52            push edx                                 ; |String1 = "123123"
    0040158D  |.  FF15 00204000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; lstrcmpA
    00401593  |.  85C0          test eax,eax
    00401595  |.  75 16         jnz short 004015AD
    00401597  |.  6A 40         push 0x40
    00401599  |.  68 50304000   push 00403050                            ;  ASCII "CrackMe"
    0040159E  |.  68 58304000   push 00403058                            ;  ASCII "Correct way to go!!"
    004015A3  |.  8B4D E0       mov ecx,[local.8]
    004015A6  |.  E8 53050000   call <jmp.&MFC42.#4224>
    004015AB  |.  EB 14         jmp short 004015C1
    004015AD  |>  6A 40         push 0x40
    004015AF  |.  68 6C304000   push 0040306C                            ;  ASCII "CrackMe"
    004015B4  |.  68 74304000   push 00403074                            ;  ASCII "Incorrect try again!!"
    004015B9  |.  8B4D E0       mov ecx,[local.8]
    004015BC  |.  E8 3D050000   call <jmp.&MFC42.#4224>

    C++代码就是好啊,汇编代码及其干净!lstrcmp这个函数进行了文本比较,然后就根据比较结果判断成功还是失败!jnz 004015AD就是关键跳转啦!我们选中这一行,右键->Binary->Fill with NOPs。试试看,哈哈,是不是成功啦!

    4、注册机的探索

    我们已经知道了注册码比较的位置,先直接看看注册码是什么样的?在 lstrcmp 这个函数上下断F2,然后就如同上面那个汇编注释的内容一样,他竟然是固定的!!

    <BrD-SoB>

    或许我们猜错了,试一试,OK!确实是固定的!

    image

    BY  笨笨D幸福

  • 相关阅读:
    python list介绍
    python unittest模块
    python 贪婪算法
    python 动态规划:背包问题
    汇编语言 基础知识(王爽)
    python 迪克斯特拉(Dijkstra)
    python 广度优先查找 (最短路径)
    Python 快速排序
    python 分而治之 找零数量 最小组合
    移动端的头部标签和 meta
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3809019.html
Copyright © 2011-2022 走看看