DWORD sendCode = 0x609E2FDA;//要写入的地址
DWORD sendNR;
DWORD JmpNextAddr = sendCode+5;//跳回地址
PBYTE pbData;
void DumpBuffer(PBYTE pBuffer,DWORD dwBufLen)
{
CString sMessage; //最终结果
sMessage.Empty();
for (DWORD i =0;i<dwBufLen;i++)
{
CString sTemp;
sTemp.Format(L"%02X",pBuffer[i]);
sMessage +=sTemp;
if((i+1)%16 == 0)
{
sMessage +="\r\n";
}
}
AfxMessageBox(sMessage,MB_OK | MB_ICONINFORMATION);
}
__declspec(naked) void MySend()
{
__asm
{
pushad //压栈保护平衡
mov sendNR,edx //自己的
}
//输入内容
pbData = (BYTE*)sendNR;//发包内容的指针
DumpBuffer(pbData,0x0E);//格式化发包显示
__asm
{
<pre code_snippet_id="398327" snippet_file_name="blog_20140619_1_787481" name="code" class="cpp"> popad //恢复栈平衡
MOV ECX,DWORD PTR DS:[ECX+40]//被自己代码覆盖的源程序代码
TEST ECX,ECX//被自己代码覆盖的源程序代码
jmp JmpNextAddr;//跳回原程序
}} void SendHook(){DWORD OldProtect;if(VirtualProtect((LPVOID)sendCode,5,PAGE_READWRITE,&OldProtect))//把要hook地址的内存属性改为可读可写{*(BYTE*)sendCode =0xE9;//e9为jmp*(DWORD*)(sendCode+1) = (DWORD)MySend - (DWORD)sendCode - 0x5;//目标地址地址-原地址-5为jmp要跳地址机器码VirtualProtect((LPVOID)MySend,5,OldProtect,&OldProtect);//恢复地址原来的内存属性}}