一个示例学习C语言到汇编层面

给出以下代码

c 复制代码
#include<stdio.h>
int main() {
	int x = 0, y = 0, z = 0;
	while (1) {
		x = 0;
		y = 1;
		do {
			printf("%d\n", x);
			z = x + y;
			x = y;
			y = z;
		} while (x < 255);
	}
	return 0;
}

我们把这个程序编写成32位程序,然后我们放入IDA中进行分析

bash 复制代码
.text:00801870 ; Attributes: bp-based frame
.text:00801870
.text:00801870 ; int __cdecl main()
.text:00801870 _main           proc near               ; CODE XREF: _main_0↑j
.text:00801870
.text:00801870 var_24          = byte ptr -24h
.text:00801870 z               = dword ptr -20h
.text:00801870 y               = dword ptr -14h
.text:00801870 x               = dword ptr -8
.text:00801870
.text:00801870                 push    ebp
.text:00801871                 mov     ebp, esp
.text:00801873                 sub     esp, 0E4h
.text:00801879                 push    ebx
.text:0080187A                 push    esi
.text:0080187B                 push    edi
.text:0080187C
.text:0080187C __$EncStackInitStart_1:
.text:0080187C                 lea     edi, [ebp+var_24]
.text:0080187F                 mov     ecx, 9
.text:00801884                 mov     eax, 0CCCCCCCCh
.text:00801889                 rep stosd
.text:0080188B
.text:0080188B __$EncStackInitEnd_1:                   ; JMC_flag
.text:0080188B                 mov     ecx, offset _C91CCFE8__@cpp
.text:00801890                 call    j_@__CheckForDebuggerJustMyCode@4 ; __CheckForDebuggerJustMyCode(x)
.text:00801895                 mov     [ebp+x], 0
.text:0080189C                 mov     [ebp+y], 0
.text:008018A3                 mov     [ebp+z], 0
.text:008018AA
.text:008018AA loc_8018AA:                             ; CODE XREF: _main+80↓j
.text:008018AA                 mov     eax, 1
.text:008018AF                 test    eax, eax
.text:008018B1                 jz      short loc_8018F2
.text:008018B3                 mov     [ebp+x], 0
.text:008018BA                 mov     [ebp+y], 1
.text:008018C1
.text:008018C1 loc_8018C1:                             ; CODE XREF: _main+7E↓j
.text:008018C1                 mov     eax, [ebp+x]
.text:008018C4                 push    eax
.text:008018C5                 push    offset _Format  ; "%d\n"
.text:008018CA                 call    j__printf
.text:008018CF                 add     esp, 8
.text:008018D2                 mov     eax, [ebp+x]
.text:008018D5                 add     eax, [ebp+y]
.text:008018D8                 mov     [ebp+z], eax
.text:008018DB                 mov     eax, [ebp+y]
.text:008018DE                 mov     [ebp+x], eax
.text:008018E1                 mov     eax, [ebp+z]
.text:008018E4                 mov     [ebp+y], eax
.text:008018E7                 cmp     [ebp+x], 0FFh
.text:008018EE                 jl      short loc_8018C1
.text:008018F0                 jmp     short loc_8018AA
.text:008018F2 ; ---------------------------------------------------------------------------
.text:008018F2
.text:008018F2 loc_8018F2:                             ; CODE XREF: _main+41↑j
.text:008018F2                 xor     eax, eax
.text:008018F4                 pop     edi
.text:008018F5                 pop     esi
.text:008018F6                 pop     ebx
.text:008018F7                 add     esp, 0E4h
.text:008018FD                 cmp     ebp, esp
.text:008018FF                 call    j___RTC_CheckEsp
.text:00801904                 mov     esp, ebp
.text:00801906                 pop     ebp
.text:00801907                 retn
.text:00801907 _main           endp
.text:00801907

下图部分这一部分,属于编译器包装的,对程序的初始化

这里我们先不做研究
以下这一段可以很明显看出对x,y,z

进行了初始化

所对应的部分

x和y在循环里的赋值如图

对于中间的循环部分

以上是大概的分析,接下来,我们进行细致的分析

当然了,在实际中,逆向分析的难度是很大的,这里只是方便大家理解学习,所以给了一个十六

相关推荐
数智工坊5 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
ZC跨境爬虫5 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
MartinYeung58 小时前
[论文学习]隐私保护联邦特徵选择与差分隐私的的工程实践框架
学习
qeen878 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
Flandern11119 小时前
Pull Requests(PR)
学习·github·pr
nashane10 小时前
HarmonyOS 6学习:JsCrash“闪退”法医指南——从FaultLog堆栈还原崩溃现场的终极手册
学习·华为·harmonyos
for_ever_love__10 小时前
UI学习:UICollectionView瀑布流
学习·ui·ios·objective-c·cocoa
AOwhisky10 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
_李小白10 小时前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习
提子拌饭13312 小时前
Column 嵌套布局:多级 Column 实现复杂纵向结构——鸿蒙 HarmonyOS ArkTS 原生学习应用
学习·华为·harmonyos·鸿蒙·鸿蒙系统