CrackMe分析一例【深度解析爆破+注册机】
【文章标题】: 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
F2下断。切回主程序,点注册
调试器成功断下。取消断点,F7进入
之前我有考虑过下Bp MessageBoxA,可是调试到后来发现有点麻烦了,于是直接查按钮事件,比较快。
F8单步走吧~
单步时用不着修复一些跳转,直接走就是了。因为我们先收集些数据。
调试过程中会发现出现了
Luck
5201314
当然我觉得这个没什么的。然后
00406E96 DB45 F8 fild dword ptr
00406E99 DD5D EC fstp qword ptr
00406E9C DD45 EC fld qword ptr
00406E9F DB45 F4 fild dword ptr
00406EA2 DD5D E4 fstp qword ptr
00406EA5 DC45 E4 fadd qword ptr
00406EA8 DD5D DC fstp qword ptr
应该是啥东东,提取啥的?
当执行到
00406EC8 8945 D8 mov dword ptr , eax
堆栈显示:
eax=00160BC0, (ASCII "1347720329")
堆栈 ss:=1005F35C (krnln.1005F35C)
这里应该是提取了硬盘特征字。
00406ED9 E8 50010000 call 0040702E
00406EDE 83C4 10 add esp, 10
00406EE1 8945 D4 mov dword ptr , eax
提取我们的注册信息了
继续单步、
00406EE1 8945 D4 mov dword ptr , eax
00406EE4 8B45 D8 mov eax, dword ptr
跟踪到这里发现
堆栈 ss:=00160AF0, (ASCII "1347720329")
eax=00164758, (ASCII "5201314")
于是知道,这里应该是什么小九九吧。看样子这里应该是准备比较了?因为把注册信息都弄出来了
我尝试改了一下:
00406EE4 8945 D4 mov dword ptr , eax
看出来了么、我把第2句改成和第一句的一样,这样使2个值相符。
eax=00164758, (ASCII "5201314")
堆栈 ss:=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
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 , 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:=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 准确来说应该感谢下Nod32 的大力支持
:lol因为Nod32帮我去掉了可恶的驱动保护哈哈!
顺手可以调试了
是否QQ堂也能这么去掉呢。未知数 感觉很乱....加精鼓励,期待更多佳作~ 感觉很乱....加精鼓励,期待更多佳作~
Hmily 发表于 2009-7-26 14:46 http://www.52pojie.cn/images/common/back.gif
- -.不好意思献丑啦。
我是边分析、边写。可能跨度用语很不规范
第一次肯静下心来分析分析代码,以前只会爆破字符串~
我会继续努力地~
我的目标
杀入LCG~~~~~ 本帖最后由 什么也不是 于 2009-7-26 15:35 编辑
:lol
恭喜恭喜
不过好像硬盘特征不是那样的
00404FA7 D1E0 shl eax, 1
貌似这句就是关键句 :lol硬盘特征字
是易语言的核心支持库命令提取的硬盘特征信息
一般不会重复
除非提取失败就为0饿了 实在没看懂。 直接关键跳就好了。 哪那么麻烦 还标志位。。 我汗 :lol
要爆破的话还是最小的修改程序 貌似稳定些:lol 恩.. 爆破还是比较好的啊.. :lol有些爆破容易出问题、比如信息加密等。追码不一定要搞到算法、得到当前机器用户名的能使用的KEY已经不错了