【问题标题】:mingw-w64 pure assembler code without additional (redundancy) infomingw-w64 纯汇编代码,没有额外(冗余)信息
【发布时间】:2020-06-01 14:15:16
【问题描述】:

我正在学习逆向工程。我试图将代码编译到汇编器视图以便更好地理解。如何禁用汇编代码中的任何其他(冗余)信息?我只想留下纯汇编代码

当前命令(windows)gcc -S .\test.c -masm=intel -O0

输出:

    .file   "test.c"
    .intel_syntax noprefix
    .text
    .def    __main; .scl    2;  .type   32; .endef
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 32
    .seh_stackalloc 32
    .seh_endprologue
    call    __main
    nop
    add rsp, 32
    pop rbp
    ret
    .seh_endproc
    .ident  "GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0"

此输出产生冗余信息。例如,我可以删除.file "test.c",它不会影响任何东西。

来源:

void main() {
    }

【问题讨论】:

  • 如果您只需要组装,那么与任何 反汇编器 提供给您的有什么区别?特别是,如果您使用调试符号进行编译。所有这些冗余信息都是你在编译时丢失的高级细节,如果你让 GCC 生成一个汇编文件来简化你的逆向工程,你为什么要删除它们?
  • 目前只问编译,不反汇编
  • 我不明白,但你可以通过简单地丢弃以点开头的行来获得很长的路要走。

标签: assembly mingw reverse-engineering mingw-w64


【解决方案1】:

gcc -s 是去除符号的选项。但是,您可以在之后运行 strip 以删除仍可能包含的额外数据。

What is the difference between "gcc -s" and a "strip" command?

但是,这主要影响最终的二进制文件,而不一定是您使用-S 获得的源代码。

如果您想更好地理解代码,我建议将其编译为二进制文件并将其加载到调试器中进行检查,并保留生成的 asm 源代码作为参考。

【讨论】:

  • 我正在这样做,但目前,我对源 asm 的理解不太好 :)
  • 但这是学习的一部分。我将从一个很小的例子开始。例如添加一些数字并打印出来。然后你必须隔离打印部分,你可以很好地看到程序的其余部分被编译成什么。显然你不会从一个复杂的程序开始,所以你可以控制你能消化多少。你应该在调试模式下编译,或者至少没有任何优化和调试。除非你知道如何打败优化器,因为它会干扰你想看到的东西。
猜你喜欢
  • 1970-01-01
  • 2015-04-26
  • 2018-05-17
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2012-05-28
相关资源
最近更新 更多