吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8969|回复: 20
收起左侧

[原创] CrackMe分析一例【深度解析爆破+注册机】

[复制链接]
ps520 发表于 2009-7-26 14:25
【文章标题】: Tale的一个CrackMe分析
【文章作者】: Luck
【作者邮箱】: 466748210@qq.com
【作者主页】: blog.sooluck.cn
【作者QQ号】: 466748210
【软件名称】: Tale's CrackME
【软件大小】: 48.0 KB (49,152 字节)
【下载地址】: http://www.52pojie.cn/thread-18098-1-1.html
【加壳方式】: 无壳
【保护方式】: 阴暗的驱动保护
【编写语言】: 易语言
【使用工具】: 0llyDbg
【操作平台】: WinXp Sp3
【软件介绍】: Tale的一个驱动保护CM、类似QT的内存清零
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  许多年前的帖子了、当时我还是菜鸟。不懂分析,只会查字符。- -。现在比以前好多了
  这篇文章对大家学习可能有点帮助,于是写出来给大家玩。第一次发这种稍微带点含金量的帖子,不足之处请海量。
  ------------------------------------------
  应该说这个CrackMe能够被调试得益于我的Nod32杀了驱动,哈哈~
  于是得以能够分析这个CrackMe并且能够搞点名堂,正如TALE本人所说,十分简单。
  好,话不多说,直接上OD。
  F9跑起,成功了么?好。用户名输入Luck,Key输入5201314
  嘿嘿~Ctrl+B输入FF 55 FC。停在
  10029AFC    FF55 FC         call    dword ptr [ebp-4]
  F2下断。切回主程序,点注册
  调试器成功断下。取消断点,F7进入
  之前我有考虑过下Bp MessageBoxA,可是调试到后来发现有点麻烦了,于是直接查按钮事件,比较快。
  F8单步走吧~
  单步时用不着修复一些跳转,直接走就是了。因为我们先收集些数据。
  调试过程中会发现出现了
  Luck
  5201314
  当然我觉得这个没什么的。然后
  00406E96    DB45 F8         fild    dword ptr [ebp-8]
  00406E99    DD5D EC         fstp    qword ptr [ebp-14]
  00406E9C    DD45 EC         fld     qword ptr [ebp-14]
  00406E9F    DB45 F4         fild    dword ptr [ebp-C]
  00406EA2    DD5D E4         fstp    qword ptr [ebp-1C]
  00406EA5    DC45 E4         fadd    qword ptr [ebp-1C]
  00406EA8    DD5D DC         fstp    qword ptr [ebp-24]
  
  应该是啥东东,提取啥的?
  当执行到
  00406EC8    8945 D8         mov     dword ptr [ebp-28], eax
  堆栈显示:
  eax=00160BC0, (ASCII "1347720329")
  堆栈 ss:[0012F64C]=1005F35C (krnln.1005F35C)
  这里应该是提取了硬盘特征字。
  00406ED9    E8 50010000     call    0040702E
  00406EDE    83C4 10         add     esp, 10
  00406EE1    8945 D4         mov     dword ptr [ebp-2C], eax
  提取我们的注册信息了
  继续单步、
  00406EE1    8945 D4         mov     dword ptr [ebp-2C], eax
  00406EE4    8B45 D8         mov     eax, dword ptr [ebp-28]
  
  跟踪到这里发现
  堆栈 ss:[0012F64C]=00160AF0, (ASCII "1347720329")
  eax=00164758, (ASCII "5201314")
  于是知道,这里应该是什么小九九吧。看样子这里应该是准备比较了?因为把注册信息都弄出来了
  我尝试改了一下:
  00406EE4    8945 D4         mov     dword ptr [ebp-2C], eax
  看出来了么、我把第2句改成和第一句的一样,这样使2个值相符。
  eax=00164758, (ASCII "5201314")
  堆栈 ss:[0012F648]=00164758, (ASCII "5201314")
  呵呵,比较去吧?
  00406EFB    0F94C0          sete    al
  条件为真 TRUE
  al=00
  这句很重要,上面如果不改的话到这里的时候条件是为假的
  继续单步:
  00406F06   /74 09           je      short 00406F11
  00406F08   |53              push    ebx
  00406F09   |E8 14010000     call    00407022
  00406F0E   |83C4 04         add     esp, 4
  00406F11   \8B5D D8         mov     ebx, dword ptr [ebp-28]
  00406F14    85DB            test    ebx, ebx
  00406F16    74 09           je      short 00406F21
  00406F18    53              push    ebx
  00406F19    E8 04010000     call    00407022
  00406F1E    83C4 04         add     esp, 4
  00406F21    837D D0 00      cmp     dword ptr [ebp-30], 0
  00406F25    68 CC83E694     push    94E683CC
  00406F2A    E8 F4670000     call    0040D723
  00406F2F    6A 00           push    0
  00406F31    68 01030080     push    80000301
  00406F36    6A 00           push    0
  00406F38    68 00000000     push    0
  00406F3D    68 04000080     push    80000004
  00406F42    6A 00           push    0
  00406F44    68 E0434000     push    004043E0
  00406F49    68 03000000     push    3
  00406F4E    BB 00030000     mov     ebx, 300
  00406F53    E8 D0000000     call    00407028
  00406F58    83C4 28         add     esp, 28
  00406F5B    E9 30000000     jmp     00406F90
  
  发现直接提示注册成功了!
  哈哈,原来我们已经成功爆破了。
  于是我们学到了:
  传送指令MOV(Move)把一个字节、字或双字的操作数从源位置传送到目的位置,源操作数的内容不变。可以实现立即数到通用寄存器或主存的传送,通用寄存器与通用寄存器、主存或段寄存器之间的传送,主存与段寄存器之间的传送。该操作属于复制性质,不属于搬家性质。
    例如:
    MOV EAX,050ah ;将十六进制数050a 传送到通用寄存器eax中
    应该注意的是:
    1.目的操作数要与源操作数类型要一致
    2.目的操作数要和源操作数类型之一必须要有明确的类型
    汇编还提供许多mov变体,如movzx, movsx等等
  这里就是将2个值移动到一起用于比较,cmp就是比较。
  那么比较在哪儿呢?
  00406EEB    E8 56E0FFFF     call    00404F46
  00406EF0    83C4 08         add     esp, 8
  00406EF3    83F8 00         cmp     eax, 0   ‘比较
  00406EF6    B8 00000000     mov     eax, 0
  
  这里,这里就是比较。
  那么返回值呢?
  00406EFB    0F94C0          sete    al这里返回的就是注册是否成功。真为成功。
  好,我们就完成了这个CrackMe的爆破工作
  然而注册机呢?
  好,下面我们来制作注册机
  因为我们的注册名是Luck。4位数。我开始就猜想是不是注册码就是1347720329。于是我关闭调试器
  用户名和注册码均为1347720329,注册成功
  但当注册名小于4位数注册却失败了。
  这是为什么呢?
  我接着令用户名为空,注册码1347720329。结果成功了!
  这说明我们需要的算法很简单,但必须分2步。
  第一步:
  判断注册名是否为空。如果为空直接显示易语言调用取硬盘特征字()输出注册码
  第二步:
  如果不为空,判断长度是否小于4.如果大于等于4,也是直接显示易语言调用取硬盘特征字()输出注册码。
  那么如果小于4呢?
  下面,我们接着调试撒~
  我们令用户名为123,注册码仍为5201314
  采用刚才的办法,直接来到按钮事件入口。F8单步。
  调试发现,当用户名小于4时
  00406E54   /75 05           jnz     short 00406E5B已实现。
  注册码出来了:
  eax=00160AF0, (ASCII "1347720452")
  堆栈 ss:[0012F64C]=1005F35C (krnln.1005F35C)
  这样我们发现,与机器码很接近,那么接近在哪儿呢?
  打开易语言,输入这么一段代码:
  输出调试文本 (1347720452 - 取硬盘特征字 ())
  开始运行被调试程序
  * 123
  被调试易程序运行完毕
  居然是123!!!
  我们这时便相信,原来是这样。
  呵呵,现在我们基本可以推测算法了。
  首先,用户名到数值,然后注册码为机器码+用户名
  解释一下我们开始的错误:
  其实没有判断用户名长度。这里所实现的判断应该是一种巧合吧。
  那么注册机要怎么写呢?
  打开易语言:
  画1个编辑框,再画1个按钮。按钮事件里这么写
  信息框 (“您的注册码是:” + 到文本 (取硬盘特征字 () + 到数值 (编辑框1.内容)), #信息图标, “已生成:”)
  这样就可以实现自动化注册了~~~
  呵呵,走到这里我们已经实现了这个CrackMe的完全分析。
  
--------------------------------------------------------------------------------
【经验总结】
  总结全文,我们发现:
  第一遍最好可以F8单步过一遍,初步了解流程。
  第二遍输入假信息,并注意堆栈的显示。在关键处可以采用标识
  第三遍针对需要的方式进行分析代码。
  对应我们这个CrackMe就是:
  第一步,F9运行CM,并且走到按钮事件入口。
  第二步,F8单步了解流程。
  第三步,对于某些地址进行修改。
  第四步,实现注册机制。
  这里我们需要掌握的知识点:
  1.易语言的按钮事件查找方法:
  F9运行程序,然后进入调用模块列表,选择核心库,回车。Ctrl+B输入FF 55 FC,回车。来到Call。下断。
  返回程序按下按钮,如果调试器断下。取消断点,F7进入。如果没断下Ctrl+B查找下一个Call。
  2.基本的一些编程知识。
  就这么多啦!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Luck, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年07月26日 14:24:00

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ps520 发表于 2009-7-26 14:26
准确来说应该感谢下Nod32 的大力支持

因为Nod32帮我去掉了可恶的驱动保护哈哈!

顺手可以调试了


是否QQ堂也能这么去掉呢。未知数
Hmily 发表于 2009-7-26 14:46
 楼主| ps520 发表于 2009-7-26 15:04
感觉很乱....加精鼓励,期待更多佳作~
Hmily 发表于 2009-7-26 14:46



- -.不好意思献丑啦。

我是边分析、边写。可能跨度用语很不规范

第一次肯静下心来分析分析代码,以前只会爆破字符串~


我会继续努力地~


我的目标


杀入LCG~~~~~
什么也不是 发表于 2009-7-26 15:09
本帖最后由 什么也不是 于 2009-7-26 15:35 编辑


    恭喜恭喜
不过好像硬盘特征不是那样的

00404FA7    D1E0            shl     eax, 1

   貌似这句就是关键句
 楼主| ps520 发表于 2009-7-26 15:20
硬盘特征字

是易语言的核心支持库命令提取的硬盘特征信息

一般不会重复

除非提取失败就为0饿了
小鸡拜拜 发表于 2009-7-26 15:24
实在没看懂。 直接关键跳就好了。 哪那么麻烦 还标志位。。 我汗
什么也不是 发表于 2009-7-26 15:39

   要爆破的话还是最小的修改程序 貌似稳定些  
overlords 发表于 2009-7-26 16:04
恩.. 爆破还是比较好的啊..
 楼主| ps520 发表于 2009-7-26 20:29
有些爆破容易出问题、比如信息加密等。追码不一定要搞到算法、得到当前机器用户名的能使用的KEY已经不错了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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