[反汇编练习] 160个CrackMe之008
[反汇编练习] 160个CrackMe之008.
本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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,选择第8个Andrénalin.1(谁能告诉我这是哪国语言?什么意思?),保存下来。运行程序,程序界面如下:

3、思路分析和破解流程
虽然看不懂这是什么意思,也不知道是哪国语言,但是不妨碍我们把它破掉。出现消息框,是不是感到很亲切?哈哈,Ctrl+K你懂的。不过,为了放心地继续下去,还是先用PEID查看一下:Microsoft Visual Basic 5.0 / 6.0。恩,没加壳,真良心。
由于它第一时间就把消息框给弹出来了,我们不能辜负她,还是用老办法,暂停,查看堆栈。
具体操作步骤如下:
1、关掉程序,打开OD,将exe拖到OD中运行。
2、在exe中随意输入一个伪码,比如123321,点击【OK】按钮,弹出错误对话框。
3、此时不要关闭对话框,回到OD,使用Ctrl+K(K图标),得到当前堆栈信息。
4、参考vba常用函数说明(http://www.cnblogs.com/bbdxf/p/3780187.html),发现信息框函数。

5、选中rtcMsgBox这一行,右键->Show Call,返回到了反汇编窗口。
6、向上浏览代码,发现有两块字符串相关的内容。
00401DC4 . 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
00401DCA . 8D4D B4 lea ecx,dword ptr ss:[ebp-0x4C]
00401DCD . 8945 94 mov dword ptr ss:[ebp-0x6C],eax
00401DD0 . 8945 A4 mov dword ptr ss:[ebp-0x5C],eax
00401DD3 . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],00401AC4 ; UNICODE "SuCCESFul !"
00401DDD . 899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx
00401DE3 . FFD7 call edi ; <&MSVBVM50.__vbaVarDup>
00401DE5 . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C]
00401DE8 . 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
00401DEB . C745 8C 701A4>mov dword ptr ss:[ebp-0x74],00401A70 ; UNICODE "RiCHtiG ! ...nun weiter zu CrackMe 2 !"
00401DF2 . 895D 84 mov dword ptr ss:[ebp-0x7C],ebx
00401DF5 . FFD7 call edi
00401DF7 . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C]
00401DFA . 8D45 A4 lea eax,dword ptr ss:[ebp-0x5C]
00401DFD . 52 push edx
00401DFE . 8D4D B4 lea ecx,dword ptr ss:[ebp-0x4C]
00401E01 . 50 push eax
00401E02 . 51 push ecx
00401E03 . 8D55 C4 lea edx,dword ptr ss:[ebp-0x3C]
00401E06 . 6A 30 push 0x30
00401E08 . 52 push edx
00401E09 . FF15 F0304000 call dword ptr ds:[<&MSVBVM50.#595>] ; msvbvm50.rtcMsgBox
00401E0F . 8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
00401E15 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24]
00401E18 . 8985 4CFFFFFF mov dword ptr ss:[ebp-0xB4],eax
00401E1E . C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x3
00401E28 . FF15 D0304000 call dword ptr ds:[<&MSVBVM50.__vbaVarMo>; msvbvm50.__vbaVarMove
00401E2E . 8D45 94 lea eax,dword ptr ss:[ebp-0x6C]
00401E31 . 8D4D A4 lea ecx,dword ptr ss:[ebp-0x5C]
00401E34 . 50 push eax
00401E35 . 8D55 B4 lea edx,dword ptr ss:[ebp-0x4C]
00401E38 . 51 push ecx
00401E39 . 8D45 C4 lea eax,dword ptr ss:[ebp-0x3C]
00401E3C . 52 push edx
00401E3D . 50 push eax
00401E3E . E9 95000000 jmp 00401ED8
00401E43 > 8B3D 48314000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaVa>; msvbvm50.__vbaVarDup
00401E49 . B9 04000280 mov ecx,0x80020004
00401E4E . 894D 9C mov dword ptr ss:[ebp-0x64],ecx
00401E51 . B8 0A000000 mov eax,0xA
00401E56 . 894D AC mov dword ptr ss:[ebp-0x54],ecx
00401E59 . BB 08000000 mov ebx,0x8
00401E5E . 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
00401E64 . 8D4D B4 lea ecx,dword ptr ss:[ebp-0x4C]
00401E67 . 8945 94 mov dword ptr ss:[ebp-0x6C],eax
00401E6A . 8945 A4 mov dword ptr ss:[ebp-0x5C],eax
00401E6D . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],00401B44 ; UNICODE "leider NeiN !"
00401E77 . 899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx
00401E7D . FFD7 call edi ; <&MSVBVM50.__vbaVarDup>
00401E7F . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C]
00401E82 . 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
00401E85 . C745 8C E01A4>mov dword ptr ss:[ebp-0x74],00401AE0 ; UNICODE "Leider Falsch ! Schau noch mal genau nach ..."
00401E8C . 895D 84 mov dword ptr ss:[ebp-0x7C],ebx
00401E8F . FFD7 call edi
00401E91 . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C]
00401E94 . 8D55 A4 lea edx,dword ptr ss:[ebp-0x5C]
00401E97 . 51 push ecx
00401E98 . 8D45 B4 lea eax,dword ptr ss:[ebp-0x4C]
00401E9B . 52 push edx
00401E9C . 50 push eax
00401E9D . 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
00401EA0 . 6A 10 push 0x10
00401EA2 . 51 push ecx
00401EA3 . FF15 F0304000 call dword ptr ds:[<&MSVBVM50.#595>] ; msvbvm50.rtcMsgBox
因为语言的原因,虽然看的不是很明白,但是大概上面的一个就是成功(success),下面的那个就是我们刚看到的失败提示内容。
继续向上找发现了一个JE跳转:
00401D94 . FF15 60314000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>; msvbvm50.__vbaFreeObj
00401D9A . 66:3BFE cmp di,si
00401D9D . 0F84 A0000000 je 00401E43
00401DA3 . FF15 2C314000 call dword ptr ds:[<&MSVBVM50.#534>] ; msvbvm50.rtcBeep
00401DA9 . 8B3D 48314000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaVa>; msvbvm50.__vbaVarDup
00401DAF . B9 04000280 mov ecx,0x80020004
00401DB4 . 894D 9C mov dword ptr ss:[ebp-0x64],ecx
00401DB7 . B8 0A000000 mov eax,0xA
00401DBC . 894D AC mov dword ptr ss:[ebp-0x54],ecx
00401DBF . BB 08000000 mov ebx,0x8
00401DC4 . 8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
00401DCA . 8D4D B4 lea ecx,dword ptr ss:[ebp-0x4C]
00401DCD . 8945 94 mov dword ptr ss:[ebp-0x6C],eax
00401DD0 . 8945 A4 mov dword ptr ss:[ebp-0x5C],eax
00401DD3 . C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],00401AC4 ; UNICODE "SuCCESFul !"
00401DDD . 899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx
00401DE3 . FFD7 call edi ; <&MSVBVM50.__vbaVarDup>
00401DE5 . 8D55 84 lea edx,dword ptr ss:[ebp-0x7C]
00401DE8 . 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C]
00401DEB . C745 8C 701A4>mov dword ptr ss:[ebp-0x74],00401A70 ; UNICODE "RiCHtiG ! ...nun weiter zu CrackMe 2 !"
发现,JE如果跳过去则提示的是失败,如果不跳则提示成功,所以这个肯定是关键跳啦!我们尝试使用NOP填充一下!选中JE 00401E43,右键->Binary->Fill with NOPs。再次回到程序,点击【OK】按钮,哈哈哈,爆破成功!

