反ring3 hook demo ,直接从dll文件修复 dll的code段,实现反hook

// CounterHook.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>

void showInfo(LPWSTR strInfo)
{
	OutputDebugStringW(strInfo);
}

typedef HANDLE (WINAPI* pfnCreateEvent)(
	LPSECURITY_ATTRIBUTES lpEventAttributes,
	BOOL bManualReset,
	BOOL bInitialState,
	LPWSTR lpName
	);

pfnCreateEvent lpFunCreateEvent ;

HANDLE  __declspec(naked) WINAPI MyCreateEvent(
	LPSECURITY_ATTRIBUTES lpEventAttributes,
	BOOL bManualReset,
	BOOL bInitialState,
	LPWSTR lpName
	)
{

	_asm
	{  

		 mov         edi,edi
		 push        ebp
		 mov         ebp,esp  

		 jmp		 lpFunCreateEvent

	}  

}

typedef int (WINAPI* pfnMessageBoxW)(HWND hWnd,LPWSTR lpText,LPWSTR lpCaption,UINT uType);
pfnMessageBoxW lpMessageBoxW ;

int __declspec(naked) WINAPI MyMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
	_asm{
			mov         edi,edi
			push        ebp
			mov         ebp,esp  

			jmp		 lpMessageBoxW
	}
}

void HookCreateEventW()
{
	BYTE NewBytes[5] = {0xe9,0x0,0x0,0x0,0x0};
	HMODULE h= LoadLibraryW(L"kernel32.dll");

	lpFunCreateEvent = (pfnCreateEvent) GetProcAddress(h,"CreateEventW");

	*(DWORD*)(NewBytes + 1) = (DWORD)MyCreateEvent-(DWORD)lpFunCreateEvent-5;
	WriteProcessMemory(INVALID_HANDLE_VALUE,(LPVOID)lpFunCreateEvent,NewBytes,5,NULL);
	lpFunCreateEvent = (pfnCreateEvent)((LPBYTE)lpFunCreateEvent +5 );

}
void HookMessageBoxW()
{
	BYTE NewBytes[5] = {0xe9,0x0,0x0,0x0,0x0};
	HMODULE h= LoadLibraryW(L"user32.dll");

	lpMessageBoxW = (pfnMessageBoxW) GetProcAddress(h,"MessageBoxW");

	*(DWORD*)(NewBytes + 1) = (DWORD)MyMessageBox-(DWORD)lpMessageBoxW-5;
	WriteProcessMemory(INVALID_HANDLE_VALUE,(LPVOID)lpMessageBoxW,NewBytes,5,NULL);
	lpMessageBoxW = (pfnMessageBoxW)((LPBYTE)lpMessageBoxW +5 );
}
void CounterHookdll(LPWSTR strDllName)
{
	WCHAR wszModuleName[MAX_PATH];
	DWORD dwZeroMem[64];
	DWORD dwFileSizeH;
	DWORD dwFileSizeL;
	IMAGE_DOS_HEADER* dosHead;
	IMAGE_NT_HEADERS* peHead;
	IMAGE_SECTION_HEADER* sections;
	int sectionCount ;
	HMODULE h = LoadLibraryW(strDllName);
	GetModuleFileName(h,wszModuleName,MAX_PATH);

	ZeroMemory(dwZeroMem,sizeof(dwZeroMem));

	HANDLE hFile = CreateFile(wszModuleName,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_SYSTEM, NULL);
	DWORD dwError = GetLastError();
	if (hFile != INVALID_HANDLE_VALUE)
	{
		dwFileSizeL = GetFileSize(hFile,&dwFileSizeH);

		HANDLE hMap = CreateFileMappingW(hFile,NULL,PAGE_READONLY|SEC_IMAGE,dwFileSizeH,dwFileSizeL,NULL);

		DWORD dwError = GetLastError();
		if (hMap!= NULL)
		{
			LPVOID lpBuffer =MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);

			//lpBuffer = h ;

			if ((*(LPWORD)lpBuffer) == 0x5a4d/* && ((LPBYTE)lpBuffer+ (*(LPDWORD)((LPBYTE)lpBuffer+0x3c))==0x4550*/)
			{
				// 				DWORD dwOffset = *(LPDWORD)((LPBYTE)lpBuffer+0x3c);
				// 				if (*(LPWORD)((LPBYTE)lpBuffer+dwOffset) == 0x4550)
				// 				{
				//
				// 				}
				dosHead = (IMAGE_DOS_HEADER*)lpBuffer;
				peHead = (IMAGE_NT_HEADERS*)((LPBYTE)lpBuffer+dosHead->e_lfanew);

				sectionCount = peHead->FileHeader.NumberOfSections;
				sections = (IMAGE_SECTION_HEADER*)((LPBYTE)peHead+sizeof(IMAGE_NT_HEADERS));
				for (int i=0;i<sectionCount;i++)
				{
					//printf((char*)((sections+i)->Name));

					if ((sections+i)->Name[1]==‘t‘)
					{
						DWORD dwWriteStart ,dwWriteEnd ;
						DWORD dwCodeSize = (sections+i)->SizeOfRawData ;
						DWORD dwVirtualAddress =  (sections+i)->VirtualAddress ;

						LPBYTE lpCodeAddr = (LPBYTE)lpBuffer+dwVirtualAddress ;
						int j = 0;
						for ( ;j<dwCodeSize;j++)
						{
							// find first WINAPI
							if(*(LPDWORD)(lpCodeAddr+j) ==0x8b55ff8b)
							{

								dwWriteStart = j ;

								for(int e=dwWriteStart;e<dwCodeSize;e++ )
								{
// 									if (*(LPDWORD)(lpCodeAddr+e) == 0 && *(LPDWORD)(lpCodeAddr+e+16)==0)
// 									{
// 										dwWriteEnd = e ;
// 									}
									if (memcmp(lpCodeAddr+e,dwZeroMem,sizeof(dwZeroMem))==0)
									{
										dwWriteEnd = e ;
										break;
									}
								}
								//dwCodeSize +=5;
								DWORD dwOldAtr=0;
								DWORD dwMem,dwMem2 ;
								dwMem = (DWORD)h+dwVirtualAddress+dwWriteStart;
								dwMem2 = (DWORD)((LPBYTE)lpCodeAddr+dwWriteStart );

								if(WriteProcessMemory(INVALID_HANDLE_VALUE,(LPVOID)dwMem,(LPVOID)dwMem2,dwWriteEnd-dwWriteStart,NULL))
								{
									printf(" WriteMemory OK");
								}else
								{
									printf(" WriteMemory Failed");
								}
								return ;

							}
						}

					}

				}

			}
		}

	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hEvent ;
	HookCreateEventW();
	CounterHookdll(L"kernel32.dll");
	hEvent = CreateEventW(NULL,FALSE,FALSE,L"Good");
	printf("hEvent= 0x%08x",hEvent);
	HookMessageBoxW();
	CounterHookdll(L"user32.dll");
	MessageBoxW(NULL,L"GOOD",L"Good",0);
	getchar();
	return 0;
}

  

