[原创]内存补丁编写之金盾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
