首页
社区
课程
招聘
[旧帖] [求助] Dll 注入添加用SetUnhandledExceptionFilter添加 VEH 修改内存属性,抛出异常进行跳转。求教高手 0.00雪花
发表于: 2011-7-25 16:50 6472

[旧帖] [求助] Dll 注入添加用SetUnhandledExceptionFilter添加 VEH 修改内存属性,抛出异常进行跳转。求教高手 0.00雪花

2011-7-25 16:50
6472
学习veh,于是想写个跳转,拿计算器下手。
修改 calc中选择进制(科学型)的函数(0x100675B)。
把函数开头第一个字节把内存改成PAGE_NOACCESS,但是注入后 然后心碎的事情就发生了 内存访问错误的地址居然是 0x1006118。吐血,这是为什么?
代码如下:
#include "stdafx.h"
#include <tchar.h>
#include <strsafe.h>

LONG WINAPI MyUnFilterA (_EXCEPTION_POINTERS *lpExceptionInfo);
const unsigned long Hookaddr = 0x100675B;

unsigned long ulProtect;

void DebugPrint(__format_string STRSAFE_LPCWSTR pszFormat, ...)
{
	va_list va;
	va_start(va, pszFormat);

	wchar_t* pszDebug = new wchar_t[256];

	StringCchVPrintf(pszDebug, 256, pszFormat, va);
	OutputDebugString(pszDebug);

	delete[] pszDebug;

	va_end(va);
}

__declspec(naked) VOID MyHook()
{
	OutputDebugString(_T("Hook_"));
	__asm
	{
		push ebx
		mov eax,Hookaddr
		add eax,1
		jmp eax
	}
}

DWORD WINAPI MyThreadFunction( LPVOID lpParam ) 
{
	//添加VEH处理
	SetUnhandledExceptionFilter(MyUnFilterA);
	//修改内存属性
	VirtualProtect((LPVOID)Hookaddr, 1, PAGE_NOACCESS, &ulProtect);
	return 0;
}

BOOL APIENTRY DllMain( HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
	)
{
	UNREFERENCED_PARAMETER(lpReserved);
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		{
			CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&MyThreadFunction, (void*)hModule, 0, NULL);
		}
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

LONG WINAPI MyUnFilterA (_EXCEPTION_POINTERS *lpExceptionInfo)
{
	if (lpExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION)
	{
		if (lpExceptionInfo->ContextRecord->Eip == Hookaddr)
		{
			//如果报错的地址是Hookaddr就跳转
			lpExceptionInfo->ContextRecord->Eip = (DWORD)MyHook;
			return EXCEPTION_CONTINUE_EXECUTION;
		}
		else
		{
			//如果不是就修改内存属性,记录下地址。
			DebugPrint(L"addr %X ,EIP %X",lpExceptionInfo->ExceptionRecord->ExceptionAddress,lpExceptionInfo->ContextRecord->Eip);
			VirtualProtect((LPVOID)lpExceptionInfo->ExceptionRecord->ExceptionAddress, 1, PAGE_EXECUTE_READWRITE, &ulProtect);
			return EXCEPTION_CONTINUE_EXECUTION;
		}
	}
	else return EXCEPTION_CONTINUE_SEARCH;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 248
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
DebugView
输出

[4676] addr 1006118 ,EIp 1006118

吐血啊~~~

谁来帮助下,告诉我为什么啊?是不是不能用Dll注入来添加VEH?
2011-7-25 18:46
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
VirtualProtect((LPVOID)Hookaddr, 1, PAGE_NOACCESS, &ulProtect);会把一页内存都变成NOACCESS
2011-7-25 19:20
0
雪    币: 248
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
那应该如何处理呢?
只把一个字节改成不可读
2011-7-25 19:36
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
去下硬件断点吧。。。。。
2011-7-25 19:41
0
雪    币: 248
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
硬件断点被检测,有没有什么其他办法呢?
2011-7-26 07:04
0
雪    币: 248
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
那OD里的内存访问断点是如何实现的呢
2011-7-26 11:19
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
我糊涂了,也被雷了,LZ你确认你的方法是VEH嘛?

看看这个补充点基本知识,Windows平台下的异常处理

另外,不知道API怎么用无所谓的,但是要多看看MSDN,

http://msdn.microsoft.com/en-us/library/aa366898(v=vs.85).aspx

BOOL WINAPI VirtualProtect(
  __in   LPVOID lpAddress,
  __in   SIZE_T dwSize,
  __in   DWORD flNewProtect,
  __out  PDWORD lpflOldProtect
);

dwSize [in]
The size of the region whose access protection attributes are to be changed, in bytes. The region of affected pages includes all pages containing one or more bytes in the range from the lpAddress parameter to (lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes the protection attributes of both pages to be changed.
2011-7-26 18:21
0
游客
登录 | 注册 方可回帖
返回
//