【逆向分析】记录No.1:涉及注册流程分析,注册机,劫持补丁制作

  • A+

声明:

仅学习分析使用

信息收集

  • 将程序载入SDL Passolo 2018,寻找可利用信息

    1.png
    注册需填写两个数据:订单号、注册码

  • 分析:一个订单号对应一个注册码,并怀疑可重复使用(若未进行验证该订单号使用机器数量的话),订单号为变量,注册码信息随订单号而改变
  • 网络信息监测:软件注册时,监测请求信息与响应信息,为进一步分析做准备

    2.png

  • 分析:软件注册未进行网络验证,使用本地验证方式,但不排除后期进行网络验证,关键字:注册失败,请重新注册
  • 内存信息监测:查看敏感信息,与注册过程分析(原理:因一般程序运行时,会将数据加载在内存中)

    3.png

  • 找到敏感信息,进行信息验证
    36j5u499~f6242 注册失败
    036j5u499~f6242! 注册成功

    4.png

  • 分析:程序内部根据订单号信息生成一个注册码,注册时与用户输入的注册码进行对比操作,并数据写入内存可查看,并一单一码重新注册数据也不修改,重新填写同样的订单号,注册码信息无变化

    5.png
    language
    订单号:112233 注册码:036j5u499~f6242!

深入分析

  • 将程序载入x64dbg,进行调试分析

    6.png

  • 关键字搜索:F9运行程序,在所有模块中搜索关键字(简化分析流程)
    language
    注册码错误
    注册码正确

    7.png

  • 双击进入,调试分析,看到注册流程,反向调试,逆转注册流程(输入错误的注册信息,使其注册成功,输入正确的注册信息,使其注册失败)

    8.png
    language
    00510532 | E8 5D46EFFF | call jzyq.404B94 |
    00510537 | 8B95 68FFFFFF | mov edx,dword ptr ss:[ebp-98] | edx:EntryPoint
    0051053D | 58 | pop eax |
    0051053E | E8 D546EFFF | call jzyq.404C18 |
    00510543 | 0F85 A3000000 | jne jzyq.5105EC |
    00510549 | B8 D0065100 | mov eax,jzyq.5106D0 | 5106D0:"注册码正确,感谢你的注册!"
    0051054E | E8 D19CF2FF | call jzyq.43A224 |
    00510553 | A1 14BA5100 | mov eax,dword ptr ds:[51BA14] |
    00510558 | 8B00 | mov eax,dword ptr ds:[eax] |
    0051055A | 8B80 18030000 | mov eax,dword ptr ds:[eax+318] |
    00510560 | 8B80 08020000 | mov eax,dword ptr ds:[eax+208] |
    00510566 | 33D2 | xor edx,edx | edx:EntryPoint
    00510568 | E8 87ECF5FF | call jzyq.46F1F4 |
    0051056D | BA F4065100 | mov edx,jzyq.5106F4 | edx:EntryPoint, 5106F4:"****-软件已注册"
    00510572 | E8 D9EBF5FF | call jzyq.46F150 |
    00510577 | 8D85 50FFFFFF | lea eax,dword ptr ss:[ebp-B0] |
    0051057D | B9 10075100 | mov ecx,jzyq.510710 | 510710:"\hdwlz.dll"
    00510582 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | edx:EntryPoint, [ebp-4]:PEB.InheritedAddressSpace
    00510585 | E8 9645EFFF | call jzyq.404B20 |
    0051058A | 8B8D 50FFFFFF | mov ecx,dword ptr ss:[ebp-B0] |
    00510590 | B2 01 | mov dl,1 |
    00510592 | A1 C4264600 | mov eax,dword ptr ds:[4626C4] |
    00510597 | E8 D821F5FF | call jzyq.462774 |
    0051059C | 8BF0 | mov esi,eax |
    0051059E | 8D95 4CFFFFFF | lea edx,dword ptr ss:[ebp-B4] | edx:EntryPoint
    005105A4 | 8B83 10030000 | mov eax,dword ptr ds:[ebx+310] |
    005105AA | E8 810AF3FF | call jzyq.441030 |
    005105AF | 8B85 4CFFFFFF | mov eax,dword ptr ss:[ebp-B4] |
    005105B5 | 50 | push eax |
    005105B6 | B9 24075100 | mov ecx,jzyq.510724 | 510724:"setet567"
    005105BB | BA 38075100 | mov edx,jzyq.510738 | edx:EntryPoint, 510738:"sym"
    005105C0 | 8BC6 | mov eax,esi |
    005105C2 | 8B18 | mov ebx,dword ptr ds:[eax] | ebx:PEB.InheritedAddressSpace
    005105C4 | FF53 04 | call dword ptr ds:[ebx+4] | ebx+4:PEB.Mutant
    005105C7 | 8D85 48FFFFFF | lea eax,dword ptr ss:[ebp-B8] |
    005105CD | B9 44075100 | mov ecx,jzyq.510744 | 510744:"\hdw1z.dll"
    005105D2 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | edx:EntryPoint, [ebp-4]:PEB.InheritedAddressSpace
    005105D5 | E8 4645EFFF | call jzyq.404B20 |
    005105DA | 8B85 48FFFFFF | mov eax,dword ptr ss:[ebp-B8] |
    005105E0 | BA 02000000 | mov edx,2 | edx:EntryPoint
    005105E5 | E8 7E8FEFFF | call jzyq.409568 |
    005105EA | EB 24 | jmp jzyq.510610 |
    005105EC | B8 58075100 | mov eax,jzyq.510758 | 510758:"注册失败,请重新注册!"
    005105F1 | E8 2E9CF2FF | call jzyq.43A224 |
    005105F6 | 33D2 | xor edx,edx | edx:EntryPoint
    005105F8 | 8B83 10030000 | mov eax,dword ptr ds:[ebx+310] |
    005105FE | E8 5D0AF3FF | call jzyq.441060 |
    00510603 | 33D2 | xor edx,edx | edx:EntryPoint
    00510605 | 8B83 34030000 | mov eax,dword ptr ds:[ebx+334] |
    0051060B | E8 500AF3FF | call jzyq.441060 |
    00510610 | 33C0 | xor eax,eax |
    00510612 | 5A | pop edx | edx:EntryPoint

  • 分析:汇编指令:JNE 不等于时跳转,改成JE/JZ 等于跳转,这样就逆转了注册流程

    9.jpg

  • 运行查看效果,注意:汇编指令—— JE/JZ 等于转移 效果等同

    10.png

    11.png

  • 另一种效果,使其注册机制失效,不管输入的注册信息是否正确都显示注册成功
  • 跳转指令用nop填充 NOP 空操作
  • 12.jpg

    13.png

