逆向破解之160个CrackMe —— 008-009
CrackMe —— 008
160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序
CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。
来源 <-点击查看
编号 | 作者 | 保护方式 |
008 | Andrénalin | Serial |
009 | Andrénalin | Name/Serial |
工具
x32dbg
KeyMake
VB Decompiler Pro
peid
开始破解之旅
ON.1
首先使用x32dbg打开程序搜索字符串
我们看到有一个 “SuCCESFul !" 的字符串,从字面上猜测应该是输入正确的Key之后所跳转的地方
我们点进进入来地址,向上翻看,来到该函数的起始点并设置断点
00401CD0 | 55 | push ebp | 函数起始点
00401CD1 | 8BEC | mov ebp,esp |
00401CD3 | 83EC 0C | sub esp,0xC |
00401CD6 | 68 16104000 | push <JMP.&__vbaExceptHandler> |
00401CDB | 64:A1 00000000 | mov eax,dword ptr fs:[0] |
在输入框内输入任意数据,点击OK按钮,停在了我们的断点处
单步F8向下,同时观察右边寄存器窗口
00401D70 | 8B4D D8 | mov ecx,dword ptr ss:[ebp-0x28] | [ebp-28]:L"1234" 我们输入的数据
00401D73 | 51 | push ecx | ecx:L"1234"
00401D74 | 68 541A4000 | push andrénalin.1.401A54 | 401A54:L"SynTaX 2oo1" 疑似Key
00401D79 | FF15 08314000 | call dword ptr ds:[<&__vbaStrCmp>] |
00401D7F | 8BF8 | mov edi,eax |
00401D81 | 8D4D D8 | lea ecx,dword ptr ss:[ebp-0x28] | [ebp-28]:L"1234"
00401D84 | F7DF | neg edi |
出现了一串疑似Key的字符串
我们将该串放入输入框点击OK
提示我们破解成功
ON.2
爆破方式破解
从新载入程序,来到我们的搜索到字符串的地址处,向上查看
00401D91 | 8D4D D4 | lea ecx,dword ptr ss:[ebp-0x2C] |
00401D94 | FF15 60314000 | call dword ptr ds:[<&__vbaFreeObj>] |
00401D9A | 66:3BFE | cmp di,si |
00401D9D | 0F84 A0000000 | je andrénalin.1.401E43 | 判断Key正确跳转处
00401DA3 | FF15 2C314000 | call dword ptr ds:[<&rtcBeep>] |
00401DA9 | 8B3D 48314000 | mov edi,dword ptr ds:[<&__vbaVarDup>] |
00401DAF | B9 04000280 | mov ecx,0x80020004 |
00401DB4 | 894D 9C | mov dword ptr ss:[ebp-0x64],ecx |
00401DB7 | B8 0A000000 | mov eax,0xA | A:'\n'
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] |
我们看到最近的一个跳转跳过了正确提示处,此处疑似为判断Key正确跳转处,我们将其NOP,再次在输入框内输入任意数据,点击OK
此时我们已经成功爆破~
内存补丁方式
从之前的分析我们可以得知
00401D73 | 51 | push ecx | ecx:L"08"
00401D74 | 68 541A4000 | push andrénalin.1.401A54 | 401A54:L"SynTaX 2oo1" 此处压入了401A54这个地址 ,该地址为我们的Key秘钥地址
00401D79 | FF15 08314000 | call dword ptr ds:[<&__vbaStrCmp>] |
首先打开我们的KeyMake,载入008号程序,打开内存注册机,我们添加数据
这里我们需要在选择内存方式 在内存地址处填写401A54 ,同时选择宽字符串
点击添加 -> 生成
打开我们生成后的文件,输入任意数据,Key立即显示了出来
CrackMe —— 009
ON.1
007和006破解方式一样
首先搜索字符串,我们看到了错误提示那个字符串,很长很长... 进入地址004023E1向上翻看来到函数起始处,并设置断点
00401FF0 | 55 | push ebp | 函数起始处
00401FF1 | 8BEC | mov ebp,esp |
00401FF3 | 83EC 0C | sub esp,0xC |
00401FF6 | 68 26104000 | push <JMP.&__vbaExceptHandler> |
00401FFB | 64:A1 00000000 | mov eax,dword ptr fs:[0] |
00402001 | 50 | push eax |
00402002 | 64:8925 00000000 | mov dword ptr fs:[0],esp |
00402009 | 81EC 18010000 | sub esp,0x118 |
0040200F | 53 | push ebx |
在输入框内输入任意数据,点击OK按钮,停在了我们的断点处,同上一个程序一样,我们单步向下走,同时观察右边寄存器窗口
在单步走的过程中,我们发现一处调用call疑似对比Key,call 的名字为vabVarTestEq,其中Eq一般为对比的缩写
进入这个call
0F10B99E | FF7424 08 | push dword ptr ss:[esp+0x8] |
0F10B9A2 | FF7424 08 | push dword ptr ss:[esp+0x8] |
0F10B9A6 | 6A 00 | push 0x0 |
0F10B9A8 | E8 E74AFFFF | call msvbvm50.F100494 |
0F10B9AD | 8B0485 D4C50E0F | mov eax,dword ptr ds:[eax*4+0xF0EC5D4] |
0F10B9B4 | C2 0800 | ret 0x8 |
发现内部还有一个call,再次进入单步走
0F10062F | 8B55 0C | mov edx,dword ptr ss:[ebp+0xC] |
0F100632 | FF73 08 | push dword ptr ds:[ebx+0x8] | [ebx+8]:L"987654321" 我们输入的Key
0F100635 | FF72 08 | push dword ptr ds:[edx+0x8] | [edx+8]:L"185-8518-500" 要对比的Key
0F100638 | FF75 08 | push dword ptr ss:[ebp+0x8] |
0F10063B | E8 BC3FF0FF | call msvbvm50.F0045FC |
0F100640 | 0FBFF0 | movsx esi,ax |
发现一处疑似真实Key的地址,我们输入这个Key来测试一下
bingo~答案正确我们来看看这个是如何计算的
我们使用peid打开程序,发现程序使用VB写的
用我们的VB Decompiler 程序打开009号软件
VB Decompiler:VB Decompiler是一款VB反编译软件,可以直接看到VB程序的源代码
此时007号程序的验证代码已经出现在了我们的面前
Dim Me As Me
loc_00402092: var_58 = Text2.Text
loc_004020CA: var_44 = var_58
loc_00402126: For var_24 = 1 To Len(var_44) Step 1
loc_00402132:
loc_00402134: If var_108 = 0 Then GoTo loc_004021D6
loc_00402169: var_58 = CStr(Mid(var_44, CLng(var_24), 1))
loc_00402176: var_B4 = Asc(var_58)
loc_00402195: var_ret_2 = var_34 + Asc(var_58)
loc_004021A0: var_34 = var_ret_2
loc_004021CB: Next var_24
loc_004021D1: GoTo loc_00402132
loc_004021D6: 'Referenced from: 00402134
loc_00402204: var_34 = var_34 * 1234567890
loc_0040222F: call ebx(8, 00000001h, 00000004h, var_34, var_108, var_118, Me, undef 'Ignore this '__vbaFreeVarList, %ecx = %S_edx_S, 004041A0h)
loc_00402254: call ebx(8, 00000001h, 00000009h, var_34)
loc_00402276: var_58 = Text1.Text
loc_00402298: var_64 = var_58
loc_004022CB: If (var_58 = var_34) = 0 Then GoTo loc_00402391
loc_004022D1: Beep
通过不断循环Name文本框内输入的用户名截取每个字符计算其ASCII码不断相加 最后相加的和乘于1234567890
004021E5 | C785 5CFFFFFF D2029649 | mov dword ptr ss:[ebp-0xA4],0x499602D2 | [ebp-A4]:L"-" 第四位置换为"-"
004021EF | C785 54FFFFFF 03000000 | mov dword ptr ss:[ebp-0xAC],0x3 |
004021F9 | FF15 5C414000 | call dword ptr ds:[<&__vbaVarMul>] |
004021FF | 8BD0 | mov edx,eax |
00402201 | 8D4D CC | lea ecx,dword ptr ss:[ebp-0x34] |
00402204 | FFD6 | call esi |
00402206 | 8B1D A0414000 | mov ebx,dword ptr ds:[<&__vbaMidStmtVar>] |
0040220C | 8D4D CC | lea ecx,dword ptr ss:[ebp-0x34] |
0040220F | 51 | push ecx |
00402210 | 6A 04 | push 0x4 |
00402212 | 8D95 54FFFFFF | lea edx,dword ptr ss:[ebp-0xAC] |
00402218 | 6A 01 | push 0x1 |
0040221A | 52 | push edx |
0040221B | C785 5CFFFFFF 341C4000 | mov dword ptr ss:[ebp-0xA4],andrénalin.2.401C34 | [ebp-A4]:L"-", 401C34:L"-" 第九位置换为"-"
00402225 | C785 54FFFFFF 08000000 | mov dword ptr ss:[ebp-0xAC],0x8 |
0040222F | FFD3 | call ebx |
计算的结果每4位置换为 "-"
Python伪代码
sun = 0
for i in "123":
sun += ord(i)
sun *= 1234567890
sun_str = str(sun)
print(sun_str[:3] + '-' + sun_str[4:8] + '-' + sun_str[9:])
ON.2
爆破方式破解
004022C2 | FF15 00414000 | call dword ptr ds:[<&__vbaFreeVar>] |
004022C8 | 66:85DB | test bx,bx |
004022CB | 0F84 C0000000 | je andrénalin.2.402391 |
004022D1 | FF15 74414000 | call dword ptr ds:[<&rtcBeep>] |
004022D7 | 8B1D 98414000 | mov ebx,dword ptr ds:[<&__vbaVarDup>] |
在错误提示字符串上放最近的一个跳转,我们发现跳转跳过了正确提示信息来到了错误信息,将其NOP,输入任意数据,点击OK
爆破成功,成功弹出正确信息
逆向破解之160个CrackMe —— 008-009的更多相关文章
- 逆向破解之160个CrackMe —— 001
CrackMe —— 001 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 002-003
CrackMe —— 002 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 004-005
CrackMe —— 004 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 013
CrackMe —— 013 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 014
CrackMe —— 014 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 016
CrackMe —— 016 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 017
CrackMe —— 017 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 018
CrackMe —— 018 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- 逆向破解之160个CrackMe —— 025
CrackMe —— 025 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
随机推荐
- Python的网页解析库-PyQuery
PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...
- XGBoost 原理及应用
xgboost原理及应用--转 1.背景 关于xgboost的原理网络上的资源很少,大多数还停留在应用层面,本文通过学习陈天奇博士的PPT地址和xgboost导读和实战 地址,希望对xgboost ...
- 防火墙阻止了虚拟机与主机之间互相ping通解决方案
1. 打开WIN10防火墙,选择高级设置 2.入站规则 3.找到配置文件类型为“公用”的“文件和打印共享(回显请求 – ICMPv4-In)”规则,设置为允许. 如果上面步骤没有问题还ping不通,可 ...
- dubbo调用服务时,利用zookeeper实现本地动态负载均衡
利用了zookeeper的临时节点的特点,生产者将自己的服务信息注册到zookeeper当中,消费者去zookeeper当中取出服务信息的集合,本地实现负载均衡 public class TestCr ...
- 【转帖】全网最通俗易懂的Kafka入门
全网最通俗易懂的Kafka入门 http://www.itpub.net/2019/12/04/4597/ 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://g ...
- IUrlHelper ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of ...
- ACM算法锦集
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...
- MySQL单机优化---分表、分区、分库
一.分表: 水平分表:根据条件把数据分为N个表(例如:商品表中有月份列,则可以按月份进行水平分表). 使用场景:一张表中数据太多,查询效率太慢. 当需要同时查询被水平分表的多张表时: 在两条SQL语句 ...
- XML中的XPATH和DTD
大家好,乐字节小乐又来了,上次给大家说道的是XML解析,这次接着讲述XML文档中的语言:XPATH.DTD 一.先来说说XPATH 1.XPATH 概念 XPath 是一门在 XML 文档中查找信息的 ...
- day17——序列化、os、sys、hashlib、collections
day17 序列化 json 两组4个方法: 1.dumps(序列化) -- loads(反序列) dumps(list):将对象转换成字符串 loads(str):将字符串转换成对象 list--s ...