【文章标题】: 【原创】【看雪读书月】《2008看雪论坛读书月第一题crackMe01》破解随笔
【文章作者】: NBA2005
【作者QQ号】: 382309369
【软件名称】: 2008看雪论坛读书月第一题crackMe01
【软件大小】: 24KB
【下载地址】: http://bbs.pediy.com/showthread.php?t=68174
【加壳方式】: 无
【保护方式】: 六神合体
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OD
【操作平台】: WIN XP
【软件介绍】: 2008看雪论坛读书月第一题
【作者声明】: 为了庆贺《加密和解密III》的正式发行,为了体现我等菜鸟同乐的心情,特写此文共同娱乐!!!
--------------------------------------------------------------------------------
看雪论坛读书月
六神合体难上难
山重水复疑无路
柳暗花明又一神
【详细过程】
第一部分 明明白白我的心。
2008年7月11日上午八时,朋友QQ就问候:2008看雪论坛读书月第一题crackMe01你做了吗?挺有意思的。上网一看,果然有。这看雪老大也是的,干吗不在周末发布呢?再一想,周末未必就有充足的时间。中午看看吧,第一题不会太难吧。
焚香,下载,试运行。中午吃过饭,立刻OD动态调试,开始一探究竟:
1.用户名什么都不输入,提示"请输入用户名"。随便输入用户名,提示非法用户。看来用户名有限制条件。
大写、小写和数字,发现要小写。
2.注册码什么都不输入,提示"请输入注册码"。随便输入注册码,出现错误提示。
为什么叫六神合体呢?我看到CRACK ME的标题,觉得奇怪。
先用我的常用断点系统第一招:字符串查找。
Ultra String Reference
Address Disassembly Text String
00401059 mov dword ptr [eax], 00403260 h"@
00401155 push 00402629 葛5@
004012AB mov dword ptr [eax], 00403390 r#@
004013C7 mov dword ptr [ecx], 0040346C r#@
004015D5 push 004026B9 辅6@
00401655 push 004026D9 感6@
0040177B push 0040354C 恭喜!
00401780 push 00403544 过关!
004017BB push 00403560 错了!
004017C0 push 00403554 继续努力!
004017FC mov dword ptr [ebp-4], 00403588 abcdefghijklmnopqrstuvwxy
004018BD push 00403560 错了!
004018C2 push 00403554 继续努力!
0040195F mov dword ptr [ebp-3C], 00403578 abcdefghijklmn
00401966 mov dword ptr [ebp-40], 00403568 opqrstuvwxyz
00401AF9 push 004035A4 explorer.exe
00401BB5 push 004026F0 给6@
00401D4A push 004035D0 请输入用户名!
00401D70 push 004035C0 请输入注册码!
00401DC7 push 004035B4 非法用户!
00402418 push ebp (initial cpu selection)
首先我看到了:
00401BB5 push 004026F0 给6@
00401D4A push 004035D0 请输入用户名!
00401D70 push 004035C0 请输入注册码!
00401DC7 push 004035B4 非法用户!
哈哈,这么快就确定了注册判断的地方。
双击之,来到:
00401D39 |. 52 push edx ; /s
00401D3A |. E8 C1060000 call <jmp.&MSVCRT.strlen> ; \strlen
00401D3F |. 83C4 04 add esp, 4
00401D42 |. 85C0 test eax, eax
00401D44 |. 75 16 jnz short 00401D5C
00401D46 |. 6A 00 push 0
00401D48 |. 6A 00 push 0
00401D4A |. 68 D0354000 push 004035D0 ; 请输入用户名!
00401D4F |. 8B4D FC mov ecx, [local.1]
00401D52 |. E8 2B060000 call <jmp.&MFC42.#4224>
00401D57 |. E9 B3000000 jmp 00401E0F
00401D5C |> 8B45 F8 mov eax, [local.2]
00401D5F |. 50 push eax ; /s
00401D60 |. E8 9B060000 call <jmp.&MSVCRT.strlen> ; \strlen
00401D65 |. 83C4 04 add esp, 4
00401D68 |. 85C0 test eax, eax
00401D6A |. 75 16 jnz short 00401D82
00401D6C |. 6A 00 push 0
00401D6E |. 6A 00 push 0
00401D70 |. 68 C0354000 push 004035C0 ; 请输入注册码!
00401D75 |. 8B4D FC mov ecx, [local.1]
这段肯定是对用户名和注册码的限制条件的验证。
往下看:
00401D89 |> /8B4D F4 /mov ecx, [local.3]
00401D8C |. |034D F0 |add ecx, [local.4]
00401D8F |. |0FBE11 |movsx edx, byte ptr [ecx]
00401D92 |. |85D2 |test edx, edx
00401D94 |. |74 27 |je short 00401DBD
00401D96 |. |8B45 F4 |mov eax, [local.3]
00401D99 |. |0345 F0 |add eax, [local.4]
00401D9C |. |0FBE08 |movsx ecx, byte ptr [eax]
00401D9F |. |83F9 61 |cmp ecx, 61
00401DA2 |. |7E 19 |jle short 00401DBD
00401DA4 |. |8B55 F4 |mov edx, [local.3]
00401DA7 |. |0355 F0 |add edx, [local.4]
00401DAA |. |0FBE02 |movsx eax, byte ptr [edx]
00401DAD |. |83F8 7A |cmp eax, 7A
00401DB0 |. |7D 0B |jge short 00401DBD
00401DB2 |. |8B4D F0 |mov ecx, [local.4]
00401DB5 |. |83C1 01 |add ecx, 1
00401DB8 |. |894D F0 |mov [local.4], ecx
00401DBB |.^\EB CC \jmp short 00401D89
00401DBD |> 837D F0 06 cmp [local.4], 6
00401DC1 |. 74 13 je short 00401DD6
00401DC3 |. 6A 00 push 0
00401DC5 |. 6A 00 push 0
00401DC7 |. 68 B4354000 push 004035B4 ; 非法用户!
61和7A,a和z的外号。用户名必须是a-z的24个小写字母(不含a、z),长度必须是六位。
000401DD9 |. 52 push edx ; /src
00401DDA |. 68 6C414000 push 0040416C ; |bcdefg
00401DDF |. E8 2E060000 call <jmp.&MSVCRT.strcpy> ; \strcpy
00401DE4 |. 83C4 08 add esp, 8
00401DE7 |. 8B45 F8 mov eax, dword ptr [ebp-8]
00401DEA |. 50 push eax ; /src
00401DEB |. 68 EC404000 push 004040EC ; |1234567890
00401DF0 |. E8 1D060000 call <jmp.&MSVCRT.strcpy> ; \strcpy
00401DF5 |. 83C4 08 add esp, 8
复制用户名和注册码到内存地址。
00401E03 |. 8B45 EC mov eax, dword ptr [ebp-14]
00401E06 |. 50 push eax
00401E07 |. E8 A4FDFFFF call 00401BB0
call 00401BB0 应该是关键CALL。进入。。。。。。
看来作者手下留情了。简单的限制条件、没有加密的字符串。
这么简单?刚开始发现字符串时的激动渐渐消去,失望的情绪开始蔓延。困意开始向我涌来。
第二部分:山重水复疑无路。
进入call 00401BB0:
00401BB0 $ 55 push ebp
00401BB1 . 8BEC mov ebp, esp ; (initial cpu selection)
00401BB3 . 6A FF push -1
00401BB5 . 68 F0264000 push 004026F0 ; 给6@; SE 处理程序安装
00401BBA . 64:A1 0000000>mov eax, dword ptr fs:[0]
00401BC0 . 50 push eax
00401BC1 . 64:8925 00000>mov dword ptr fs:[0], esp
00401BC8 . 51 push ecx
00401BC9 . 83EC 50 sub esp, 50
00401BCC . 53 push ebx
00401BCD . 56 push esi
00401BCE . 57 push edi
00401BCF . 8965 F0 mov dword ptr [ebp-10], esp
00401BD2 . 8B45 08 mov eax, dword ptr [ebp+8]
00401BD5 . 83E8 10 sub eax, 10
00401BD8 . 8945 EC mov dword ptr [ebp-14], eax
00401BDB . 8B4D EC mov ecx, dword ptr [ebp-14]
00401BDE . C701 F0174000 mov dword ptr [ecx], 004017F0
00401BE4 . C745 E8 00000>mov dword ptr [ebp-18], 0
00401BEB . C745 E4 00000>mov dword ptr [ebp-1C], 0
初始化的过程。
00401BF2 . /EB 05 jmp short 00401BF9
00401BF4 . |F9 stc
00401BF5 . |73 01 jnb short 00401BF8
00401BF7 . |C3 retn
00401BF8 . |FFE8 jmp far eax ; 非法使用寄存器
00401BFA . F6FF idiv bh
00401BFC . FFFF ??? ; 未知命令
似乎是花指令?我的精神一振,难道亮点在这?
00401BFE > /837D E8 06 cmp dword ptr [ebp-18], 6
00401C02 ? |7D 6D jge short 00401C71
00401C10 . 8B55 0C mov edx, dword ptr [ebp+C]
00401C13 . 0355 E8 add edx, dword ptr [ebp-18]
00401C16 . 0FBE02 movsx eax, byte ptr [edx]
00401C19 . 8B4D 10 mov ecx, dword ptr [ebp+10]
00401C1C . 034D E4 add ecx, dword ptr [ebp-1C]
00401C1F . 0FBE11 movsx edx, byte ptr [ecx]
00401C22 . 83C2 1B add edx, 1B
00401C25 . 3BC2 cmp eax, edx
00401C27 . 74 05 je short 00401C2E
00401C29 . E8 82FBFFFF call 004017B0 ; 错误提示
用户名和注册码奇数位的对应关系。
00401C3A . 8B45 0C mov eax, dword ptr [ebp+C]
00401C3D . 0345 E8 add eax, dword ptr [ebp-18]
00401C40 . 0FBE08 movsx ecx, byte ptr [eax]
00401C43 . 8B55 10 mov edx, dword ptr [ebp+10]
00401C46 . 0355 E4 add edx, dword ptr [ebp-1C]
00401C49 . 0FBE42 01 movsx eax, byte ptr [edx+1]
00401C4D . 83C0 20 add eax, 20
00401C50 . 3BC8 cmp ecx, eax
00401C52 . /7E 09 jle short 00401C5D
用户名和注册码偶数位的对应关系。
00401C54 . |8B4D EC mov ecx, dword ptr [ebp-14]
00401C57 . |C701 B0174000 mov dword ptr [ecx], 004017B0 ; 入口地址
00401C5D > \8B55 E4 mov edx, dword ptr [ebp-1C]
错误提示的入口地址。
00401C84 . C745 E0 9C020>mov dword ptr [ebp-20], 29C
00401C8B . 8B4D E0 mov ecx, dword ptr [ebp-20]
00401C8E . C601 06 mov byte ptr [ecx], 6
00401C91 . EB 0B jmp short 00401C9E
调试执行到这,突然无声地退出。我愣住了,一时没明白过来,不知发生了什么事情。
看来机关在这。我的睡意突然消失得无影无踪。难道是SEH异常处理?
00401BB5 . 68 F0264000 push 004026F0 ; 给6@; SE 处理程序安装
对应byte ptr [ecx]的异常处理:
00401BDE . C701 F0174000 mov dword ptr [ecx], 004017F0
.......
好了,中场休息。我将目光转向了前几天未看完的碟片,轻松一下,换换脑子。剧中的
男主角一边大喊:“快来看啊,有美女裸奔啊”,一边向聚拢来的人群发放广告。
我忽然脑中灵光一闪,依稀中Netwind就是男主角。不是吗?他用简单的字符串提示,制
造了这个CRACK ME很简单的初步印象,吸引来做他的作品。都到半路了,他突然抛出一个
对菜鸟来说重量级的破解难题。可怜的菜鸟我一不小心上了贼船,欲罢不能。
其实可做性是衡量一个CRACK ME好坏的一个判断标准。Netwind自然是深谙其道。第一部分自始自终
贯彻了可做性的原则,吸引了无数破解爱好者的兴趣,达到了他的广告效应。
第一部分的标题就是:明明白白我的心。
许多人被困在了第二部分,在此迷茫、彷徨。
第二部分的标题就是:山重水复疑无路。相信许多人有同感。
让我们一起曲径探幽,走出困境。
从现象上看,肯定是利用SEH异常处理来进行预定的跳转。但是,单独运行CRACK ME,却发现并没有
无声地退出,而是出现了错误的提示。然而在OD的动态调试中,在此它却没出现任何的提示。这说明,还有
其他的机关在其中。
通常情况下,这种情况的可能性有:
1.反调试。 我的第一直觉就是反调试。
2.自校验。 可能性不大。因为我在动态调试时,没有进行任何的代码改写。
认真地单步跟进异常处理机制,跟了一会儿我就确定确实有反调试。让我们认真地回顾中间这部分的难点,认真地进行思考,作者的加密思想在我们的脑海中渐渐清晰明了:
该CRACK ME加密思想的核心是三种加密手段的有机组合威力。三种加密手段分别是花指令、SEH异常跳转和反调试。大概就是六神中的三神吧。花指令主要作用是对付静态汇编,同时动态调试时干扰代码的可读性。SEH异常处理机制来进行预定的跳转,是常用的加密手段,具有一定的隐蔽性。作者对它进行了改进:与反调试有机地结合,增加了隐蔽性和欺骗性。三种加密手段
遥相呼应,互相照顾。可以说,作者的构思是成功的,这也是难点所在。但从实战的效果上看,
我直觉这加密思想里隐约有一个巨大的缺陷,即BUG。但一时半会却不能清晰地把握。
上班时间到了。只好暂时放下,准备晚上继续奋战。
。。。。。。
竟忘了是周末,和狐朋狗友玩了一夜。玩乐的间隙中,脑中总是不自禁地试图捕捉那个隐约的BUG。Netwind真害人啊,让我辜负了美女佳肴,做了一夜的柳下惠。那个隐约的BUG在不断地思考中,越来越清晰可见。作者对我的偷懒的想法有没有考虑到而进行防范呢?
回到了家里,已经深夜12点多了。我说服自己,就花一个小时,破不了就放弃,大不了明天继续。
这个加密思想的实战效果主要体现在隐蔽性。一旦被人发现并确定,其加密的效果形同虚设。特别是将反调试与SEH的处理机制相结合,强调的也是隐蔽性。被我们发现后,其弄巧成拙的缺陷就显示出来了。
00401C78 /EB 05 jmp short 00401C7F
00401C7A |F9 stc
00401C7B |73 01 jnb short 00401C7E
00401C7D |C3 retn
00401C7E |FFE8 jmp far eax ; 非法使用寄存器
00401C80 F6FF idiv bh
00401C82 FFFF ??? ; 未知命令
00401C84 . C745 E0 9C020>mov dword ptr [ebp-20], 29C
00401C8B . 8B4D E0 mov ecx, dword ptr [ebp-20]
00401C8E . C601 06 mov byte ptr [ecx], 6
00401C91 . EB 0B jmp short 00401C9E
我们在异常处理前,对花指令全部NOP填充(视觉舒服),然后改写成一句:
00401C78 ^\E9 74FBFFFF jmp 004017F0
00401C7D 90 nop
00401C7E 90 nop
00401C7F 90 nop
00401C80 90 nop
00401C81 90 nop
00401C82 90 nop
00401C83 90 nop
00401C84 . C745 E0 9C020>mov dword ptr [ebp-20], 29C
00401C8B . 8B4D E0 mov ecx, dword ptr [ebp-20]
00401C8E . C601 06 mov byte ptr [ecx], 6
00401C91 . EB 0B jmp short 00401C9E
什么SEH,什么狗屁反调试,统统和你说再见!!!
哈哈,原来所谓的万人愁、神勇的三神竟是如此的不堪一改。想想那些老老实实在那反调试的高手们,我的嘴角露出了一抹会心地微笑:懒人万岁!!!
因为懒,所以才会要求进步。这就是懒人的辩证的哲学观。
恍惚中,我忽然成了《笑傲江湖》里的令狐冲:
{
摘自《笑傲江湖》 第二十六章 围寺
那老者“咦”的一声,脸上微现惊异之色。那老者剑交左手,在身前
划了两个圆圈。令狐冲见他剑劲连绵,护住全身,竟无半分空隙,暗暗惊异:“我从未见过
谁的招式之中,竟能如此毫无破绽。他若以此相攻,那可如何破法?任我行前辈剑法或许比
这位老先生更强,但每一招中难免仍有破绽。难道一人使剑,竟可全无破绽?”
。。。。。。
那老者剑招未曾使老,已然圈转。突然之间,令狐冲眼前出现了几个白色光圈,大圈小
圈,正圈斜圈,闪烁不已。他眼睛一花,当即回剑向对方剑圈斜攻。当的一响,双剑再交,
令狐冲只感手臂一阵酸麻。
那老者剑上所幻的光圈越来越多,过不多时,他全身已隐在无数光圈之中,光圈一个未
消,另一个再生,长剑虽使得极快,却听不到丝毫金刃劈风之声,足见剑劲之柔韧已达于化
境。这时令狐冲已瞧不出他剑法中的空隙,只觉似有千百柄长剑护住了他全身。那老者纯采
守势,端的是绝无破绽。可是这座剑锋所组成的堡垒却能移动,千百个光圈犹如浪潮一般,
缓缓涌来。那老者并非一招一招的相攻,而是以数十招剑法混成的守势,同时化为攻势。令
狐冲无法抵御,只得退步相避。
他退一步,光圈便逼进一步,顷刻之间,令狐冲已连退了七八步。
。。。。。。
他又退几步,凝视对方剑光所幻的无数圆圈,蓦地心想:“说不定这圆圈的中心,便是
破绽。但若不是破绽,我一剑刺入,给他长剑这么一绞,手臂便登时断了。”
又想:“幸好他如此攻逼,只能渐进,当真要伤我性命,却也不易。但我一味退避,终
究是输了。此仗一败,大伙儿心虚气馁,哪里还能去闯少林,救盈盈?”想到盈盈对自己情
深义重,为她断送一条手臂,又有何妨?内心深处,竟觉得为她断送一条手臂,乃是十分快
慰之事,又觉自己负她良多,须得为她受到甚么重大伤残,方能稍报深恩。言念及此,内心
深处,倒似渴望对方能将自己一条手臂斩断,当下手臂一伸,长剑便从老者的剑光圈中刺了
进去。当的一声大响,令狐冲只感胸口剧烈一震,气血翻涌,一只手臂却仍然完好。那老者
退开两步,收剑而立,脸上神色古怪,既有惊诧之意,亦有惭愧之色,更带着几分惋惜之情
,隔了良久,才道:“令狐公子剑法高明,胆识过人,佩服,佩服!”令狐冲此时方知,适
才如此冒险一击,果然是找到了对方剑法的弱点所在,只是那老者剑法实在太高,光圈中心
本是最凶险之处,他居然练得将破绽藏于其中,天下成千成万剑客之中,只怕难得有一个胆
敢以身犯险。他一逞而成,心下暗叫:“侥幸,侥幸!”只觉得一道道汗水从背脊流下,当
即躬身道:“前辈剑法通神,承蒙指教,晚辈得益非浅。”这句话倒不是寻常的客套,这一
战于他武功的进益确是大有好处,令他得知敌人招数中之最强处,竟然便是最弱处,最强处
都能击破,其余自是迎刃而解了。
高手比剑,一招而决。那老者即见令狐冲敢于从自己剑光圈中挥刃直入,以后也就不必
再比。
}
那么,这是不是就证明作者的这种加密思想不成立呢?答案当然是否定的。以Netwind的
功力,应该会考虑到这种投机取巧的破法。
这种加密思想有实用价值。
我首先肯定它的实用性。其次,我要做的就是对BUG进行完善、改进。我自己设想,对这段
代码进行简单的自校验就能对我的投机进行有效的防范。最后我破解成功后,自己认为只有五
神。花指令、SEH异常跳转和反调试,有了三神了。(第四神在最后部分的开始,第五神是最
后的简单算法)那么,自校验是不是作者心中原来的六神之一呢?当然了,其他还有许多较巧妙
的弥补缺陷的手段。自校验更容易让我等菜鸟理解。
一个好的CRACK ME,是会留有一个破解的作弊法,类似于游戏中的作弊秘籍。主要目的是提高可玩性、可欣赏性。这样,就不致于不会反调试,就体会不到下面的巧妙。这就是所谓的
雅俗共赏吧。高手有高手的正规破解法,我等菜鸟有菜鸟非常规的投机术。各有各的乐趣。
抬眼看去,快半个小时了。算了,以后再试验四神合作的威力吧。破解要紧。我这人就这
毛病,破解老是去想注册码以外的问题,破解效率一直不高。不要嫌我啰嗦!
第三部分:柳暗花明又一神
所谓成也萧何,败也萧何!由于这一次的投机取巧成功,滋生了我的小资产阶级意识。我的思维渐渐被邪门外道占据,以致于在随后的第四神前面,企图一探反调试的奥妙时,尽想走捷径,反而事与愿违,走了许多的弯路,浪费了大量宝贵的睡眠时间(主要是在反调试上,总尝试投机的可能性)。
004018BB |> 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
004018BD |. 68 60354000 push 00403560 ; |错了!
004018C2 |. 68 54354000 push 00403554 ; |继续努力!
004018C7 |. 0FBE0D F64040>movsx ecx, byte ptr [4040F6] ; |
004018CE |. 83E9 55 sub ecx, 55 ; |
004018D1 |. F7D9 neg ecx ; |
004018D3 |. 1BC9 sbb ecx, ecx ; |
004018D5 |. 41 inc ecx ; |
004018D6 |. 51 push ecx ; |hOwner
004018D7 |. FF15 00324000 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
004018DD |. 8945 D8 mov dword ptr [ebp-28], eax ; 12F7C4 EBP-28
004018E0 |. 837D D8 00 cmp dword ptr [ebp-28], 0
这是又一只拦路虎!但难度低于三神合一。与上面的三神相互照顾,其实战效果我是亲身经历,身有体会啊!好的CRACK ME就是这样,你越琢磨,心里的受惠就越多。(注意,不是受贿)。对作者的钦佩之心就越浓。
第四神其实没什么难度。你只要将下面的出错信息和上面的对比,就会产生许多的疑问:
1.这两段代码有什么不同?
2.不同的意义何在?
3.[4040F6]的内容是什么?
004017B0 /$ 55 push ebp
004017B1 |. 8BEC mov ebp, esp
004017B3 |. 83EC 44 sub esp, 44
004017B6 |. 53 push ebx
004017B7 |. 56 push esi
004017B8 |. 57 push edi
004017B9 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
004017BB |. 68 60354000 push 00403560 ; |错了!
004017C0 |. 68 54354000 push 00403554 ; |继续努力!
004017C5 |. 6A 00 push 0 ; |hOwner = NULL
004017C7 |. FF15 00324000 call dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
004017CD |. FF15 20304000 call dword ptr [<&KERNEL32.GetCurrent>; [GetCurrentProcess
004017D3 |. 8945 FC mov dword ptr [ebp-4], eax
004017D6 |. 6A 00 push 0 ; /ExitCode = 0
004017D8 |. 8B45 FC mov eax, dword ptr [ebp-4] ; |
004017DB |. 50 push eax ; |hProcess
004017DC |. FF15 00304000 call dword ptr [<&KERNEL32.TerminateP>; \TerminateProcess
**********请先思考***********************************
这三个问题很简单,认真思考后,你就会明白是对第六个字符的隐性判断条件:
004018CE |. 83E9 55 sub ecx, 55 ; |
。。。。。。
004018D6 |. 51 push ecx ; |hOwner
破解成功后,周日与朋友交谈。朋友也注意到了此处注册信息的异常,他是一开始就对55进行
了大胆的猜想,一试成功。我反应比较迟钝,对其的实现原理进行了大致猜测和跟踪后,才开始进行破解。
会汇编编程的很容易理解这个难点。如果硬要说它的成功处,还是注重了隐蔽性。其实作者仁
慈地将异常暴露在最显眼的地方,显然是有意降低了难度。这第四神的加密思想就是注重隐性
判断条件的实现。隐性判断条件的巧妙构建和实现,似乎有流行的趋势。
[PEDIY Crackme 竞赛 2007] [第一回] 第16 队 –topmint里关于用户名的隐性判断
条件的构建和实现,堪称经典。
让我印象深刻的原因在于:两位作者加密技术的精湛和化腐朽为神奇的功力。他们的共同技术
特点在于:将平凡的编程知识略做雕琢,竟使之立刻成了加密的利器。这似乎就是传说中的飞花摘叶、伤人无形的加密最高境界。
我的大把时间浪费在手工反调试的研究上,与注册无关,纯粹个人的破解兴趣。主要研究的目标就是如何用简单的手段绕过反调试,也就是如何投机取巧。不知不觉,天已放亮。因此对最后的算法部分花的时间不多。
从作者的CRACK ME的构思创作上,核心是中间的四神合一的组合。(如果加上自校验,就
是五神合一了,加上最后的简单算法,共六神合体)。前面的简单部分和后面的算法部分,都是
贯彻可破性和趣味性,给破解者以成就感,同时树立良好的CRACK ME形象,为以后的作品打下破解群众基础。
简单介绍如下:
将用户名第一位和第六位,分别与A-Z的大写字母依次奇数位或偶数位比较,相同就后移一个,大写字母的奇偶数就会发生变化,接着继续比较。
不相同的字符存入堆栈:
0012F7C8 48464441
0012F7CC 504E4C4A
0012F7D0 58565452
0012F7D4 48464442
0012F7D8 504E4C4A
0012F7DC 58565452
根据用户名第一位的ASCII是奇数或偶数的不同,上述堆栈有两种不同的结果。
0040181F |> /837D D8 18 /cmp dword ptr [ebp-28], 18
00401823 |. |0F84 92000000 |je 004018BB
00401829 |. |EB 05 |jmp short 00401830
0040182B |. |F9 |stc
0040182C |. |73 01 |jnb short 0040182F
0040182E |. |C3 |retn
0040182F |. |FFE8 |jmp far eax ; 非法使用寄存器
00401831 |. |F6FF |idiv bh
00401833 |. |FFFF |??? ; 未知命令
00401835 |. |0FBE0D 6C4140>|movsx ecx, byte ptr [40416C]
0040183C |. |8B55 FC |mov edx, dword ptr [ebp-4] ; A-Z大写
0040183F |. |0FBE02 |movsx eax, byte ptr [edx]
00401842 |. |83C0 20 |add eax, 20
00401845 |. |3BC8 |cmp ecx, eax
00401847 |. |74 21 |je short 0040186A
00401849 |. |68 6C414000 |push 0040416C ; /bcdefg
0040184E |. |E8 AD0B0000 |call <jmp.&MSVCRT.strlen> ; \strlen
00401853 |. |83C4 04 |add esp, 4
00401856 |. |0FBE88 6B4140>|movsx ecx, byte ptr [eax+40416B] ; 用户名
0040185D |. |8B55 FC |mov edx, dword ptr [ebp-4] ; A-Z大写
00401860 |. |0FBE02 |movsx eax, byte ptr [edx]
00401863 |. |83C0 20 |add eax, 20
00401866 |. |3BC8 |cmp ecx, eax
00401868 |. |75 09 |jnz short 00401873
0040186A |> |8B4D FC |mov ecx, dword ptr [ebp-4] ; A-Z大写字母
0040186D |. |83C1 01 |add ecx, 1 ;
00401870 |. |894D FC |mov dword ptr [ebp-4], ecx
00401873 |> |8B55 D8 |mov edx, dword ptr [ebp-28] ;
00401876 |. |8B45 FC |mov eax, dword ptr [ebp-4] ;
00401879 |. |8A08 |mov cl, byte ptr [eax]
0040187B |. |884C15 DC |mov byte ptr [ebp+edx-24], cl
0040187F |. |8B55 D8 |mov edx, dword ptr [ebp-28]
00401882 |. |83C2 01 |add edx, 1
00401885 |. |8955 D8 |mov dword ptr [ebp-28], edx
00401888 |. |8B45 FC |mov eax, dword ptr [ebp-4]
0040188B |. |83C0 02 |add eax, 2 ; A-Z大写字母的奇数位字符
0040188E |. |8945 FC |mov dword ptr [ebp-4], eax
00401891 |. |EB 05 |jmp short 00401898
00401893 |. |F9 |stc
00401894 |. |73 01 |jnb short 00401897
00401896 |. |C3 |retn
00401897 |. |FFE8 |jmp far eax ; 非法使用寄存器
00401899 |. |F6FF |idiv bh
0040189B |. |FFFF |??? ; 未知命令
0040189D |. |8B4D FC |mov ecx, dword ptr [ebp-4]
004018A0 |. |0FBE11 |movsx edx, byte ptr [ecx]
004018A3 |. |85D2 |test edx, edx
004018A5 |. |75 0F |jnz short 004018B6
004018A7 |. |837D D8 18 |cmp dword ptr [ebp-28], 18
004018AB |. |7D 09 |jge short 004018B6
004018AD |. |8B45 F8 |mov eax, dword ptr [ebp-8]
004018B0 |. |83C0 01 |add eax, 1
004018B3 |. |8945 FC |mov dword ptr [ebp-4], eax
004018B6 |>^\E9 64FFFFFF \jmp 0040181F
004018BB |> 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
将用户名前五个字符和上述的堆栈结果分别分四位一组进行逐位对比,全都符合就成功:
00401910 |> /837D D8 0C /cmp dword ptr [ebp-28], 0C
00401914 |. |0F84 BB000000 |je 004019D5
0040191A |. |8B45 D0 |mov eax, dword ptr [ebp-30]
0040191D |. |8D0C85 FCFFFF>|lea ecx, dword ptr [eax*4-4]
00401924 |. |894D C8 |mov dword ptr [ebp-38], ecx ; H 10
00401927 |> |8B55 D8 |/mov edx, dword ptr [ebp-28]
0040192A |. |0FBE82 EC4040>||movsx eax, byte ptr [edx+4040EC] ; 假码
00401931 |. |8B4D C8 ||mov ecx, dword ptr [ebp-38]
00401934 |. |0FBE540D DC ||movsx edx, byte ptr [ebp+ecx-24] ; 参与上述比较的堆栈字符
00401939 |. |8B4D C8 ||mov ecx, dword ptr [ebp-38]
0040193C |. |83C1 01 ||add ecx, 1
0040193F |. |894D C8 ||mov dword ptr [ebp-38], ecx
00401942 |. |3BC2 ||cmp eax, edx
00401944 |. |74 13 ||je short 00401959
00401946 |. |8B55 CC ||mov edx, dword ptr [ebp-34]
00401949 |. |83C2 01 ||add edx, 1
0040194C |. |8955 CC ||mov dword ptr [ebp-34], edx
0040194F |. |837D CC 04 ||cmp dword ptr [ebp-34], 4
00401953 |. |7E 02 ||jle short 00401957
00401955 |. |EB 02 ||jmp short 00401959
00401957 |>^|EB CE |\jmp short 00401927
00401959 |> |837D CC 05 |cmp dword ptr [ebp-34], 5
0040195D |. |75 3F |jnz short 0040199E
0040195F |. |C745 C4 78354>|mov dword ptr [ebp-3C], 00403578 ; abcdefghijklmn
00401966 |. |C745 C0 68354>|mov dword ptr [ebp-40], 00403568 ; opqrstuvwxyz
0040196D |. |50 |push eax
0040196E |. |8D85 C4FFFFFF |lea eax, dword ptr [ebp-3C]
00401974 |. |50 |push eax
00401975 |. |FF75 C0 |push dword ptr [ebp-40]
00401978 |. |58 |pop eax
00401979 |. |58 |pop eax
0040197A |. |58 |pop eax
0040197B |. |8945 CC |mov dword ptr [ebp-34], eax
0040197E |. |837D CC 00 |cmp dword ptr [ebp-34], 0
00401982 |. |7E 07 |jle short 0040198B
00401984 |. |E8 27FEFFFF |call 004017B0 ; 错误提示
00401989 |. |EB 0E |jmp short 00401999
0040198B |> |50 |push eax
0040198C |. |8D85 C4FFFFFF |lea eax, dword ptr [ebp-3C]
00401992 |. |50 |push eax
00401993 |. |FF75 C0 |push dword ptr [ebp-40]
00401996 |. |58 |pop eax
00401997 |. |58 |pop eax
00401998 |. |58 |pop eax
00401999 |> |E8 12FEFFFF |call 004017B0 ; 错误提示
0040199E |> |8B45 D8 |mov eax, dword ptr [ebp-28]
004019A1 |. |83C0 02 |add eax, 2
004019A4 |. |8945 D8 |mov dword ptr [ebp-28], eax
004019A7 |. |8B4D D0 |mov ecx, dword ptr [ebp-30]
004019AA |. |83E9 01 |sub ecx, 1
004019AD |. |894D D0 |mov dword ptr [ebp-30], ecx
004019B0 |. |EB 05 |jmp short 004019B7
004019B2 |. |F9 |stc
004019B3 |. |73 01 |jnb short 004019B6
004019B5 |. |C3 |retn
004019B6 |. |FFE8 |jmp far eax ; 非法使用寄存器
004019B8 |. |F6FF |idiv bh
004019BA |. |FFFF |??? ; 未知命令
004019BC |. |837D D0 00 |cmp dword ptr [ebp-30], 0
004019C0 |. |75 07 |jnz short 004019C9
004019C2 |. |C745 D0 06000>|mov dword ptr [ebp-30], 6
004019C9 |> |C745 CC 00000>|mov dword ptr [ebp-34], 0
004019D0 |.^\E9 3BFFFFFF \jmp 00401910
004019D5 |> E8 96FDFFFF call 00401770 ; 注册成功提示CALL
按照作者的意思,注册机的制作应该是根据用户名来得出注册码,这就要完全弄懂、掌握这段
算法的精髓。我觉得,根据堆栈里的结果反推用户名较容易实现,但那似乎不是作者的本意。Netwind是一个很注重实用性的作者。星期天尝试了一下,用用户名反推注册码的注册机是可行的。但算法很繁琐,自己不满意。有些地方还需要完善。希望向高手学习,看看他们简洁的注册机算法。
第三部分的标题就叫:柳暗花明又一神。历经艰难,终成正果!心如枯木逢春、饮甘露,悠然神仙感。
一个字:
爽
爽
爽
爽
爽
爽
为了庆贺《加密和解密III》的正式发行,为了体现我等菜鸟同乐的心情,特写此文共同娱乐!!!也记录自己难得的熬夜。
附一组成功注册的:
用户名:ddlddp
注册码:IIIIQQIIIIUP
在雅俗共赏里,我这篇应该算是俗的吧。和我一样的菜鸟应该受欢迎吧。期待高手的雅文。。。
看雪论坛读书月
六神合体难上难
山重水复疑无路
柳暗花明又一神
神之所以称为神,是因为他做了常人做不到的事情。当你经历了五神的艰难考验,完成了看上去似乎以前不可能完成的破解任务,你也许就是作者心中的第六神。(自校验是第六神只是我猜测的另一种可能性)
《加密和解密III》的正式出版和发行,会令你成为破解之神的概率更多一些,道路更为宽广一些。
--------------------------------------------------------------------------------
【经验总结】
针对现在CRACK ME论坛上的CRACK ME创作标准问题,我简单谈了谈自己的判断标准:
1.较有新意的加密思想。通常是创作的核心,同时也是破解的难点。
可以是巧妙的算法构思,也可以是常规反破解手段的有机组合(如本例),
也可以是隐性判断条件的隐蔽实现。也可以是资源的加密或防断(如小蜜蜂)。
创作原则是有新意。
2.可做性和娱乐性。增加破解者的成就感。尽可能做到雅俗共赏,不过不容易。
3.注意编写的层次和难度搭配。本CRACK ME开始很简单,容易上手。中间部分
难倒一片菜鸟。后面的部分是很好的点缀。作者的创作节奏把握很到位,
极好地抓住了破解者的破解心理变化。
其他的请高手指点一二!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年07月12日 下午 06:21:21
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!