时间: 2024-10-04 15:07:06

反ring3 hook demo ,直接从dll文件修复 dll的code段,实现反hook的相关文章

类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z

http://blog.csdn.net/shuaishifu/article/details/19602059 类库调用自身所带的配置文件中的配置信息,而不是读取应用程序所带的配置信息.代码如下: private Configuration GetConfig() { //获取调用当前正在执行的方法的方法的 Assembly Assembly assembly = Assembly.GetCallingAssembly(); string path = string.Format("{0}.c

C#中修改Dll文件 (反编译后重新编译)

Dll文件生成后,如没有源代码,又要修改其中内容 可以用微软自带的ildasm和ilasm程序 先用ildasm将dll文件反编译成il文件 ildasm Test.dll /out=Test.il 会生成Test.res和Test.il两个文件 il文件可以用文本编辑器修改,要注意其中的语法 改完后再用ilasm将il文件重新编译成dll文件 ilasm /dll /res:Test.res Test.il /out:Test.dll 本人测试时因为ildasm和ilasm程序都是从网上下载来

java中调用dll文件的两种方法

一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNative地址:http://www.jb51.net/article/35232.htm JNA方法: 介绍 给大家介绍一个最新的访问本机代码的Java框架—JNA. JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架

对C#调用C++ dll文件进行总结

在实际项目工作中,经常用到C#调用C++ 或者C编写的dll文件. dll支持一般函数声明和类的定义声明,但是一般为了简化,都是 采用函数声明的方式.这里主要并不是写 dll的编写. 先在vs中创建一个dll项目 添加一个新的cpp文件 测试代码如下: struct Student   //定义了一个结构体,结构体中包含了基本类型,字符串类型和数组,基本上能满足很多情况了{ int no; char name[10]; int score[4];}; extern "C" __decl

DLL文件——让我来管理(一)

一.什么是DLL 1.含义 DLL文件又称"应用程序拓展",是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中.当我们执行某一个程序时,相应的DLL文件就会被调用.一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件 2.作用 在 Windows操作系统中,每个程序都可以使用该 DLL 中包含的功能来实现"打开"对话框

、Dll文件的编写 调用 说明

1>新建Dll文件TestLib.dll 新建Unit文件U_TestFunc U_TestFunc代码如下: unit U_TestFunc; interface uses //尽可能的少uses这样会缩小dll的体积 SysUtils; //求和 function Sum(x1,x2: Integer): Integer; stdcall implementation function Sum(x1,x2: Integer): Integer; stdcall begin Result :=

Delphi编程中软件调用EXE文件与DLL文件的体会

一.定义 EXE文件,是完整的"Windows窗体应用程序"或"控制台应用程序",它能独立执行,也能被居主EXE调用.其内部是系列类或方法构成,执行时,全部载入内存. DLL文件,全称是Dynamic Link Libaray,即动态链接库,将程序(EXE)运行所需要的类或方法的实现放在dll文件中,它的类.方法不能直接被执行,必须由一个EXE文件调用载入内存,通过类.方法形式从内存中获取(执行). 二.相同 1.二者内部结构基本一致,都是由操作系统的类.特定语言(

电脑中dll文件丢失怎么恢复?

DLL文件是Windows系统中的动态链接文件,我们在运行程序时都必须链接到dll文件,如果缺少了则无法正常运行,相信大家都会遇到dll文件缺失的情况,那么电脑中dll文件丢失怎么恢复?下面装机之家分享一下计算机中丢失dll文件修复方法.   第一种方法: 1.在命令提示符下输入第一个命令:cd/d %systemroot%system32 2.在命令提示符下继续输入第二个命令:For %i in (*.dll) do regsvr32 %i /i /s 3.在注册表里: HKEY_LOCAL_

(Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目,选择类库,取名为JefferyChan,具体步骤如下图: 3.因为要调用Unity中的相关文件,所以这里要引入外部文件.首先在Unity的安装文件夹中找到UnityEngine.dll,我的路径是:D:\Program Files (x86)\Unity\Editor\Data\Managed 如