从汇编层看64位程序运行——静态分析和动态分析入门

大纲

之前一直谈各种相对宏观的工具怎么使用,比如Flink、RabbitMQ等。最近想聊聊比较微观的技术,用各种"显微镜"去看看运行在系统层的二进制码是什么样子。当然二进制码比较难以记忆,于是我会从二进制码的助记符------汇编层面去分析程序运行的一些"套路",进而展开我们平时会忽略的微观世界。

这系列文章,面向有一定计算机基础、对底层比较感兴趣的朋友。但是我也会尽量用比较简单的语言,把整个系列的知识点讲明白。

相较于之前,我比较多的分析Windows上程序的汇编码(比如《反汇编》这个系列)。本系列将着重分析Linux系统上的程序的汇编码。同时又不想引入太过复杂的各种设计,尽量简单明了地还原底层本来的面貌,于是我是用的是C语言去写代码,然后将编译结果通过静态分析工具和动态分析工具去反汇编。

工欲善其事必先利其器,这次系列我们将主要使用两个工具去分析:GDB和IDA。

GDB

GDB是一个非常常用的调试工具,我们可以使用它来追踪运行时的程序,主要用于动态分析。

以后面要分析的程序(simple_main)为例,可以使用下面的命令来做调试

bash 复制代码
 gdb bin/simple_main

然后我们给main函数下一个端点

bash 复制代码
b main

然后运行该程序

bash 复制代码
r

断点命中后,我们可以分析此时的寄存器信息

bash 复制代码
info registers

以及查看这些寄存器所指向区域的数据或者代码

比如我们要看栈上数据

bash 复制代码
x /-16xg $rbp

或者看RIP指向的代码

bash 复制代码
disassemble $rip

然后通过单步调试等方法,查看相关寄存器和内存的变化

GDB非常强大,但是需要记下很多命令,而且其交互所展现的信息量也比较有限。如果只是做代码查看性分析,而不需要其运行态的一些信息,则可以考虑使用下面介绍的静态分析工具IDA。

IDA

相较于GDB,IDA有着优秀的可视化界面,大大降低了大型工程分析的难度。

本系列我们将在Windows上使用IDA分析Linux上的程序。

针对上例, 我们把Linux上的程序simple_main拷贝到本地(我用的是Vscode远程连接Linux开发)。

然后在IDA中打开

在左侧Function name中可以看到一系列函数名称,右侧则是对应的函数的汇编。如上图是main函数的汇编。

我们可以双击main函数中call foo这行,会直接跳到foo函数的实现

如果觉得上面信息比较简单,可以使用Text view模式

然后可以看到连续的大段代码

如上图,我们看到foo函数和main函数在二进制码层面,是连续布局的。

总结

本文我们只是做一个简单的介绍,后续我们将使用这些工具以及其他更多的工具,来深入分析软件在系统上运行的情况,以期展现出计算机微观世界的精彩设计。

参考资料

相关推荐
索端阳11 小时前
初识 ARM Cortex-A7,嵌入式底层入门总结
汇编·嵌入式硬件
ThornArmor1 天前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
星栖与芯1 天前
LiteOS-M 切换汇编逐行图解(1):汇编是什么·寄存器与栈
汇编·stm32·嵌入式硬件·harmonyos·鸿蒙系统
yume_sibai2 天前
11-Rust 不安全编程(unsafe 关键字 + 裸指针 + FFI + 内联汇编 + 内存安全保证)
汇编·安全·rust
小杨不想秃头4 天前
信息安全工程师 历年真题原题汇编(2016–2025)
汇编
2601_9622965113 天前
C/C++:编译全过程——预处理、编译、汇编、链接(包含预处理指令:宏定义,文件包括、条件编译)
汇编·预处理·链接·c/c++·编译过程
Freak嵌入式13 天前
Pico PIO 汇编语法深度详解:标识符、指令、伪指令全解析
汇编·stm32·单片机·嵌入式硬件·fpga开发·硬件架构
kyle~19 天前
x86 汇编LOCK前缀 --- 硬件架构向软件提供的核心同步原语
汇编·c++·性能优化·硬件架构·实时系统
典典分享指南19 天前
飞书 + 企业微信 + 微信文档多端协同实践指南
汇编·flask·intellij-idea·fastapi
极客互动API24 天前
企业微信 iPad 协议服务搭建与 AI 回调实战
网络·汇编·人工智能·微信·企业微信·ipad