簡體   English   中英

內聯匯編中的jmp地址錯誤

[英]Error with address for jmp in inline assembly

我要做的是

  1. 獲取ExitProcess地址
  2. 為操作碼騰出空間
  3. 修改空間中的操作碼
  4. 通過__asm__ ("jmp %%ecx"::"c"(opcode));執行修改的操作__asm__ ("jmp %%ecx"::"c"(opcode));

這是我的代碼:

#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;
}

我希望程序能夠正常退出,但是程序會因分段錯誤而終止。

看來它跳到某個地方,但沒有跳到我想要它跳的位置。

我該如何解決?

拋開您正在嘗試做的奇怪的事情...

您的問題是操作碼e8是相對跳轉。 因此,您需要考慮存儲它的地址。 可能是這樣的:

更新:每個taeyun的長度為x。

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM