编译器将函数内联后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
谢谢分享,学习了 另外,少用 switch case 结构,否则生成中间表后,第一个 break 的时候就是你VMP区段的结束点。 学习!!! 顶一个 。。。。。。。。。。。。。 不懂,但是支持校长了!感谢N大 。。。。是因为你吧VMProtectEnd 放到 return后面了。。 中间不能return
飘云 发表于 2015-1-17 15:33
。。。。是因为你吧VMProtectEnd 放到 return后面了。。 中间不能return
跟这个没关系,VMP宏区间内的代码只要不JMP出区段 就都可以混淆对跳转的偏移 ret 时已经到栈底了 下边加什么代码无所谓 只要这个retn不是编译为 JMP到函数尾去执行最后的retn 就OK。 而这里的retn 已经是函数末了,所以无所谓是否溢出VMP宏区段。 相当于我只是在 retn 之后又插入了一个 CALL DLL API 的指令。
谢谢分享,路过必顶,
页:
[1]