c库x86 / x64汇编程序

时间:2013-06-08 15:35:47

标签: c assembly x86 64-bit

是否有用于将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机器上运行。

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

7 个答案:

答案 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