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