飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4633|回复: 8

[原创] 编译器将函数内联后VMP宏不匹配的解决方案

[复制链接]

该用户从未签到

发表于 2015-1-16 19:04:48 | 显示全部楼层 |阅读模式




  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"

  3. // 01. 添加头文件
  4. #include "NsHiJack.h"
  5. #include "NsVMPHelper.h"


  6. #pragma optimize("",off)

  7. BOOL APIENTRY DllMain( HMODULE hModule,
  8.                        DWORD  ul_reason_for_call,
  9.                        LPVOID lpReserved
  10.                                          )
  11. {

  12.     VMProtectBeginUltra("DLLMAIN");
  13.         switch (ul_reason_for_call)
  14.         {
  15.     case DLL_PROCESS_ATTACH:
  16.     {
  17.             // 02. 调用导出函数
  18.             if (NsInitDll() == FALSE)
  19.                 return FALSE;   

  20.             BOOL bStart = FALSE;
  21.             NsVmpHelper::GetInstance().NsAppStartWithVmp(bStart);
  22.             if (bStart == FALSE)
  23.                 return FALSE;
  24.             break;
  25.     }
  26.         case DLL_THREAD_ATTACH:
  27.         case DLL_THREAD_DETACH:
  28.         case DLL_PROCESS_DETACH:
  29.                 break;
  30.         }

  31.         return TRUE;

  32.     VMProtectEnd();
  33. }

  34. #pragma optimize("/",on)

复制代码



在函数调用开始处添加这个宏(关闭优化): #pragma optimize("",off)
在函数调用结束处添加这个宏(恢复优化): #pragma optimize("",on)

optimize 文档说明: http://msdn.microsoft.com/zh-cn/library/chh3fb0k.aspx

评分

参与人数 3威望 +24 飘云币 +24 收起 理由
逍遥枷锁 + 8 + 8 很给力!
GeekCat + 8 + 8 赞一个!
lucky_789 + 8 + 8 赞一个!

查看全部评分

PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-9-27 19:17
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2015-1-16 19:16:49 | 显示全部楼层
    谢谢分享,学习了
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2015-1-16 19:19:31 | 显示全部楼层
    另外,少用 switch case 结构,否则生成中间表后,第一个 break 的时候就是你VMP区段的结束点。
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-3-10 20:59
  • 签到天数: 243 天

    [LV.8]以坛为家I

    发表于 2015-1-17 11:27:37 | 显示全部楼层
    不懂,但是支持校长了!感谢N大
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2015-1-17 15:33:53 | 显示全部楼层
    。。。。是因为你吧VMProtectEnd 放到 return后面了。。 中间不能return

    点评

    跟这个没关系,VMP宏区间内的代码只要不JMP出区段 就都可以混淆对跳转的偏移 ret 时已经到栈底了 下边加什么代码无所谓 只要这个retn不是编译为 JMP 就OK。  详情 回复 发表于 2015-1-20 18:43
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2015-1-20 18:43:58 | 显示全部楼层
    飘云 发表于 2015-1-17 15:33
    。。。。是因为你吧VMProtectEnd 放到 return后面了。。 中间不能return




    跟这个没关系,VMP宏区间内的代码只要不JMP出区段 就都可以混淆对跳转的偏移 ret 时已经到栈底了 下边加什么代码无所谓 只要这个retn不是编译为 JMP到函数尾去执行最后的retn 就OK。 而这里的retn 已经是函数末了,所以无所谓是否溢出VMP宏区段。 相当于我只是在 retn 之后又插入了一个 CALL DLL API 的指令。
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-6-1 20:17
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2016-7-6 20:22:33 | 显示全部楼层
    谢谢分享,路过必顶,
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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