disassembly相关内容
有许多关于如何将SSA表示转换为堆栈计算机的问题,但我对相反的情况很感兴趣。 问题 考虑具有有条件/无条件跳转的基于堆栈的VM,其中每个操作码都有固定数量的它消耗和生成的堆栈元素。 LLVM框架中是否有工具/方法可以从字节码输出重构SSA表单。这实质上是一种反汇编形式。 llvm 推荐答案本身没有工具,只是sSMoP。我已经做到了。有些是困难的,但任何事情都是困难的。
..
我试图通过使用 gdb 的反汇编程序检查一个简单的 C 程序的汇编级代码. 以下是C代码: #include 无效函数(int a,int b,int c){字符缓冲区1[5];字符缓冲区2[10];}无效的主要(){函数(1,2,3);} 以下是 main 和 function 的反汇编代码 gdb) disass main函数 main 的汇编代码转储:0x08
..
这是我的程序: void test_function(int a, int b, int c, int d){整数标志;字符缓冲区[10];标志 = 31337;缓冲区[0] = 'A';}int main() {test_function(1, 2, 3, 4);} 我用调试选项编译这个程序: gcc -g my_program.c 我使用 gdb 并使用 intel 语法反汇编 tes
..
我正在尝试反汇编程序以查看 syscall 汇编指令(我相信是 INT 指令)和带有 GDB 的处理程序,并为它编写了一个小程序(见下文),用于打开和关闭文件. 我能够使用 GDB 跟踪对 fopen 的调用,直到它执行调用为止. 当我试图告诉 GDB“反汇编 0x...."(调用地址)时,它的响应是“没有函数包含指定的地址." 是否可以强制 GDB 反汇编(或在汇编器中尽可能好
..
在(32 位)ARM Linux 内核中,如何区分嵌入在代码段中的数据和指令? 最好有一个轻量级的方法,比如位掩码,可以很容易地实现.将反编译器嵌入内核是不明智的. 解决方案 一般来说,你要求的是不可能的. 考虑一下这个函数,它碰巧使用了一个太大而无法编码为立即数的数据值: @ void patch_nop(void *code_addr);补丁号:ldr r1, =0xe1
..
我正在学习编译器课程,程序编译如下步骤 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成. 如何查看每个步骤的输出,例如我想在语法分析后查看解析树. 我正在使用 GCC 编译器在 Linux 机器上编译程序. 我们可以在gcc中使用-Wa编译器选项查看程序的汇编代码,同样有查看Tokens、Parse tree和Inetmediate code的
..
我知道在我的文件中使用 objdump -dr 时 call 在机器代码中显示为 e8 00 00 00 00 因为它没有尚未被链接.但我需要找出链接器完成工作后 00 00 00 00 会变成什么.我知道它应该计算偏移量,但我对此有点困惑. 以下面的代码为例,链接器部分完成后,e8 00 00 00 00应该如何?我如何得到这个答案? 我正在使用此示例代码进行测试:(我正在尝试调用
..
我回复了 另一个关于使用非 Objective-C 语言为 iPhone 开发的问题,我断言使用 C# 为 iPhone 编写会令 Apple 审稿人犯错.我主要是在谈论所讨论的 ObjC 和 C# 库之间的 UI 元素不同,但一位评论者提出了一个有趣的观点,让我想到了这个问题: 是否有可能仅从其二进制文件中确定程序的编写语言?如果有这样的方法,它们是什么? 让我们假设问题的目的:
..
我用 c 编写了一个简单的程序,它调用一个名为 while_loop 的函数,参数为 4,3,2.该函数基本上只是一个 while 循环,我认为它与我的问题并不真正相关,因为它更像是一个通用问题.有人告诉我运行 objdump -d,所以我做了. 我有多个问题,所以这里是: 我知道在最左边的列中有地址,它们根据前面的字节数递增.我不太明白的是第二列.它是正在执行的指令,但是是十六进制的
..
有没有办法做到这一点?我已经使用了 objdump,但它不会产生任何我知道的任何汇编程序都会接受的汇编输出.我希望能够更改可执行文件中的指令,然后再对其进行测试. 解决方案 我认为没有任何可靠的方法可以做到这一点.机器码格式非常复杂,比汇编文件还要复杂.实际上不可能采用编译后的二进制文件(例如,ELF 格式)并生成一个源汇编程序,该程序将编译为相同(或足够相似)的二进制文件.要了解差异,请
..
我想将 X86_64、x86、ARM 可执行文件翻译成 LLVM IR(反汇编). 您建议什么解决方案? 解决方案 mcsema 是一个生产质量的二进制提升器.它需要 x86 和 x86-64 并静态“提升"到 LLVM IR.它得到积极维护,获得 BSD 许可,并拥有大量测试和文档. https://github.com/trailofbits/mcsema
..
我需要从内存中的一小段代码中逐条读取指令,并且必须找出内存中指令的大小. 以下只是解释我的问题的原始反汇编代码示例: (gdb) disas/r 0x400281,+8将汇编代码从 0x400281 转储到 0x400289:0x0000000000400281: 48 89 c7 movq %rax, %rdi0x0000000000400284: b0 00 movb $0, %al
..
如何查看 C++ 程序的汇编代码? 有哪些流行的工具可以做到这一点? 解决方案 询问编译器 如果您自己构建程序,您可以要求您的编译器发出汇编源代码.对于大多数 UNIX 编译器,使用 -S 开关. 如果您使用的是 GNU 汇编程序,则使用 -g -Wa,-alh 进行编译将在标准输出上提供混合的源代码和程序集(-Wa 询问编译器驱动程序将选项传递给汇编程序,-al 打开汇
..
有人告诉我使用反汇编程序.gcc 有内置的东西吗?最简单的方法是什么? 解决方案 我不认为 gcc 有标志,因为它主要是一个编译器,但另一个 GNU 开发工具有.objdump 需要一个 -d/--disassemble 标志: $ objdump -d/path/to/binary 反汇编如下: 080483b4 :80483b4: 8d 4c 24 04 lea 0x4(%esp
..
0x00000000004004b6 : callq 0x400398 有人知道吗? 更新 为什么两个 disas printf 给我不同的结果? (gdb) disas printf函数 printf@plt 的汇编代码转储:0x0000000000400398 : jmpq *0x2004c2(%rip) # 0x600860
..
例如,对于引导扇区,BIOS 将 a 打印到屏幕 main.asm: org 0x7c00位 16命令行移动斧头,0x0E61整数 0x10高时间 510 - ($-$$) db 0dw 0xaa55 那么: nasm -o main.img main.asmqemu-system-i386 -hda main.img -S -s &gdb -ex '目标远程本地主机:1234' \-ex
..
我正在学习编译器课程,程序的编译遵循以下步骤 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成. 如何查看每个步骤的输出,例如我想在语法分析后查看解析树. 我正在使用 GCC 编译器在 Linux 机器上编译程序. 我们可以通过gcc中的-Wa编译器选项查看程序的汇编代码,类似的还有查看Tokens、Parse tree和Inetmediate代
..
我已经使用 Visual Studio C++ 2008 SP1,x64 C++ 编译器编译了以下内容: 我很好奇,为什么编译器要在那些 call 之后添加那些 nop 指令? PS1.我会理解第二个和第三个 nop 将在 4 个字节的边距上对齐代码,但第一个 nop 打破了这个假设. PS2.编译的 C++ 代码中没有循环或特殊的优化内容: CTestDlg::CTestDl
..
我需要一些帮助来理解 GCC 这样做的原因 主要:pushl %ebpmovl %esp, %ebp还有 $-16, %esp # ???subl $48, %esp # ???movl $8, 16(%esp)移动 $4, 20(%esp) 为什么要先减16,然后再减48?做 subl $64, %esp 不是更容易吗? 解决方案 andl $-16, %esp # ??? 上一行
..
我一直在尝试了解用于 ASM x64 指令的 0x40 REX 操作码的用途.例如,在 Kernel32.dll 的这个函数序言中: 如你所见,他们使用 push rbx 作为: 40 53 push rbx 但仅使用 53h 操作码(不带前缀)也会产生相同的结果: 根据本站,REX前缀的布局如下: 所以 40h 操作码似乎没有做任何事情.有人能解释一下它的用途吗? 解
..