首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联程序集中jmp的地址错误

内联程序集中jmp的地址错误
EN

Stack Overflow用户
提问于 2015-01-02 07:45:02
回答 1查看 541关注 0票数 1

我所做的就是

  1. 获取ExitProcess地址
  2. 为操作码留出空间
  3. 修改空格中的操作码
  4. __asm__ ("jmp %%ecx"::"c"(opcode));执行修改后的操作码

这是我的代码:

代码语言:javascript
复制
#include <windows.h>
#include <stdio.h>
int main()
{
  char addr[4];
  *(int*)addr = GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess");

  //push 0 == 0x6a 0x00
  //call ExitProcess == 0xe8 0xd8 0x79 0xa2 0x75
  char opcode[400] = {0x6a, 0x00, 0xe8,addr[0], addr[1],addr[2],addr[3]};
  __asm__ ("jmp %%ecx" ::"c"(opcode));


  //never be here
  printf("never get here");
  getchar();
  return 0;
}

我希望程序正常退出,但程序以分段故障结束。

它似乎会跳到某个地方,但不会跳到我想要它跳的地方。

我怎么才能解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-02 09:03:35

把你想做的奇怪的事放在一边.

您的问题是操作码e8是一个相对跳转。因此,您需要说明您正在存储它的地址。可能是这样的:

更新:每台云,帐户长度x。

代码语言:javascript
复制
#include <windows.h>
#include <stdio.h>

#pragma pack(1)

struct mfoo {
  unsigned char x[3] = {0x6a, 0x00, 0xe8};
  void *addr;
} foo;

int main()
{
  unsigned char *a = (unsigned char *)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess");
  foo.addr = (void *)(a - sizeof(foo) - (unsigned char *)foo.x);

  __asm__ ("jmp *%%ecx" ::"c"(&foo));


  //never be here
  printf("never get here");
  getchar();
  return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27739030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档