是否有用于将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机器上运行。
我实际上都需要一个汇编程序和一个反汇编程序,是否有一个提供两者的库?
答案 0 :(得分:7)
有一个看似鬼的图书馆;它的存在是众所周知的:
XED(X86编码器解码器)
英特尔写道:https://software.intel.com/sites/landingpage/pintool/docs/71313/Xed/html/
可以使用Pin:https://software.intel.com/en-us/articles/pintool-downloads
下载答案 1 :(得分:3)
你走了:
http://www.gnu.org/software/lightning/manual/lightning.html
Gnu Lightning是一个C库,旨在完全按照您的意愿行事。它使用可移植的汇编语言,而不是x86特定的语言。便携式组件在运行时以非常简单的方式编译为特定于机器的组件。
作为一个额外的好处,它比LLVM(相当大而且繁琐)开始使用时要小得多,也更简单。
答案 2 :(得分:2)
您可能需要libyasm(后端YASM使用)。您可以使用frontends作为示例(最重要的是,YASM's driver)。
答案 3 :(得分:1)
当然 - 您可以使用llvm。严格来说,它是C ++,但有C接口。它也将处理您正在尝试的组装和拆卸。
答案 4 :(得分:1)
我使用的是fasm.dll:http://board.flatassembler.net/topic.php?t=6239 不要忘记写&#34;使用32&#34;在代码的开头,如果它不是PE格式。
答案 5 :(得分:1)
Keystone现在似乎是一个不错的选择,但是当我问这个问题时它并不存在。
答案 6 :(得分:0)
将程序集写入自己的文件,然后使用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