实验环境:WIN7虚拟机
软件:VC6

首先在VC6里面写一个空函数Fun();

F7编译运行一下,没有出错,接着在函数处使用F9下断点,使程序运行到Fun函数时停下。

接着F5开始运行这个程序

程序停在了Fun函数处,反汇编进去进行逆向分析


可以看到程序停在Fun函数的入口处,这里的call就是Fun函数的入口,F11跟进去进行分析。

原始堆栈图是这样的。

0040D408 call @ILT+5(_Fun) (0040100a)

F11,跟进这个call进行分析,进入函数之后编译器会将跳出函数之后下一个要执行的地址压入堆栈,即将0040D40D压入堆栈,同时esp-4,esp变成0012FEF8,这时的堆栈是这样的:

跟进来之后是一个jmp,F11直接跳转。

现在进到函数里面了

00401010 push ebp

首先将ebp压栈,就是将[ebp]压入堆栈,即将0012FF48压入堆栈,然后esp的位置向上提升一个变为0012FEF4。

查看检查寄存器进行验证:

00401011 mov ebp,esp

将esp的值赋给ebp,也就是将0012FEF4赋给ebp,这时的堆栈图是这样的

查看寄存器验证,这里可以看到esp和ebp的值相等,说明上面那个堆栈图没有问题

00401013 sub esp,40h

将esp减去40h,也就是将esp的位置提升到0012FEB4位置,这一步的作用是提升堆栈,这时的堆栈图是这样的

查看寄存器进行验证,看到esp的值为0012FEB4

00401016 push ebx

接着将ebx压栈,查看栈顶可以看到ebx被压入堆栈,同时esp的位置向上提升。


此时的堆栈是这样的:

00401017 push esi

将esi的值压入堆栈,此时的堆栈是这样的


查看寄存器进行验证:

00401018 push edi

接着将edi的值压入堆栈,此时的堆栈是这样的


查看寄存器验证:

00401019 lea edi,[ebp-40h]

将[ebp-40h]的地址存入edi中,也就是将0012FEB4存入edi。

查看寄存器验证,可以看到0012FEB4被存入edi中

0040101C mov ecx,10h

将10h存入ecx中,也就是将00000010存入ecx,查看寄存器验证:

00401021 mov eax,0CCCCCCCCh

将CCCCCCCC存入eax中,查看寄存器验证:

00401026 rep stos dword ptr [edi]

将eax的中的值存储到[edi]对应地址的内存中,并重复ecx次,也就是将CCCCCCCC存入地址0012FEB4对应的内存中,并重复10h次,rep每执行一次,[edi]会相应的加4(向下填充数值),ecx会相应的减4(减少执行次数)。

此时的堆栈是这样的:


查看寄存器验证一下,发现从0012FEF4到0012FEB4全部被填充为CCCCCCCC。

00401028 pop edi

将edi出栈,也就是将esp当前对应的值0012FF48赋给edi,同时esp加4变成0012FEAC,此时的堆栈


查看寄存器验证:

00401029 pop esi

将esi出栈,也就是将esp当前对应的值00000000赋给edi,同时esp加4变成0012FEB0,此时的堆栈


查看寄存器验证:

0040102A pop ebx

将ebx出栈,也就是将esp当前对应的值7FFDD000赋给ebx,同时esp加4变成0012FEB4,此时的堆栈


查看寄存器验证一下:

0040102B mov esp,ebp

将ebp的值赋给esp,这里的作用相当于降低堆栈,此时的堆栈是这样的


查看寄存器进行验证,esp的值和ebp的值相等

0040102D pop ebp

将ebp出栈,也就是将esp当前对应的值0012FF48赋给ebx,这时ebx又回到了一开始所在的位置,同时esp加4变成0012FEF8,此时的堆栈是这样的


查看寄存器验证一下

0040102E C3 ret

