首页
社区
课程
招聘
[原创]x64下jmp远跳、远call的指令
发表于: 2016-1-25 10:40 9223

[原创]x64下jmp远跳、远call的指令

2016-1-25 10:40
9223
我一直在寻找能用,通用,简短的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
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 8188
活跃值: (2842)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
不错,mark一下,以前遇到过long jmp这个问题
2016-1-25 10:56
0
雪    币: 99
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2016-1-27 01:24
0
游客
登录 | 注册 方可回帖
返回
//