飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 103601|回复: 253

[原创] Total Commander 8.52a 注册分析 及 Baymax补丁制作

  [复制链接]

该用户从未签到

发表于 2016-6-5 05:17:03 | 显示全部楼层 |阅读模式
首先简单描述下该程序验证流程,然后主要谈下破解思路及补丁的制作。

软件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 ~ 0x12 订单号
0x13 ~ 0x17 用户数
0x17 ~ 0x19 区域简称
0x19 ~ End   用户名|公司|地址 字符串

这里看 v8.51a 的验证流程,这里验证 待解密数据1 用户数据的哈希值是否相同,若相同则解析用户数据并在软件中进行保存显示。
EDX 指向的地址即为Keyfile解密后的用户数据,EDX前0x10的数据为哈希值,偏移0x10处即为用户信息数据。

第一处验证:


  1. 004F5946   .  8D85 60FAFFFF    LEA     EAX, DWORD PTR SS:[EBP-5A0]      ;  用户数据结算结果
  2. 004F594C   .  8D95 70FEFFFF    LEA     EDX, DWORD PTR SS:[EBP-190]      ;  用户数据解密后的数值
  3. 004F5952   .  B9 10000000      MOV     ECX, 10                          ;  哈希长度0x10(MD变形算法)
  4. 004F5957   .  E8 DCFD2000      CALL    TOTALCMD.00705738                ;  比较用户信息的签名是否相同
  5. 004F595C   .  0F84 AE000000    JE      TOTALCMD.004F5A10
  6. 004F5962   .  33DB             XOR     EBX, EBX
  7. 004F5964   .  33D2             XOR     EDX, EDX

  8. 提取特征码:B9 10 00 00 00 E8 ?? ?? ?? ?? 0F 84 ?? ?? ?? ?? 33 DB
复制代码


第二处验证:


  1. 004F5E19   .  8D85 60FAFFFF    LEA     EAX, DWORD PTR SS:[EBP-5A0]      ;  待解密数据2 计算的HASH值
  2. 004F5E1F   .  8D95 60FEFFFF    LEA     EDX, DWORD PTR SS:[EBP-1A0]      ;  HASH 值
  3. 004F5E25   .  B9 10000000      MOV     ECX, 10
  4. 004F5E2A   .  E8 51F92000      CALL    TOTALCMD.00705780
  5. 004F5E2F   .  74 02            JE      SHORT TOTALCMD.004F5E33
  6. 004F5E31   .  33DB             XOR     EBX, EBX                         ;  若失败 EBX置零
  7. 004F5E33   >  8B85 FCFEFFFF    MOV     EAX, DWORD PTR SS:[EBP-104]
  8. 004F5E39   .  E8 1ECFF0FF      CALL    TOTALCMD.00402D5C
  9. 004F5E3E   .  8B85 F8FEFFFF    MOV     EAX, DWORD PTR SS:[EBP-108]
  10. 004F5E44   .  E8 13CFF0FF      CALL    TOTALCMD.00402D5C
  11. 004F5E49   .  8B85 F4FEFFFF    MOV     EAX, DWORD PTR SS:[EBP-10C]
  12. 004F5E4F   .  E8 08CFF0FF      CALL    TOTALCMD.00402D5C
  13. 004F5E54   .  881D 10407100    MOV     BYTE PTR DS:[714010], BL         ;  将布尔值 赋给代表程序是否注册的全局变量
  14. 004F5E5A   .  A1 0C407100      MOV     EAX, DWORD PTR DS:[71400C]

  15. 提取特征码:B9 10 00 00 00 E8 ?? ?? ?? ?? 74 02 33 DB
复制代码



我们爆破的思路就是讲解密后的 0x67 Byte数据进行替换,然后跳过第二段验证使全局变量赋值置为TRUE。

Baymax Patch Tools 通过劫持DLL加载功能模块PYG.DLL,功能模块提供异常断点功能,可以模拟OD的下断点并在断点地址修改寄存器、标志寄存器及寄存器指向的内存,我们通过该实例来演示下Baymax补丁工具的使用:

第一步,我们替换掉解密后的用户数据,我们在 004F5957  CALL  00705738 地址下硬件断点。软件无壳,所以通过特征码来直接定位地址,偏移值为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

01.png

第二步,通过第一处的MDX数据校验,这里我们选择修改标志寄存器的方法:特征码偏移值为 0xA,修改 ZF 为 1

02.png

第三步,通过第二处的MDX数据校验,这里我们换一种修改方案,将寄存器EAX的数值修改为EDX,即让其比较相同的数据。当然也可以直接将EDX内存中0x10的HEX数值复制到EAX指向的内存。前两处采用默认的硬件断点(INT3断点就没有数量限制了^_^),这里我们试一下INT3的效果:

