Nisy 发表于 2015-1-16 19:04:48

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





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

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


#pragma optimize("",off)

BOOL APIENTRY DllMain( HMODULE hModule,
                     DWORDul_reason_for_call,
                     LPVOID lpReserved
                                       )
{

    VMProtectBeginUltra("DLLMAIN");
        switch (ul_reason_for_call)
        {
    case DLL_PROCESS_ATTACH:
    {
            // 02. 调用导出函数
            if (NsInitDll() == FALSE)
                return FALSE;   

            BOOL bStart = FALSE;
            NsVmpHelper::GetInstance().NsAppStartWithVmp(bStart);
            if (bStart == FALSE)
                return FALSE;
            break;
    }
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }

        return TRUE;

    VMProtectEnd();
}

#pragma optimize("/",on)




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

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

lucky_789 发表于 2015-1-16 19:16:49

谢谢分享,学习了

Nisy 发表于 2015-1-16 19:19:31

另外,少用 switch case 结构,否则生成中间表后,第一个 break 的时候就是你VMP区段的结束点。

small-q 发表于 2015-1-16 20:14:11

学习!!!

lgjxj 发表于 2015-1-16 21:29:33

顶一个 。。。。。。。。。。。。。

开心啦 发表于 2015-1-17 11:27:37

不懂,但是支持校长了!感谢N大

飘云 发表于 2015-1-17 15:33:53

。。。。是因为你吧VMProtectEnd 放到 return后面了。。 中间不能return

Nisy 发表于 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 的指令。

xinbinchi 发表于 2016-7-6 20:22:33

谢谢分享,路过必顶,
页: [1]
查看完整版本: 编译器将函数内联后VMP宏不匹配的解决方案