如下,通过vc6.0编写一个hello world程序。尝试结合汇编代码、分析启动函数找到main函数。

  在printf(xxx)插入断点,调试执行。如下,在堆栈窗口中可见main()下的一个函数mainCRTStartup()。mainCRTStartup函数是连接器对控制台程序设置的入口函数,此函数会调用main函数。

  双击mainCRTStartup 函数,可调准到基本文件CRT0.c中,此文件定义了启动的规则,也就是说程序首先是从这里运行的,然后才调用运行main()函数的。OD打开此exe文件,结合分析。如下,可知exe文件先有调用GetVersion()函数,此函数获取系统的版本号。

  然后它有调用_ioinit()函数...最后发现它调用setargv()、setenvp()、_cinit()函数后,跳转到test4.00401005,这儿是什么函数捏?对照CRT0.c,发现后面的语句就是跳转到main()函数了,尝试进入test4.00401005,没有错,看到了hello world等关键信息,可知确实进入了main()函数,如下图所示。因此可知通过这种方式定位main()函数的方法主要是找到连续的三个call(setargv、setenvp、cinit),下一个call就是跳转想main处-。-
 

知识点总结:
mainCRTStartup函数是连接器对控制台程序设置的入口函数,此函数会调用进入程序的main函数。
CRT0.c文件定义了启动的规则,也就是说应用程序的运行顺序。
通过启动函数mainCRTStartup找main()的方式是:找到连续的三个call(setargv、setenvp、cinit ),下一个call指令就会跳转到main()处。
 
 

通过启动函数定位main()函数的更多相关文章

  1. C语言中的main函数以及main函数是如何被调用的

    main函数是C语言中比较特殊的函数,C程序总是从main函数开始执行,main函数的原型是: int main(int argc, char *argv[]); 其中argc是命令行参数的个数,ar ...

  2. golang中的init函数以及main函数

    首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次. main函数 main 函数只能在package ma ...

  3. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  4. main函数和启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hello.s -o hello ...

  5. 第七章之main函数和启动例程

    main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hell ...

  6. Linux0.11从开机到准备执行main函数的启动学习

    最近一直在看操作系统以及内核设计的东西,不确定自己有能力会参与到类似的开发之中,但是争取能自己改造这内核玩一下,然后按照Linux From Scratch那样的把改造后的系统编译运行就心满意足了.正 ...

  7. SequoiaDB 系列之五 :源码分析之main函数

    好久好久没有写博客了,因为一直要做各种事,工作上的,生活上的,这一下就是半年. 时光如梭. 这两天回头看了看写的博客,感觉都是贻笑大方. 但是还是想坚持把SequoiaDB系列写完. 初步的打算已经确 ...

  8. main函数执行前、后再执行的代码

    一.main结束 不代表整个进程结束  (1)全局对象的构造函数会在main 函数之前执行,          全局对象的析构函数会在main函数之后执行:          用atexit注册的函数 ...

  9. WPF点滴(1) Main 函数

    应用程序的入口函数是main函数,在Console程序和Winform程序main函数都有清晰的定义,可以很容易找到,但是WPF的工程文件中却找不到main函数的定义,是WPF不需要main函数吗?N ...

随机推荐

  1. 使外部主机可访问Django服务

    欲让外部主机可访问Django的服务器,需使用如下命令开启服务 python manage.py runserver 0.0.0.0:8000

  2. asp.net 动态更改 Request.Header

    public class Dev_Sim: IHttpModule { public void Init(HttpApplication app) { app.BeginRequest += dele ...

  3. C++ Primer Plus (Stephen Prata 著)

    第1章 预备知识 (已看) 第2章 开始学习C++ (已看) 第3章 处理数据 (已看) 第4章 复合类型 (已看) 第5章 循环和关系表达式 (已看) 第6章 分支语句和逻辑运算符 (已看) 第7章 ...

  4. Parallel Programming for FPGAs 学习笔记(1)

    Parallel Programming for FPGAs 学习笔记(1)

  5. Spring boot 配置 mybatis xml和动态SQL 分页配置

    更新时间 2018年4月30日23:27:07 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  6. 如何增加黑客通过ssh入侵的难度--保护ssh的三把锁

    源文档:https://blog.csdn.net/cnbird2008/article/details/6130696 简介 如果需要远程访问计算机并启用了 Secure Shell (SSH) 连 ...

  7. Azure SQL 数据库仓库Data Warehouse (4) 2018 TechSummit 动手实验营

    <Windows Azure Platform 系列文章目录> 上传一下之前在2018 TechSummit的动手实验营:Azure数据仓库PaaS项目架构规划与实战入门 包含PPT和Wo ...

  8. Linux中加速访问github

    1. 登录http://tool.chinaz.com/dns/ 2. 查询以下域名映射,并分别取访问速度较快的一个ip github.global.ssl.fastly.net   ->    ...

  9. [UE4]Size Box

    一.Size Box用来指定一个特定的尺寸 二.Size Box只能放一个子控件 三.Size Box一般作为Canvas Panel的子控件,并勾选Size To Content选项,而不作为根节点 ...

  10. 第二章 FFmpeg常用命令

    2.1 FFmpeg常见的命令大概分为6个部分 ffmpeg信息查询部分 公共操作参数部分 文件主要操作参数部分 视频操作参数部分 字幕操作参数部分 2.1.1 FFmpeg的封装转换 FFmpeg ...