相当于pop eip,即将当前esp对应的值放入eip中,也就是将0040D40D放入eip中,同时ESP+4,esp变为0012FEFC,此时的堆栈是这样的


查看寄存器验证一下,至此堆栈恢复平衡,Fun函数执行完毕

逆向学习周记-C语言空函数的更多相关文章

  1. 空函数有参函数调用参数的注意事项Swift 1.1语言

    空函数有参函数调用参数的注意事项Swift 1.1语言 7.2.3  空函数 空函数有参函数调用参数的注意事项Swift 1.1语言空函数是函数中最简单的形式.在空函数中,函数只有一个空壳,里面是没有 ...

  2. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  3. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  4. c语言学习笔记(8)——函数

    学完c语言的函数可以理解面向过程的语言 函数是c语言的重点 一.为什么需要函数? 1.避免了重复性操作 2.有利于程序的模块化(每一个功能可以用不同函数去实现) 二.什么叫做函数? 逻辑上:能够完成特 ...

  5. iOS学习之C语言函数

    一.函数的定义 返回值类型 函数名(参数类型 参数名, ...) { 功能语句; return 返回值; } 按照返回值和参数划分: 第一种: 无返回值 无参 void sayHello() { pr ...

  6. 【学习笔记】【C语言】函数

    一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...

  7. GO学习-(12) Go语言基础之函数

    Go语言基础之函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民 ...

  8. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  9. 【C语言】函数和自定义函数

    函数,我之前也提到过一点点内容.其实函数是很好理解的,但是写起来又十分麻烦. 一.     函数引入 我们知道,C源程序是由函数组成的.请看下面的简单函数例子 #include <stdio.h ...

随机推荐

  1. Python3 数据结构之词频统计(英文)

    import string path = r'C:\Users\Black\Desktop\Walden.txt' with open(path, 'r', encoding='utf-8') as ...

  2. hbuilder/hbuilderx 无法检测到模拟器

    常用模拟器的端口 夜神模拟器 端口号 :62001 海马玩模拟器 端口号:26944 网易mumu模拟器端口号:7555 天天模拟器 端口号:6555 AndroidStudio自带模拟器 端口号: ...

  3. Java_输入整数求阶乘

    import java.util.Scanner;public class Work4{ public static void main(String[] args){ // 创建Scanner对象 ...

  4. 想要金九银十面试通关,不懂 Java多线程肯定是不行的!

    作者 | 纳达丶无忌 如果对什么是线程.什么是进程仍存有疑惑,请先 Google 之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用 CPU 的资源,因为所有的多线程代码都 ...

  5. 你不知道的JavaScript(上)this和对象原型(一)

    第一章  关于this 1.this 既不指向函数自身也不指向函数的词法作用域 2.this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用(调用位置). 第二章 this全面 ...

  6. Real World CTF一日游

    今天去感受了长亭举办的RWCTF现场,参加了技术论坛,也学到了很多的知识 比较有印象的就是 智能安全在Web防护中的探索和实践 阿里云安全防护构建的AI架构体系: 基线检测 基础过滤 异常检测 攻击识 ...

  7. ASP.NET Core知多少(13):路由重写及重定向

    背景 在做微信公众号的改版工作,之前的业务逻辑全塞在一个控制器中,现需要将其按厂家拆分,但要求入口不变. 拆分很简单,定义控制器基类,添加公用虚方法并实现,各个厂家按需重载. 但如何根据统一的入口参数 ...

  8. shell概述与echo命令

    一.Shell概述 1.什么是shell? 由此可见shell是用户与系统进行交互的接口,通过执行各种命令来完成时间处理与调度. 2.shell分类 Shell类别 易学性 可移植性 编辑性 快捷性 ...

  9. [译]C# 7系列,Part 2: Async Main 异步Main方法

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...

  10. c++-友元函数和友元类

    友元函数 友元函数和友元类(破坏类的封装性) 面向对象编程思想 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include & ...