4、注册码探索
既然已经找到关键的JE跳转了,关键CALL一定在它的旁边,我们试着再向上寻找:
00401D70 > \8B4D D8 mov ecx,dword ptr ss:[ebp-0x28]
00401D73 . 51 push ecx ; // ecx=输入的字符串
00401D74 . 68 541A4000 push 00401A54 ; UNICODE "SynTaX 2oo1"
00401D79 . FF15 08314000 call dword ptr ds:[<&MSVBVM50.__vbaStrCm>; msvbvm50.__vbaStrCmp
00401D7F . 8BF8 mov edi,eax
00401D81 . 8D4D D8 lea ecx,dword ptr ss:[ebp-0x28]
00401D84 . F7DF neg edi
00401D86 . 1BFF sbb edi,edi
00401D88 . 47 inc edi
00401D89 . F7DF neg edi
00401D8B . FF15 5C314000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>; msvbvm50.__vbaFreeStr
00401D91 . 8D4D D4 lea ecx,dword ptr ss:[ebp-0x2C]
00401D94 . FF15 60314000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>; msvbvm50.__vbaFreeObj
00401D9A . 66:3BFE cmp di,si
00401D9D . 0F84 A0000000 je 00401E43
00401DA3 . FF15 2C314000 call dword ptr ds:[<&MSVBVM50.#534>] ; msvbvm50.rtcBeep
是否看到了一个很明显的字符串比较? __vbaStrcmp 我们在这里下F2断点,回到程序,点击【OK】按钮,查看Call前面的两个push,ecx指向的就是我们输入的字符串,下面的【SynTax 2oo1】就是一个固定的字符串,比较它们是否相等。好了,注册码是不是已经出来啦!它是固定的字符串【SynTax 2oo1】。
BY 笨笨D幸福
[反汇编练习] 160个CrackMe之008的更多相关文章
- [反汇编练习] 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全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
- Codeforces Round #360 (Div. 2) D. Remainders Game 中国剩余定理
题目链接: 题目 D. Remainders Game time limit per test 1 second memory limit per test 256 megabytes 问题描述 To ...
- 如何在Eclipse中配置Tomcat服务器
之前使用MyEclipse来开发Web应用,可以在MyEclipse中配置服务器,配置完后,直接运行服务器即可,很方便. 最近切换到Eclipse开发环境,发现使用Tomcat的方式不太一样,因此在此 ...
- 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...
- C# 客户端判断服务器连接已断开
问题描述: 在C# Socket编程中,服务器端已经断开连接(发送数据方),客户端接收服务器端发送数据,在客户端使用client.Recieve()中,服务器端断开连接,客户端任然显示已 ...
- IE6兼容inline-block的方法
或许有朋友会对IE不支持 display:inline-block 属性,表示疑问或者反对.说:“我在 IE 中对 a 或者 span 等内联元素使用 display:inline-block 一直是 ...
- 【递推】BZOJ 1088: [SCOI2005]扫雷Mine
1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2275 Solved: 1328[Submit][St ...
- 【POJ】【1704】Georgia and Bob
组合游戏 Nim游戏的一个变形 题解请看金海峰的博客 以下为引用: 分析:我们把棋子按位置升序排列后,从后往前把他们两两绑定成一对.如果总个数是奇数,就把最前面一个和边界(位置为0)绑定. 在同一对棋 ...
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- POJ 2029 Get Many Persimmon Trees(DP||二维树状数组)
题目链接 题意 : 给你每个柿子树的位置,给你已知长宽的矩形,让这个矩形包含最多的柿子树.输出数目 思路 :数据不是很大,暴力一下就行,也可以用二维树状数组来做. #include <stdio ...
- Android 通过程序添加桌面快捷方式
原理:通过代码向 Launcher 中的广播接收者发送广播来创建快捷图标. 首先要声明的权限是: <!--添加图标的权限--> <uses-permission android:na ...