[反汇编练习] 160个CrackMe之033
[反汇编练习] 160个CrackMe之033.
本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

2、程序分析:
想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。
和上一节一样,打开CHM,选择第33个Cruehead.1.exe,保存下来。运行程序,程序界面如下:


有信息框,很好。
PEID:MASM32 / TASM32 [覆盖]
汇编写的程序啊!哎!要么很简单,要么就很坑啦!
3、思路分析和破解流程
1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。
2、点击About->Register,随意输入伪码:bbdxf 123123。点击OK按钮,弹出信息框,不要关闭,回到OD。
3、Ctrl+K查看堆栈信息:

选中Cruehead.0040137E,右键->Show calls
0040137E /$ 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
00401382 |. 56 push esi ; // "bbdxf"
00401383 |> 8A06 /mov al,byte ptr ds:[esi]
00401385 |. 84C0 |test al,al
00401387 |. 74 13 |je short 0040139C
00401389 |. 3C 41 |cmp al,0x41 ; "A"
0040138B |. 72 1F |jb short 004013AC
0040138D |. 3C 5A |cmp al,0x5A ; "Z"
0040138F |. 73 03 |jnb short 00401394
00401391 |. 46 |inc esi
00401392 |.^ EB EF |jmp short 00401383
00401394 |> E8 39000000 |call 004013D2 ; // 如果在A-Z之间,则处理(+0x20)
00401399 |. 46 |inc esi
0040139A |.^ EB E7 \jmp short 00401383
0040139C |> 5E pop esi
0040139D |. E8 20000000 call 004013C2 ; // 处理完成在这里处理
004013A2 |. 81F7 78560000 xor edi,0x5678 ; // 在这里进行比较
004013A8 |. 8BC7 mov eax,edi
004013AA |. EB 15 jmp short 004013C1
004013AC |> 5E pop esi
004013AD |. 6A 30 push 0x30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF |. 68 60214000 push 00402160 ; |Title = "No luck!"
004013B4 |. 68 69214000 push 00402169 ; |Text = "No luck there, mate!"
004013B9 |. FF75 08 push [arg.1] ; |hOwner
004013BC |. E8 79000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
004013C1 \> C3 retn
这段代码只是将name分析处理了一下,如果不合格则跳转到失败。
我们选中这段代码头部,即0040137E地址处,OD提示:
Local call from 0040122D
我们转到地址 0040122D,附近代码如下:
00401228 . 68 8E214000 push 0040218E ; ASCII "BBDXF"
0040122D . E8 4C010000 call 0040137E
00401232 . 50 push eax ; // 比较之后来到这里
00401233 . 68 7E214000 push 0040217E ; ASCII "123123"
00401238 . E8 9B010000 call 004013D8
0040123D . 83C4 04 add esp,0x4 ; // 再次处理之后
00401240 . 58 pop eax
00401241 . 3BC3 cmp eax,ebx
00401243 . 74 07 je short 0040124C
00401245 . E8 18010000 call 00401362
0040124A .^ EB 9A jmp short 004011E6
0040124C > E8 FC000000 call 0040134D ; // 这个跳转到正确的提示
00401251 .^ EB 93 jmp short 004011E6
发现,这里调用了大量的Call,我们一个个分析一下(注释里已经分析好了):
call 0040137E 内容: 0040137E /$ 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
00401382 |. 56 push esi ; // "bbdxf"
00401383 |> 8A06 /mov al,byte ptr ds:[esi]
00401385 |. 84C0 |test al,al
00401387 |. 74 13 |je short 0040139C
00401389 |. 3C 41 |cmp al,0x41 ; "A"
0040138B |. 72 1F |jb short 004013AC
0040138D |. 3C 5A |cmp al,0x5A ; "Z"
0040138F |. 73 03 |jnb short 00401394
00401391 |. 46 |inc esi
00401392 |.^ EB EF |jmp short 00401383
00401394 |> E8 39000000 |call 004013D2 ; // 如果在A-Z之间,则处理(+0x20)
00401399 |. 46 |inc esi
0040139A |.^ EB E7 \jmp short 00401383
0040139C |> 5E pop esi
0040139D |. E8 20000000 call 004013C2 ; // 处理完成在这里处理
004013A2 |. 81F7 78560000 xor edi,0x5678 ; // 在这里进行比较
004013A8 |. 8BC7 mov eax,edi
004013AA |. EB 15 jmp short 004013C1
004013AC |> 5E pop esi
004013AD |. 6A 30 push 0x30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
004013AF |. 68 60214000 push 00402160 ; |Title = "No luck!"
004013B4 |. 68 69214000 push 00402169 ; |Text = "No luck there, mate!"
004013B9 |. FF75 08 push [arg.1] ; |hOwner
004013BC |. E8 79000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
004013C1 \> C3 retn 其中,call 004013D2 内容:
004013D2 /$ 2C 20 sub al,0x20
004013D4 |. 8806 mov byte ptr ds:[esi],al
004013D6 \. C3 retn 其中,call 004013C2 内容:
004013C2 /$ 33FF xor edi,edi
004013C4 |. 33DB xor ebx,ebx
004013C6 |> 8A1E /mov bl,byte ptr ds:[esi]
004013C8 |. 84DB |test bl,bl
004013CA |. 74 05 |je short 004013D1
004013CC |. 03FB |add edi,ebx ; // edi=循环求和
004013CE |. 46 |inc esi
004013CF |.^ EB F5 \jmp short 004013C6
004013D1 \> C3 retn Call 004013D8 内容:
004013D8 /$ 33C0 xor eax,eax
004013DA |. 33FF xor edi,edi
004013DC |. 33DB xor ebx,ebx
004013DE |. 8B7424 04 mov esi,dword ptr ss:[esp+0x4]
004013E2 |> B0 0A /mov al,0xA
004013E4 |. 8A1E |mov bl,byte ptr ds:[esi] ; // "123123"
004013E6 |. 84DB |test bl,bl
004013E8 |. 74 0B |je short 004013F5
004013EA |. 80EB 30 |sub bl,0x30 ; // +0x30
004013ED |. 0FAFF8 |imul edi,eax ; // edi/10
004013F0 |. 03FB |add edi,ebx ; // edi+ebx
004013F2 |. 46 |inc esi
004013F3 |.^ EB ED \jmp short 004013E2
004013F5 |> 81F7 34120000 xor edi,0x1234
004013FB |. 8BDF mov ebx,edi
004013FD \. C3 retn call 0040134D 的内容:
0040134D /$ 6A 30 push 0x30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040134F |. 68 29214000 push 00402129 ; |Title = "Good work!"
00401354 |. 68 34214000 push 00402134 ; |Text = "Great work, mate!
Now try the next CrackMe!"
00401359 |. FF75 08 push [arg.1] ; |hOwner
0040135C |. E8 D9000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401361 \. C3 retn
哈哈,大概流程是这样的,地址00401228开始,将Name和Serial分别经过call运算,通过00401241 . 3BC3 cmp eax,ebx 比较,然后根据结果跳转到不同的处理,其中,0040124C > E8 FC000000 call 0040134D 是提示正确的处理流程。所以,我们只要00401243 . 74 07 je short 0040124C改为jmp 0040124C,试一试:

