飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3760|回复: 10

[原创] Baymax64 过 VMP 加壳保护的程序

[复制链接]
  • TA的每日心情
    开心
    2016-11-3 14:57
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2023-9-28 12:50:24 | 显示全部楼层 |阅读模式
    本帖最后由 PYG官方论坛 于 2023-9-28 16:52 编辑

    有很多人在咨询工具的使用方案,这里通过我写的一个 CrackMe 来演示几种异常补丁方案的使用。

    源码中的判断函数:



    1. DWORD __stdcall NsCheckInputThread( LPVOID lpThreadParameter )
    2. {
    3.         HWND hWnd = (HWND)lpThreadParameter;
    4.         CHAR szBuffer[MAX_PATH] = {0};
    5.         int nStrLen = GetDlgItemTextA( hWnd, IDC_EDIT, szBuffer, MAX_PATH );
    6.         if ( nStrLen ){
    7.                 unsigned char szSrc[0x10];
    8.                 unsigned char szDest[0x10];
    9.                 CalcMD5( (unsigned char*)szBuffer, nStrLen, szSrc );

    10.                 *(PDWORD)((PDWORD)szDest + 0) = 0x7de2f924;
    11.                 *(PDWORD)((PDWORD)szDest + 1) = 0x058698b1;
    12.                 *(PDWORD)((PDWORD)szDest + 2) = 0xe2c6cdc6;
    13.                 *(PDWORD)((PDWORD)szDest + 3) = 0x02a1bd7b;

    14.                 if( memcmp( szSrc, szDest, 0x10 ) == 0 ){
    15.                         MessageBox( hWnd, L"Success!",L"Info", 0);
    16.                         return 1;
    17.                 }
    18.         }
    19.         MessageBox( hWnd, L"Error!",L"Info", 0);
    20.         return 0;
    21. }

    复制代码


    我们编译源码后,对x64产物 使用 VMP3.8 加壳保护,比较函数未调用 VMP 保护,调试器载入,搜索字符串来到比较关键点:

    400.png

    用 Baymax 对付加壳的程序,第一步要先找到壳的解码时机,通俗来说,就是要通过 HOOK API 等方式等待被补丁的地址数据解码,如果使用 HOOK API 方案,可以调用壳自身使用的API,或者在执行到模块被补丁地址前调用过的API均可。由于这个 CrackMe 获取窗口输入文本调用的 API 为 GetWindowTextA,所以我们就直接 HOOK 这个 API了,这样加任何壳补丁方案都可以通杀了。

    001.png

    由于代码中调用了VMP 壳内存校验的函数,所以不要直接 Patch 汇编指令,而要使用异常机制来绕过内存校验实现补丁。

    方案一、修改标志寄存器实现比较结果为真

    特征码1:85 C0 75 23 45 33 C9 ,偏移为 2

    注意:我们在使用特征码搜索地址时,一定要确保其唯一性,比如可使用插件来查找结果

    401.png

    设置 ZF 标志位为 1 即可。

    002.png

    最后,异常设置这里使用对当前线程设置异常即可,不要勾选对所有线程设置异常,会被 VMP 检测到被调试。

    003.png


    方案二、修改memcpy比较函数的参数


    00007FF74A7017DC | 41:B8 10000000          | mov r8d,10                                      |
    00007FF74A7017E2 | 48:8D9424 50010000      | lea rdx,qword ptr ss:[rsp+150]                  | rdx:EntryPoint
    00007FF74A7017EA | 48:8D8C24 60010000      | lea rcx,qword ptr ss:[rsp+160]                  |
    00007FF74A7017F2 | E8 99940000             | call testcheckmemory64.7FF74A70AC90             | memcmp 比较函数
    00007FF74A7017F7 | 85C0                    | test eax,eax                                    |
    00007FF74A7017F9 | 75 23                   | jne testcheckmemory64.7FF74A70181E              | 关键跳转

    特征码地址: E8 ?? ?? ?? ?? 85 C0 75 23

    该方案比较简单,直接将 RDX 寄存器数值修改为 RCX 即可。

    101.png


    方案三、修改参与比较的 MD5 内存数据


    特征码地址: E8 ?? ?? ?? ?? 85 C0 75 23

    直接将 RDX 寄存器指向的内存的数据 修改为 RCX 指向内存的数据即可,长度为 0x10。// 注意 baymax 输入的数值均为 HEX 数值


    201.png


    方案四、修改 memcpy 函数返回值

    我们进入 memcmp 函数:

    00007FF74A70AC90 | 48:2BD1                 | sub rdx,rcx                                     | rdx:EntryPoint
    00007FF74A70AC93 | 49:83F8 08              | cmp r8,8                                        |
    00007FF74A70AC97 | 72 22                   | jb testcheckmemory64.7FF74A70ACBB               |
    00007FF74A70AC99 | F6C1 07                 | test cl,7                                       |
    00007FF74A70AC9C | 74 14                   | je testcheckmemory64.7FF74A70ACB2               |
    00007FF74A70AC9E | 66:90                   | nop     

    提取函数入口特征码:48 2B D1 49 83 F8 08 72 22 F6 C1 07 74 14

    1、勾选修改函数返回值,设置函数返回时修改类型,栈偏移为 0。
    2、 设置 RAX 寄存器为 0,即 memcmp 函数返回 0,比较内存数据相同。
    3、条件断点 参数 r8d == 0x10

    301.png


    目标程序源码+补丁方案下载:


    链接:https://pan.baidu.com/s/1afZOKMIdKUFI5vLbt4jmBg
    提取码:cgr5
    解压密码:Baymax64





    评分

    参与人数 8威望 +14 飘云币 +14 收起 理由
    windxp + 2 + 2 感谢发布原创作品,PYG有你更精彩!
    x77756010 + 1 + 1 赞一个,这个帖子很给力!
    jim66xy + 1 + 1 原创精品 感谢分享!
    Master.lu + 2 + 2 感谢发布原创作品,PYG有你更精彩!
    飞天 + 2 + 2 感谢发布原创作品,PYG有你更精彩!
    风轻云淡 + 2 + 2 PYG有你更精彩!
    sdnyzjzx + 2 + 2 原创精品 感谢分享!
    speedboy + 2 + 2 赞一个,这个帖子很给力!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    前天 08:25
  • 签到天数: 1692 天

    [LV.Master]伴坛终老

    发表于 2023-9-28 16:23:55 | 显示全部楼层
    官方出品,必属精品。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2023-11-2 22:04
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2023-9-28 16:42:33 | 显示全部楼层
    最近遇到几个软件都是无法找到hook时机,能否详细讲解一下怎么寻找hookapi的时机api函数
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 17:09
  • 签到天数: 555 天

    [LV.9]以坛为家II

    发表于 2023-9-28 17:53:17 | 显示全部楼层
    太强悍了                 
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-12-22 20:16
  • 签到天数: 574 天

    [LV.9]以坛为家II

    发表于 2023-9-29 20:51:16 | 显示全部楼层
    备注收藏一下,非常有用
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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