如何通过指令读取二进制可执行文件?

礼帽哈雷

有没有办法以编程方式从 x86 架构上的二进制可执行文件中读取给定数量的指令?

如果我有一个简单的 C 程序的二进制文件hello.c

#include <stdio.h>

int main(){
    printf("Hello world\n");
    return 0;
}

使用编译后gcc,反汇编的函数main如下所示:

000000000000063a <main>:
 63a:   55                      push   %rbp
 63b:   48 89 e5                mov    %rsp,%rbp
 63e:   48 8d 3d 9f 00 00 00    lea    0x9f(%rip),%rdi        # 6e4 <_IO_stdin_used+0x4>
 645:   e8 c6 fe ff ff          callq  510 <puts@plt>
 64a:   b8 00 00 00 00          mov    $0x0,%eax
 64f:   5d                      pop    %rbp
 650:   c3                      retq   
 651:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
 658:   00 00 00 
 65b:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

在 C 中有没有一种简单的方法来读取例如前三个指令(意思是字节55, 48, 89, e5, 48, 8d, 3d, 9f, 00, 00, 00main不能保证函数看起来像这样 - 第一条指令可能具有所有不同的操作码和大小。

让-弗朗索瓦·法布尔

main通过获取函数的地址并转换为unsigned char, 以十六进制打印的指针来打印函数的前 10 个字节

这个小片段不计算指令。为此,您需要一个指令大小表(不是很困难,只是很乏味,除非您发现该表已经完成,每条 asm 指令的大小是多少?)才能在给定第一个字节的情况下预测每条指令的大小。

(当然,除非您所针对的处理器具有固定的指令大小,这使得解决问题变得微不足道)

调试器也必须解码操作数,但在某些情况下,例如 step 或 trace,我怀疑他们有一个方便的表来计算下一个断点地址。

#include <stdio.h>

int main(){
    printf("Hello world\n");
    const unsigned char *start = (const char *)&main;
    int i;
    for (i=0;i<10;i++)
    {
       printf("%x\n",start[i]);
    }    
    return 0;
}

输出:

Hello world
55
89
e5
83
e4
f0
83
ec
20
e8

似乎与拆卸相匹配:)

00401630 <_main>:
  401630:   55                      push   %ebp
  401631:   89 e5                   mov    %esp,%ebp
  401633:   83 e4 f0                and    $0xfffffff0,%esp
  401636:   83 ec 20                sub    $0x20,%esp
  401639:   e8 a2 01 00 00          call   4017e0 <___main>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可执行文件与二进制文件..它们如何工作?

来自分类Dev

如何将机器代码转换为二进制可执行文件?

来自分类Dev

如何知道我的二进制可执行文件的内存占用量

来自分类Dev

如何将机器代码转换为二进制可执行文件?

来自分类Dev

与位置无关的可执行文件:什么是“主要可执行二进制文件”?

来自分类Dev

在Linux中从可执行文件到机器代码的二进制执行步骤

来自分类Dev

如何通过 Python selenium 在多个 Firefox 二进制文件中选择要使用的 Firefox 可执行文件

来自分类Dev

bash文件包含可执行文件/二进制代码

来自分类Dev

在自包含的可执行文件中提取二进制文件的位置

来自分类Dev

如何在Mac OS X的可执行文件中嵌入二进制文件的内容?

来自分类Dev

如何在目录中递归查找所有二进制可执行文件?

来自分类Dev

如何恢复正在运行的进程被删除的二进制可执行文件

来自分类Dev

包含二进制可执行文件的Bash脚本

来自分类Dev

Android:在AOSP版本中包含su二进制可执行文件

来自分类Dev

将参数传递给python二进制可执行文件

来自分类Dev

从JAR为AWS Lambda运行二进制可执行文件

来自分类Dev

UiPath进程可以转换为二进制可执行文件吗?

来自分类Dev

无法在Ubuntu 12.04上运行二进制可执行文件

来自分类Dev

从Debian到Ubuntu的二进制可执行文件?

来自分类Dev

为什么可执行文件需要二进制格式规范?

来自分类Dev

Bash:将原始二进制变量用作可执行文件吗?

来自分类Dev

使用LLVM工具将二进制数据嵌入可执行文件

来自分类Dev

可执行文件上的通配符(二进制)

来自分类Dev

在Mac上将Python3编译为二进制可执行文件

来自分类Dev

是否可以将可执行文件/二进制文件(已构建)作为unikernels运行?

来自分类Dev

漏洞扫描程序会扫描源代码还是可执行文件(二进制文件)?

来自分类Dev

可执行文件(二进制文件)的标准命名惯例,以及如何判断文件是否具有不可打印的字符?

来自分类Dev

使用依赖性pandoc-citeproc在Haskell中构建独立的二进制可执行文件

来自分类Dev

将 C/C++ 二进制可执行文件作为 docker 容器运行

Related 相关文章

  1. 1

    可执行文件与二进制文件..它们如何工作?

  2. 2

    如何将机器代码转换为二进制可执行文件?

  3. 3

    如何知道我的二进制可执行文件的内存占用量

  4. 4

    如何将机器代码转换为二进制可执行文件?

  5. 5

    与位置无关的可执行文件:什么是“主要可执行二进制文件”?

  6. 6

    在Linux中从可执行文件到机器代码的二进制执行步骤

  7. 7

    如何通过 Python selenium 在多个 Firefox 二进制文件中选择要使用的 Firefox 可执行文件

  8. 8

    bash文件包含可执行文件/二进制代码

  9. 9

    在自包含的可执行文件中提取二进制文件的位置

  10. 10

    如何在Mac OS X的可执行文件中嵌入二进制文件的内容?

  11. 11

    如何在目录中递归查找所有二进制可执行文件?

  12. 12

    如何恢复正在运行的进程被删除的二进制可执行文件

  13. 13

    包含二进制可执行文件的Bash脚本

  14. 14

    Android:在AOSP版本中包含su二进制可执行文件

  15. 15

    将参数传递给python二进制可执行文件

  16. 16

    从JAR为AWS Lambda运行二进制可执行文件

  17. 17

    UiPath进程可以转换为二进制可执行文件吗?

  18. 18

    无法在Ubuntu 12.04上运行二进制可执行文件

  19. 19

    从Debian到Ubuntu的二进制可执行文件?

  20. 20

    为什么可执行文件需要二进制格式规范?

  21. 21

    Bash:将原始二进制变量用作可执行文件吗?

  22. 22

    使用LLVM工具将二进制数据嵌入可执行文件

  23. 23

    可执行文件上的通配符(二进制)

  24. 24

    在Mac上将Python3编译为二进制可执行文件

  25. 25

    是否可以将可执行文件/二进制文件(已构建)作为unikernels运行?

  26. 26

    漏洞扫描程序会扫描源代码还是可执行文件(二进制文件)?

  27. 27

    可执行文件(二进制文件)的标准命名惯例,以及如何判断文件是否具有不可打印的字符?

  28. 28

    使用依赖性pandoc-citeproc在Haskell中构建独立的二进制可执行文件

  29. 29

    将 C/C++ 二进制可执行文件作为 docker 容器运行

热门标签

归档