4、注册机的探索
算法处理如下:
1、Name字符串,先判断是否在A-Z之间,然后每个字符ANSII值加上0x20,然后对计算后的值求和,最后与0x5678异或。
2、Serial字符串,每个字符ANSII值加上0x30,然后加上上一次的和除以10的值,存到一个变量中,继续下一个,最后与0x1234异或。
3、比较最后的结果。
…..我想想不出来这样的两个字符串,我也没办法反计算,所以,这有作罢!
BY BBDXF
[反汇编练习] 160个CrackMe之033的更多相关文章
- [反汇编练习] 160个CrackMe之027
[反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之026
[反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之025
[反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之024
[反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之022
[反汇编练习] 160个CrackMe之022. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之021
[反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之020
[反汇编练习] 160个CrackMe之020. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之019
[反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之018
[反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
- P3388 【模板】割点(割顶)
P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...
- 【15】ES6 for Humans: The Latest Standard of JavaScript: ES2015 and Beyond
[15]ES6 for Humans 共148页: 目前看到:已经全部阅读. 亚马逊地址: 魔芋:总结: 我先看的是阮一峰的在线书籍.这本书的内容很多都与之重复的. 居然卖¥463.也是没谁了. ...
- 30、自定义gridview
要想实现自定义gridview效果,有下边几个步骤: 1.定义grivew中的item的xml文件 假如item需要显示一个图片,图片下边显示文字: <?xml version="1. ...
- CF750E 线段树+矩阵乘矩阵加
题目描述 A string tt is called nice if a string "2017" occurs in tt as a subsequence but a str ...
- Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式
什么是生成器:只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,再调用函数不会执行函数内部代码这个生成器本身有 _iter_ he _next_功能(即生成器 ...
- spring AOP详解一
AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码 ...
- Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_AOP
虽然并不是每个问题都有答案,但我想了很多问题.so, just write it down , maybe one day...... AOP: 1,AOP是啥 2,AOP思想是怎么产生的 3,AOP ...
- 九度oj 题目1411:转圈
题目描述: 在一个有向图有n个顶点(编号从1到n),给一个起点s,问从起点出发,至少经过一条边,回到起点的最短距离. 输入: 输入包括多组,每组输入第一行包括三个整数n,m,s(1<=n< ...
- POJ 1953 World Cup Noise
World Cup Noise Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14397 Accepted: 7129 ...
- 异常详细信息: System.Data.SqlClient.SqlException: 用户 'NT AUTHORITY\IUSR' 登录失败解决办法
最近在做.net项目,因为本人以前做java较多,所以对.net不熟悉,在项目完成后部署到IIS服务器上出现诸多问题,以上其中之一,若有时间,在更新其他问题的解决办法! 异常详细信息: System. ...