好友
阅读权限40
听众
最后登录1970-1-1
|
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 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|