03.png


我们生成调试版的补丁,由于补丁采用的特征码动态寻址,所以直接对8.52a打补丁,我们打开 DebugView 来查看补丁执行过程的输出信息。


  1. 00000001        0.00000000        [7948] [NSDLL]version.dll Has Auto Inject ...         
  2. 00000002        0.00447302        [7948] [BAYMAX] 进程加载:D:\Program Files (x86)\Total Commander\TOTALCMD.EXE        
  3. 00000003        0.00614219        [7948] [BAYMAX] Proc TOTALCMD.EXE Module TOTALCMD.EXE Name TOTALCMD.EXE        
  4. 00000004        0.00647143        [7948] [BAYMAX] 执行断点补丁条目        
  5. 00000005        0.00654861        [7948] [BAYMAX] 执行特征码地址补丁         
  6. 00000006        0.12728654        [7948] [BAYMAX] Path Rva: F5F62        
  7. 00000007        0.12735879        [7948] [BAYMAX] 断点补丁地址 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        
  8. 00000008        0.12738301        [7948] [BAYMAX] 设置断点         
  9. 00000009        0.12755503        [7948] [BAYMAX] 解析异常断点数据成功 ThreadId: 2624        
  10. 00000010        0.12763917        [7948] [BAYMAX] 设置VEH断点回调函数成功!        
  11. 00000011        0.12769952        [7948] [BAYMAX] 设置硬件断点 004F5F67 Type DR0 DR7 1        
  12. 00000012        0.12778121        [7948] [BAYMAX] 获取线程硬件断点成功 004F5F67        
  13. 00000013        0.12810963        [7948] [BAYMAX] 设置 NsSetUnhandledExceptionFilter OK...         
  14. 00000014        0.12823197        [7948] [BAYMAX] OEP 007066EC, OPCODE 55        
  15. 00000015        0.12832105        [7948] [BAYMAX] 设置硬件断点成功 DR0         
  16. 00000016        0.12840521        [7948] [BAYMAX] 执行特征码地址补丁         
  17. 00000017        0.15174572        [7948] [BAYMAX] Path Rva: F5F62        
  18. 00000018        0.15184383        [7948] [BAYMAX] 断点补丁地址 004F5F6C 补丁数据 ZF:0,1,0:1        
  19. 00000019        0.15192758        [7948] [BAYMAX] 设置断点         
  20. 00000020        0.15203308        [7948] [BAYMAX] 解析异常断点数据成功 ThreadId: 2624        
  21. 00000021        0.15212463        [7948] [BAYMAX] 设置硬件断点 004F5F6C Type DR1 DR7 5        
  22. 00000022        0.15221822        [7948] [BAYMAX] 获取线程硬件断点成功 004F5F6C        
  23. 00000023        0.15230033        [7948] [BAYMAX] 设置 NsSetUnhandledExceptionFilter OK...         
  24. 00000024        0.15237996        [7948] [BAYMAX] 设置硬件断点成功 DR1         
  25. 00000025        0.15246207        [7948] [BAYMAX] 执行特征码地址补丁         
  26. 00000026        0.17538138        [7948] [BAYMAX] Path Rva: F6435        
  27. 00000027        0.17547211        [7948] [BAYMAX] 断点补丁地址 004F643A 补丁数据 EAX:0,1,1:R,D,EDX        
  28. 00000028        0.17555422        [7948] [BAYMAX] 设置断点         
  29. 00000029        0.17565356        [7948] [BAYMAX] 解析异常断点数据成功 ThreadId: 2624        
  30. 00000030        0.17573401        [7948] [BAYMAX] 设置INT3断点         
  31. 00000031        0.17581612        [7948] [BAYMAX] 设置 NsSetUnhandledExceptionFilter OK...         
  32. 00000032        0.17592737        [7948] [BAYMAX] 设置 0xCC 004F643A         
  33. 00000033        0.17601359        [7948] [BAYMAX] 设置INT3断点成功 004F643A         
  34. 00000034        0.17748858        [7948] [BAYMAX] End StartHook()         
  35. 00000035        0.17759737        [7948] [BAYMAX] 补丁设置初始化完成,若有HOOK或下断点操作,将会在下方进行打印输出。         
  36. 00000036        0.17770000        [7948] [BAYMAX] 若设置断点无输出信息,尝试将断点修改为INT3类型,OD附加查看地址数据是否仍为CC。        
  37. 00000037        0.17779976        [7948] [BAYMAX] 若为CC则说明要么未执行,要么设置断点前已执行(劫持DLL加载过晚请换注入模式)。        
  38. 00000038        0.18012618        [7948] [BAYMAX] Recover Oep        
  39. 00000039        0.52538264        [7948] [BAYMAX] 找到 DrX 对应的 1 处断点记录         
  40. 00000040        0.52546722        [7948] [BAYMAX] 触发硬件断点 ThreadId 2624 2624 Type: 0 0        
  41. 00000041        0.52558911        [7948] [BAYMAX] 当前断点符合触发条件并进行处理 004F5F67         
  42. 00000042        0.52569669        [7948] [BAYMAX] NS_BREAK_MEMORY 类型 ... 004F5F67         
  43. 00000043        0.52584118        [7948] [BAYMAX] DealException 004F5F67        
  44. 00000044        0.52595121        [7948] [BAYMAX] 找到 DrX 对应的 1 处断点记录         
  45. 00000045        0.52603412        [7948] [BAYMAX] 触发硬件断点 ThreadId 2624 2624 Type: 1 1        
  46. 00000046        0.52611089        [7948] [BAYMAX] 当前断点符合触发条件并进行处理 004F5F6C         
  47. 00000047        0.52618766        [7948] [BAYMAX] NS_BREAK_FLAG 类型 ... 004F5F6C         
  48. 00000048        0.52626276        [7948] [BAYMAX] DealException 004F5F6C        
  49. 00000049        0.52948332        [7948] [BAYMAX] INT3断点 恢复当前OpCode 004F643A E8        
  50. 00000050        0.52958840        [7948] [BAYMAX] 当前INT3断点 符合触发条件进行处理 004F643A         
  51. 00000051        0.52967215        [7948] [BAYMAX] NS_BREAK_REG 类型 ... 004F643A         
  52. 00000052        0.52975017        [7948] [BAYMAX] INT3断点 执行一次        
  53. 00000053        0.52982897        [7948] [BAYMAX] DealInt3Exception 004F643A
  54. 00000054        0.52991271           [7948] [BAYMAX] ThreadId: 2624 DR0 00000000 DR1 00000000 DR2 00000000 DR3 00000000 DR7 00000005
