欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]内存补丁编写之金盾V2016机器码Patch(有码)

[原创]内存补丁编写之金盾V2016机器码Patch(有码)

仅供小菜娱乐!高手莫要见笑!
测试环境:XP3
编译环境:VS2008
测试程序:专用播放器V2016S 试用.exe
一.由于程序加了vmp,所以得找一个能让它跑起来的OD.然后定位到关键点上.有如下步骤
加密软件获取方法:(去金盾官网下载或者我的网盘下载(不知道为什么会自动取消分享):http://pan.baidu.com/share/link?shareid=947100562&uk=3207566814)
加密视频获取方法 你可以随便找一个avi格式或其它格式的小片来自己加密,如下图所示:

加密视频完后就可以创建播放密码了。。机器码你可以输入你想要的,然后就可以测式了

载入 专用播放器V2016S 试用.exe,运行,暂停,执行到用户代码,如下图所示:

查找 unicode 字符串
找到 -00000的地方,下断点,运行, 如下图所示:


然后找到开头地址,补丁程序中搜索特征码的开始地址,
选择文件,加密后的视频,这个时候就会断在出现机器码的地方(EDX),然后就可以替换掉:

上面调试过程己经清楚了,下面我们就开始写补丁了:
首先hook CreateFileW来判断程序是否己经解码完成>


//Hook CreateFileW 

DWORD WINAPI Hook()

{

	HMODULE handle = LoadLibrary("kernel32.dll");

	if (NULL == handle)

	{

		MessageBox(NULL,"加载动态库出错.","提示",MB_OK);

		return 0;

	}

	g_My_CreateFileW = (DWORD)GetProcAddress(handle,"CreateFileW");

	if (NULL == g_My_CreateFileW)

	{

		MessageBox(NULL,"获取函数地址出错.","提示",MB_OK);

		return 0;

	}

	//目标地址 - 源地址 - 5 

	BYTE szJump_CreateFileW[5] = {0xe9};

	DWORD dwJump_CreateFileW = (DWORD)My_CreateFileW - g_My_CreateFileW - 5;

	memcpy(&szJump_CreateFileW[1], &dwJump_CreateFileW, 4);

	DWORD dwOldProtect = 0;

	VirtualProtect((void*)g_My_CreateFileW, 0x1000, PAGE_EXECUTE_READWRITE, &dwOldProtect);

	memcpy((void*)g_My_CreateFileW, szJump_CreateFileW, 5);

	g_Old_CreateFileW = g_My_CreateFileW + 5;

	return 1;

}


解码后就搜索持征码来获得机器出现的地方

//搜索特征码 :

//StartAddress:开始搜索的地址 code:特征码 len:特征码长度

DWORD SearchSignature(ULONG StartAddress,BYTE * code, DWORD len)

{

	ULONG	u_index;

	BYTE	*p = (BYTE*)StartAddress;

	for (u_index = 0;u_index < 0x300;u_index++)

	{

		if ( memcmp(p,code, len) == 0 )

		{

			return (DWORD)p+len;

		}

		p++;

	}

	return 0;

}


然后就开始Patch机器码了

// VEH回调函数中Patch机器码

LONG WINAPI My_VectoredHandler(

							PEXCEPTION_POINTERS ExceptionInfo

							)

{

	DWORD MAddress = 0;

	//判断是否为我们设置的异常地址

	if(ExceptionInfo->ExceptionRecord->ExceptionAddress == (PVOID)g_hbAddress1)

	{

		//下面开始Patch 机器码

		MAddress = *(DWORD*)(ExceptionInfo->ContextRecord->Ebp-4);

		if (Machinecode[0]  != *(BYTE*)MAddress )

		{

			int len = sizeof(Machinecode);

			memcpy((BYTE*)MAddress,Machinecode,len);

		}

		// 修改当前异常中断的EIP

		ExceptionInfo->ContextRecord->Eip =g_hbAddress1+3;//修改完成后让程序继续执行

		// 处理异常.

		return EXCEPTION_CONTINUE_EXECUTION;

	}

	else if (ExceptionInfo->ExceptionRecord->ExceptionAddress == (PVOID)g_hbAddress2)

	{

		Vehindex++;

		//下面开始Patch 机器码

		if (3 <= Vehindex && 5 != Vehindex)

		{

			int len = sizeof(Machinecode);

			if (Machinecode[0]  != *(BYTE*)ExceptionInfo->ContextRecord->Edx)

			{

				memcpy((BYTE*)ExceptionInfo->ContextRecord->Edx,Machinecode,len);

			}

		}

		// 修改当前异常中断的EIP

		ExceptionInfo->ContextRecord->Eip = g_hbAddress2+1;//修改完成后让程序继续执行

		// 处理异常.

		return EXCEPTION_CONTINUE_EXECUTION;

	}

	return EXCEPTION_CONTINUE_SEARCH;

}


补丁效果如下:
没有放补丁时

放入补丁后,(其中ws2_32.dll为补丁, Mcode.ini为要替换的机器码)


视频可以正常播放

没什么技术含量,要测试的可到它官网上下载程序测试,补丁具体请看源码吧!
bin.rar
JD2016.rar

上传的附件 1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
bin.rar
JD2016.rar
10.jpg
11.jpg

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功