c库x86 / x64汇编程序

是否有用于将x86 / x64汇编字符串组装到操作码的C库?

示例代码:

/* size_t assemble(char *string, int asm_flavor, char *out, size_t max_size); */ unsigned char bytes[32]; size_t size = assemble("xor eax, eax\n" "inc eax\n" "ret", asm_x64, &bytes, 32); for(int i = 0; i < size; i++) { printf("%02x ", bytes[i]); } /* Output: 31 C0 40 C3 */ 

我看过asmpure ,但它需要修改才能在非Windows机器上运行。

我实际上都需要一个汇编器和一个反汇编器,是否有一个提供两者的库?

当然 – 你可以使用llvm 。 严格来说,它是C ++,但有C接口。 它也将处理您正在尝试的组装和拆卸。

有一个看似鬼的图书馆; 它的存在是众所周知的:

XED(X86编码器解码器)

英特尔写道: https : //software.intel.com/sites/landingpage/pintool/docs/71313/Xed/html/

它可以通过Pin下载: https : //software.intel.com/en-us/articles/pintool-downloads

干得好:

http://www.gnu.org/software/lightning/manual/lightning.html

Gnu Lightning是一个C库,旨在完全按照您的要求进行操作。 它使用可移植的汇编语言,而不是x86特定的语言。 便携式组件在运行时以非常简单的方式编译到特定于机器的组件。

作为一个额外的好处,它比LLVM(相当大和繁琐)开始使用要小得多,也更简单。

您可能需要libyasm (后端YASM使用)。 您可以使用前端作为示例(尤其是YASM的驱动程序 )。

我正在使用fasm.dll: http ://board.flatassembler.net/topic.php?t = 6239如果它不是PE格式,请不要忘记在代码开头写“use32”。

将程序集写入自己的文件,然后使用extern从C程序中调用它。 你必须做一些makefile技巧,否则它不是那么糟糕。 您的汇编代码必须遵循C约定,因此它应该是这样的

  global _myfunc _myfunc: push ebp ; create new stack frame for procedure mov ebp,esp ; sub esp,0x40 ; 64 bytes of local stack space mov ebx,[ebp+8] ; first parameter to function ; some more code leave ; return to C program's frame ret ; exit 

要获取C变量的内容,或声明C可以访问的变量,只需将名称声明为GLOBAL或EXTERN。 (同样,名称需要前导下划线。)因此,声明为int i的C变量可以从汇编程序中访问

 extern _i mov eax,[_i] 

并且为了声明你自己的整数变量,C程序可以作为extern int j进行访问,你可以这样做(确保你在_DATA段中组装,如果需要):

  global _j _j dd 0 

你的C代码应该是这样的

 extern void myasmfunc(variable a); int main(void) { myasmfunc(a); } 

编译文件,然后使用链接

 gcc mycfile.o myasmfile.o