16

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

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

4

7 回答 7

9

有一个图书馆,似乎是个鬼魂;它的存在广为人知:

XED(X86 编码器解码器)

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

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

于 2015-05-06T20:11:21.910 回答
2

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

于 2014-11-06T17:42:41.587 回答
2

当然-您可以使用llvm。严格来说是C++,但是有C接口。它还将处理您尝试进行的组装和拆卸。

于 2013-09-03T15:07:06.227 回答
2

干得好:

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

Gnu Lightning 是一个 C 库,旨在完全满足您的需求。它使用了一种可移植的汇编语言,而不是 x86 特定的一种。可移植程序集在运行时以非常直接的方式编译为特定于机器的程序集。

作为一个额外的好处,它比 LLVM(相当大和笨重)更小更容易开始使用。

于 2013-10-31T03:45:21.543 回答
1

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

于 2015-03-07T05:33:09.623 回答
1

Keystone现在似乎是一个不错的选择,但是当我问这个问题时它并不存在。

于 2019-07-18T00:55:02.523 回答
0

Write the assembly into its own file, and then call it from your C program using extern. You have to do a little bit of makefile trickery, but otherwise it's not so bad. Your assembly code has to follow C conventions, so it should look like

          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

To get at the contents of C variables, or to declare variables which C can access, you need only declare the names as GLOBAL or EXTERN. (Again, the names require leading underscores.) Thus, a C variable declared as int i can be accessed from assembler as

extern _i 
mov eax,[_i]

And to declare your own integer variable which C programs can access as extern int j, you do this (making sure you are assembling in the _DATA segment, if necessary):

    global _j 
_j        dd 0

Your C code should look like

extern void myasmfunc(variable a);

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

Compile the files, then link them using

gcc mycfile.o myasmfile.o
于 2013-07-03T14:03:47.560 回答