hook模板x86/x64通用版(1)--x64下的jmp远跳、远call指令

我一直在寻找能用,通用,简短的x64远跳河远call指令
现在用的跟大家分享一下,哪位大牛有更好的希望可以指点一下。
还有pushad/popad在x64下有什么好的替代品么?求指点。

远跳:
代码:
push 地址的低32位
mov dword ptr ss:[rsp+4],地址的高32位
ret
远call:
代码:
call @next   //e8 00 00 00 00
@next:
add dword ptr ss:[rsp],12
push 地址的低32位
mov dword ptr ss:[rsp+4],地址的高32位
ret
所以其实本质上,远跳使用的还是push/ret的原理,远call使用的是push返回地址,再远跳到call的地址。

成品函数:
代码:
void CHook::WriteJMP_x64( DWORD_PTR dwFrom , DWORD_PTR dwTo )
{
  DWORD_PTR dwAdr = dwFrom;

  DWORD dwOldP;
  VirtualProtect((LPVOID)dwAdr , 0x100 , PAGE_EXECUTE_READWRITE , &dwOldP);

  *(BYTE*)dwAdr = 0x68;
  dwAdr+=1;
  *(DWORD32*)dwAdr = DWORD32(dwTo & 0xffffffff);
  dwAdr+=4;
  *(DWORD32*)dwAdr = DWORD32(0x042444c7);
  dwAdr+=4;
  *(DWORD32*)dwAdr = DWORD32(dwTo >> 32);
  dwAdr+=4;
  *(BYTE*)dwAdr = 0xc3;
//14 bytes
}

void CHook::WriteCall_x64( DWORD_PTR dwFrom , DWORD_PTR dwTo )
{
  DWORD_PTR dwAdr = dwFrom;

  DWORD dwOldP;
  VirtualProtect((LPVOID)dwAdr , 0x100 , PAGE_EXECUTE_READWRITE , &dwOldP);

  *(BYTE*)dwAdr = 0xE8;
  dwAdr+=1;
  *(DWORD*)dwAdr = DWORD32(0);
  dwAdr+=4;
  *(DWORD32*)dwAdr = DWORD32(0x12240483);
  dwAdr+=4;
  *(BYTE*)dwAdr = 0x68;
  dwAdr+=1;
  *(DWORD32*)dwAdr = DWORD32(dwTo & 0xffffffff);
  dwAdr+=4;
  *(DWORD32*)dwAdr = DWORD32(0x042444c7);
  dwAdr+=4;
  *(DWORD32*)dwAdr = DWORD32(dwTo >> 32);
  dwAdr+=4;
  *(BYTE*)dwAdr = 0xc3;
//23 bytes
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yes2/article/details/50580384
文章标签: x64 long jmp 远call
个人分类: hook教程
想对作者说点什么? 我来说一句

pushad & pushfd

pushad 和 pushfd

aap159951 aap159951

2016-01-11 11:20:29

阅读数:1321

mhook HOOK库 支持X86 X64 含Demo VS2010

2015年03月19日 110KB 下载

HOOK API 完美支持 x86 x64

2011年05月24日 181KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