XXXXXX注册分析 及 Baymax补丁制作
本帖最后由 姐又寡闻了 于 2019-6-6 22:29 编辑首先简单描述下该程序验证流程,然后主要谈下破解思路及补丁的制作。
软件KeyFile方式验证,启动时读取目录下的 wincmd.key,旧版本的Size为0x80,新版本为0x400。我们自己构造一个放于目录下。
wincmd.key 结构示意:
BLOCK0: 0x0 ~ 0x80 旧版本占位
BLOCK1: 0x80 ~ 0x100 待解密数据1
BLOCK2: 0x100 ~ 0x380 待使用
BLOCK3: 0x380 ~ 0x3F0 待解密数据2
BLOCK4: 0x3F0 ~ 0x400 哈希值MDX
wincmd.key 验证流程:
将 待解密数据1 进行解密,还原为 0x67 Byte数据,其格式为:
0x0~ 0x10 后0x57个数据的哈希值
0x10 ~ 0x13 订单号
0x13 ~ 0x17 用户数
0x17 ~ 0x19 区域简称
0x19 ~ End 用户名|公司|地址 字符串
这里看 v8.51a 的验证流程,这里验证 待解密数据1 用户数据的哈希值是否相同,若相同则解析用户数据并在软件中进行保存显示。
EDX 指向的地址即为Keyfile解密后的用户数据,EDX前0x10的数据为哈希值,偏移0x10处即为用户信息数据。
第一处验证:
004F5946 .8D85 60FAFFFF LEA EAX, DWORD PTR SS: ;用户数据结算结果
004F594C .8D95 70FEFFFF LEA EDX, DWORD PTR SS: ;用户数据解密后的数值
004F5952 .B9 10000000 MOV ECX, 10 ;哈希长度0x10(MD变形算法)
004F5957 .E8 DCFD2000 CALL TOTALCMD.00705738 ;比较用户信息的签名是否相同
004F595C .0F84 AE000000 JE TOTALCMD.004F5A10
004F5962 .33DB XOR EBX, EBX
004F5964 .33D2 XOR EDX, EDX
提取特征码:B9 10 00 00 00 E8 ?? ?? ?? ?? 0F 84 ?? ?? ?? ?? 33 DB
第二处验证:
004F5E19 .8D85 60FAFFFF LEA EAX, DWORD PTR SS: ;待解密数据2 计算的HASH值
004F5E1F .8D95 60FEFFFF LEA EDX, DWORD PTR SS: ;HASH 值
004F5E25 .B9 10000000 MOV ECX, 10
004F5E2A .E8 51F92000 CALL TOTALCMD.00705780
004F5E2F .74 02 JE SHORT TOTALCMD.004F5E33
004F5E31 .33DB XOR EBX, EBX ;若失败 EBX置零
004F5E33 >8B85 FCFEFFFF MOV EAX, DWORD PTR SS:
004F5E39 .E8 1ECFF0FF CALL TOTALCMD.00402D5C
004F5E3E .8B85 F8FEFFFF MOV EAX, DWORD PTR SS:
004F5E44 .E8 13CFF0FF CALL TOTALCMD.00402D5C
004F5E49 .8B85 F4FEFFFF MOV EAX, DWORD PTR SS:
004F5E4F .E8 08CFF0FF CALL TOTALCMD.00402D5C
004F5E54 .881D 10407100 MOV BYTE PTR DS:, BL ;将布尔值 赋给代表程序是否注册的全局变量
004F5E5A .A1 0C407100 MOV EAX, DWORD PTR DS:
提取特征码:B9 10 00 00 00 E8 ?? ?? ?? ?? 74 02 33 DB
我们爆破的思路就是讲解密后的 0x67 Byte数据进行替换,然后跳过第二段验证使全局变量赋值置为TRUE。
Baymax Patch Tools 通过劫持DLL加载功能模块PYG.DLL,功能模块提供异常断点功能,可以模拟OD的下断点并在断点地址修改寄存器、标志寄存器及寄存器指向的内存,我们通过该实例来演示下Baymax补丁工具的使用:
第一步,我们替换掉解密后的用户数据,我们在 004F5957CALL00705738 地址下硬件断点。软件无壳,所以通过特征码来直接定位地址,偏移值为5。若有壳,可以HOOK API 待解码后补丁,也可以通过RVA直接下断点。向 EDX + 0x10 的地址出写入我们构造的用户数据:订单号就是今年5.4教学的日期,用户数10000。区域FBI好了,然后是用户信息:03 B6 13 10 27 00 00 46 42 49 4E 69 73 79 7C 42 61 79 6D 61 78 20 50 61 74 63 68 20 54 6F 6F 6C 73 00
第二步,通过第一处的MDX数据校验,这里我们选择修改标志寄存器的方法:特征码偏移值为 0xA,修改 ZF 为 1
第三步,通过第二处的MDX数据校验,这里我们换一种修改方案,将寄存器EAX的数值修改为EDX,即让其比较相同的数据。当然也可以直接将EDX内存中0x10的HEX数值复制到EAX指向的内存。前两处采用默认的硬件断点(INT3断点就没有数量限制了^_^),这里我们试一下INT3的效果:
我们生成调试版的补丁,由于补丁采用的特征码动态寻址,所以直接对8.52a打补丁,我们打开 DebugView 来查看补丁执行过程的输出信息。
00000001 0.00000000 version.dll Has Auto Inject ...
00000002 0.00447302 进程加载:D:\Program Files (x86)\Total Commander\TOTALCMD.EXE
00000003 0.00614219 Proc TOTALCMD.EXE Module TOTALCMD.EXE Name TOTALCMD.EXE
00000004 0.00647143 执行断点补丁条目
00000005 0.00654861 执行特征码地址补丁
00000006 0.12728654 Path Rva: F5F62
00000007 0.12735879 断点补丁地址 004F5F67 补丁数据 EDX,10:0,1,0:I,H,03 B6 13 10 27 00 00 46 42 49 4E 69 73 79 7C 42 61 79 6D 61 78 20 50 61 74 63 68 20 54 6F 6F 6C 73 00
00000008 0.12738301 设置断点
00000009 0.12755503 解析异常断点数据成功 ThreadId: 2624
00000010 0.12763917 设置VEH断点回调函数成功!
00000011 0.12769952 设置硬件断点 004F5F67 Type DR0 DR7 1
00000012 0.12778121 获取线程硬件断点成功 004F5F67
00000013 0.12810963 设置 NsSetUnhandledExceptionFilter OK...
00000014 0.12823197 OEP 007066EC, OPCODE 55
00000015 0.12832105 设置硬件断点成功 DR0
00000016 0.12840521 执行特征码地址补丁
00000017 0.15174572 Path Rva: F5F62
00000018 0.15184383 断点补丁地址 004F5F6C 补丁数据 ZF:0,1,0:1
00000019 0.15192758 设置断点
00000020 0.15203308 解析异常断点数据成功 ThreadId: 2624
00000021 0.15212463 设置硬件断点 004F5F6C Type DR1 DR7 5
00000022 0.15221822 获取线程硬件断点成功 004F5F6C
00000023 0.15230033 设置 NsSetUnhandledExceptionFilter OK...
00000024 0.15237996 设置硬件断点成功 DR1
00000025 0.15246207 执行特征码地址补丁
00000026 0.17538138 Path Rva: F6435
00000027 0.17547211 断点补丁地址 004F643A 补丁数据 EAX:0,1,1:R,D,EDX
00000028 0.17555422 设置断点
00000029 0.17565356 解析异常断点数据成功 ThreadId: 2624
00000030 0.17573401 设置INT3断点
00000031 0.17581612 设置 NsSetUnhandledExceptionFilter OK...
00000032 0.17592737 设置 0xCC 004F643A
00000033 0.17601359 设置INT3断点成功 004F643A
00000034 0.17748858 End StartHook()
00000035 0.17759737 补丁设置初始化完成,若有HOOK或下断点操作,将会在下方进行打印输出。
00000036 0.17770000 若设置断点无输出信息,尝试将断点修改为INT3类型,OD附加查看地址数据是否仍为CC。
00000037 0.17779976 若为CC则说明要么未执行,要么设置断点前已执行(劫持DLL加载过晚请换注入模式)。
00000038 0.18012618 Recover Oep
00000039 0.52538264 找到 DrX 对应的 1 处断点记录
00000040 0.52546722 触发硬件断点 ThreadId 2624 2624 Type: 0 0
00000041 0.52558911 当前断点符合触发条件并进行处理 004F5F67
00000042 0.52569669 NS_BREAK_MEMORY 类型 ... 004F5F67
00000043 0.52584118 DealException 004F5F67
00000044 0.52595121 找到 DrX 对应的 1 处断点记录
00000045 0.52603412 触发硬件断点 ThreadId 2624 2624 Type: 1 1
00000046 0.52611089 当前断点符合触发条件并进行处理 004F5F6C
00000047 0.52618766 NS_BREAK_FLAG 类型 ... 004F5F6C
00000048 0.52626276 DealException 004F5F6C
00000049 0.52948332 INT3断点 恢复当前OpCode 004F643A E8
00000050 0.52958840 当前INT3断点 符合触发条件进行处理 004F643A
00000051 0.52967215 NS_BREAK_REG 类型 ... 004F643A
00000052 0.52975017 INT3断点 执行一次
00000053 0.52982897 DealInt3Exception 004F643A
00000054 0.52991271 ThreadId: 2624 DR0 00000000 DR1 00000000 DR2 00000000 DR3 00000000 DR7 00000005
三处补丁数据已正确执行,由于未修改程序本身,也未修改进程的代码(INT3执行后会自动恢复原指令),不会触发程序自身的校验机制。补丁方式为特征码定位关键点,在作者不修改验证代码的前提下,之前和今后的版本也均适用,安装新版本直接运行仍是注册版。点关于查看注册信息:
安装程序及补丁下载:
**** Hidden Message ***** 隔壁论坛超级大牛先支持 再来慢慢看!{:1_931:} 谢谢超级大神分享,第一次前排这么近接近大神 好東西
來更新了 隔壁论坛超级大牛先支持 再来慢慢看 赞一个,要是有视频就更好了。 有好几年没有关注Nisy大牛的帖子了。 这可是绝对的精品,也绝对的好东西,十多年来我一直在Total Commander 补丁工具好强大, 很详细,感谢分享
页:
[1]
2