注册机编写

在关键判断上下断点,劫持注册流程,可以看到注册对比情况

14.png
EAX 01E0EA9C 11 为输入的注册码
EDX 01E0B93C 036j5u499~f6242! 为程序计算出的正确的注册码

- 思路编写程序提取出程序计算出的注册码
language
0051053E | E8 D546EFFF | call jzyq.404C18 |

  • 15.png

  • 运行注册机,程序运行,点击注册,填写订单号,注册码,点击注册,注册机机输出正确的注册码

    16.png

劫持补丁编写

  • 劫持补丁劫持该地址并替换其原始指令程序,到达反注册机制效果,需下列信息已制作劫持补丁
  • 被劫持地址信息

language
00510543 | 0F85 A3000000 | jne jzyq.5105EC |

17.png
- 模块基质:被劫持地址右键在内存布局中转到,查看主程序地址
language
地址=00400000
大小=00001000
页面信息=jzyq.exe
分配类型=IMG
当前保护=-R---
初始保护=ERWC-

18.png
```
指令:0F85 JNE
指令:0F84 JE

```
- 补丁数据如下

19.png
- 运行补丁,查看效果
-

21.png

相关推荐: 浅谈Shiro反序列化获取Key的方式

关于Apache Shiro反序列化   在shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露,导致反序列化的cookie可控,从而引发反序列化攻击。(理论上只要AES加密钥泄露…