内联汇编中 jmp 的地址错误
Error with address for jmp in inline assembly
我做的是
- 获取
ExitProcess
的地址
- 为操作码制作space
- 修改space
中的操作码
- 执行修改后的操作码
__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是一个相对跳转。所以你需要考虑你存储它的地址。可能是这样的:
更新: per 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;
}
我做的是
- 获取
ExitProcess
的地址
- 为操作码制作space
- 修改space 中的操作码
- 执行修改后的操作码
__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是一个相对跳转。所以你需要考虑你存储它的地址。可能是这样的:
更新: per 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;
}