复制代码



三处补丁数据已正确执行,由于未修改程序本身,也未修改进程的代码(INT3执行后会自动恢复原指令),不会触发程序自身的校验机制。补丁方式为特征码定位关键点,在作者不修改验证代码的前提下,之前和今后的版本也均适用,安装新版本直接运行仍是注册版。点关于查看注册信息:

4.png



安装程序及补丁下载:
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 12威望 +105 飘云币 +93 收起 理由
sw586 + 1 + 1 PYG有你更精彩!
gfjykldd + 4 PYG有你更精彩!
netle8 + 4 + 4 很给力!
jing_8276 + 4 要是能注册成自己的名字就更完美了
lucky_789 + 20 + 20 一个了不起的神器!
linuxchao + 4 + 4 很给力!
gagmeng + 20 + 20 校长威武,大白威武。
Bu弃 + 4 赞一个!
yosen2001 + 20 + 20 很给力!
cxqdly + 2 PYG有你更精彩!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2020-7-31 08:47
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2016-6-5 10:26:42 | 显示全部楼层
    楼主的大作,感谢。
    PYG19周年生日快乐!
    回复 支持 0 反对 1

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-17 13:00
  • 签到天数: 975 天

    [LV.10]以坛为家III

    发表于 2016-6-5 07:08:56 | 显示全部楼层
    感谢提供,必须支持啦!!...
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-17 16:53
  • 签到天数: 63 天

    [LV.6]常住居民II

    发表于 2016-6-5 07:58:26 | 显示全部楼层
    这个就很牛了 关键是大周末的还这么早。。。。。。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-7 15:25
  • 签到天数: 442 天

    [LV.9]以坛为家II

    发表于 2016-6-5 08:01:42 | 显示全部楼层
    辛苦了,最近特别拼啊,多注意休息。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 09:58
  • 签到天数: 1918 天

    [LV.Master]伴坛终老

    发表于 2016-6-5 08:03:29 | 显示全部楼层
    本帖最后由 月无影 于 2016-6-5 08:04 编辑

    感谢校长分享,学习了.X64位的能用吗?

    点评

    目前只能补丁32位的程序,和系统无关。64位的程序后续会支持。  详情 回复 发表于 2016-6-5 11:53
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 09:19
  • 签到天数: 2783 天

    [LV.Master]伴坛终老

    发表于 2016-6-5 08:06:00 | 显示全部楼层
    校长棒极了,跟着校长再做一遍!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 2577 天

    [LV.Master]伴坛终老

    发表于 2016-6-5 08:07:52 | 显示全部楼层
    这个资源管理工具  没有用过,试试
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-1-1 22:13
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2016-6-5 08:33:37 | 显示全部楼层
    确实好牛啊!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表