Main()函数的前世今生

news2025/2/26 3:31:23

        在开始分析程序之前,我们第一个要解决的问题,就是如何定位到main函数,想要从二进制逆向的角度分析出main函数,就必须要了解正向的代码下main函数的所有的细节和特

征。毕竟逆向的本质就是正向。

调用main()堆栈

样例代码

#include <stdio.h>


int main()
{
	printf("Hello World!");

	return 0;
}

通过VS2019查看main()函数调用的堆栈空间

转到mainCRTStartup()的反汇编,这是C++程序执行的第一个函数

mainCRTStartup先调用__scrt_common_main函数

转到__scrt_common_main()的反汇编

在反汇编代码中,__scrt_common_main第二个调用函数是__scrt_common_main_seh

之后__scrt_common_main_seh调用invoke_main()

转到invoke_main()的反汇编,发现调用 _main()函数

回到源代码

这就到main函数了,这里就到了main函数了,这里main函数有三个参数,分别是

  • __argc是参数个数
  • __argv是参数列表
  • 最后一个是环境指针
里面的每一个参数都是单独的一个函数

可以得出规律

  1. mainCRTStartup调用__scrt_common_main
  2. __scrt_common_main调用__scrt_common_main_seh,对应汇编是在第二个call上
  3. __scrt_common_main_seh调用invoke_main,对应在汇编的特征如下:
    1. int const main_result = invoke_main();源码是赋值给一个变量
    2. 这个函数参数是0个,后面会跟exit函数,exit函数的参数 是 invoke_main 的返回值
    3. call指令后面必有一个mov [ebp-0xXXX],eax
  4. invoke_main调用main

x64dbg定位main函数

进入程序入口,调用mainCRTStartup函数

调用__scrt_common_main函数

调用_scrt_common_main_seh

调用invoke_main比较复杂,先分析一下它的特征,在scrt_common_main_seh

会把invoke_main的返回值给main_result
int const main_result = invoke_main();


返回值会伴随一个exit 和 一个main_result,必然有一个ret
if (!__scrt_is_managed_app())
   exit(main_result);

return main_result;

定位invoke_main方法:

  1. 找到第一个ret
  2. 定位到call XXXX
  3. call指令后面必有一个mov [ebp-0xXXX],eax

定位ret

定位invoke_main()

在这里会看到四个函数调用,最后一个才是 main 函数

定位到main()函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生】Kubeadmin安装k8s集群

目录 前言&#xff1a; 一 环境部署 1.1 服务器部署功能 1.2 环境准备&#xff08;所有节点&#xff09; 二 安装docker&#xff08;所有节点&#xff09; 三 所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1 定义kubernetes源 3.2 开机自启kubelet 四 部署K8S集…

ipad协议最新版

个人微信号的二次开发可以包括但不限于以下方面&#xff1a; 自定义菜单&#xff1a;根据个人需求设置自定义&#xff0c;方便快速访问常用功能或链接。 消息管理&#xff1a;通过开发接口&#xff0c;实现消息的自动回复、关键词匹配等功能&#xff0c;提供更好的用户体验。…

国产SSD的0e可靠性问题如何解决?

最近有粉丝在后台私信询问过程NAND的0e问题,觉得有必要跟大家聊聊小编的一些看法和SSD选购相关的注意事项。 说实话,小编看到0e这个词还一时间还有点恍惚了,0e是啥,我还搜索了一下,发现还挺多的。主要是长江存储和三星的词条。 点开才发现,原来0e是Media Error啊,恕我孤…

软件测试:黑盒测试用例的四种设计方法

一、输入域测试用例设计方法 输入域测试法是一种综合考虑了等价类划分、边界值分析等方法的综合方法&#xff0c;针对输入域测试法中可能出现的各种情况&#xff0c;输入域测试法主要考虑三个方面&#xff1a;  (1)极端测试(ExtremalTesting)&#xff0c;要求在输入域中选择测…

【计算机基础知识10】解析黑窗口CMD:认识CMD及常见命令

目录 一、前言 二、CMD的基本知识 三、CMD常见命令分类 1. 文件和目录管理命令 1.1 列出文件和目录&#xff1a;dir 1.2 创建目录&#xff1a;mkdir 1.3 删除目录&#xff1a;rmdir 1.4 复制文件或目录&#xff1a;copy 1.5 移动文件或目录&#xff1a;move 2. 系统信…

容器编排学习(七)控制器介绍与使用

一 控制器 控制器是 k8s内置的管理工具。可以帮助用户实现 Pod的自动部署、自维护、扩容、滚动更新等功能的自动化程序。 为什么要使用控制器? 有大量的 Pod需要维护管理需要维护 Pod的健康状态控制器可以像机器人一样可以替用户完成维护管理的工作 二 Deployment 1 概…

爬虫逆向实战(31)-某花顺行情中心(cookie、补环境)

一、数据接口分析 主页地址&#xff1a;某花顺 1、抓包 通过抓包可以发现数据接口是/page/2/ajax/1/ 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 通过查看“标头”可以发现有一个Hexin-V加密参数&#xff0c;但是这个参数的值与c…

搭建自己的OCR服务,第二步:PaddleOCR环境安装

PaddleOCR环境安装&#xff0c;遇到了很多问题&#xff0c;根据系统不同问题也不同&#xff0c;不要盲目看别人的教程&#xff0c;有的教程也过时了&#xff0c;根据实际情况自己调整。 我这边目前是使用windows 10系统CPU python 3.7 搭建。 熟悉OCR的人应该知道&#xff0…

PostgresSQL----基于Kubernetes部署PostgresSQL

【PostgresSQL----基于Kubernetes部署PostgresSQL】 文章目录 一、创建SC、PV和PVC存储对象1.1 准备一个nfs服务器1.2 编写SC、PV、PVC等存储资源文件1.3 编写部署PostgresSQL数据库的资源声明文件 二、部署PostgresSQL2.1 部署 PV、PVC等存储对象2.2 部署PostgresSQL数据库2.3…

SpringMVC之前端增删改查实现

SpringMVC是一个基于MVC架构的框架&#xff0c;它可以帮助我们实现前后端的分离&#xff0c;同时也能很好地支持前端的增删改查操作。 配置 Cloudjun <?xml version"1.0" encoding"UTF-8" ?><taglib xmlns"http://java.sun.com/xml/ns/j…

Spring 家族框架常用注解

反射相关 Target Spring核心注解&#xff0c;指定自定义注解MyAnno可以应用到的java类型,从而提供编译时的类型检查和错误检测 指定类型时用枚举类ElementType下的具体枚举值&#xff0c;包括&#xff1a;ElementType.TYPE&#xff1a;表示MyAnno适用于类、接口、枚举。Eleme…

Java多线程(一)多线程概要

多线程概要 多线程概要 什么是进程&#xff1f; 进程的特点&#xff1a; 什么是多线程 多线程编程&#xff1a; 创建线程 1.继承 Thread 类 2.实现 Runnable 接口 多线程的优势 中断问题&#xff1a; 1. 通过共享的标记来进行沟通 2. 调用 interrupt() 方法来通知 …

flutter开发实战-实现自定义bottomNavigationBar样式awesome_bottom_bar

flutter开发实战-实现自定义bottomNavigationBar样式awesome_bottom_bar 在开发过程中&#xff0c;需要自定义bottomNavigationBar样式&#xff0c;可以自定义实现&#xff0c;这里使用的是awesome_bottom_bar库 一、awesome_bottom_bar 在pubspec.yaml中引入awesome_bottom_…

滑动谜题 -- BFS

滑动谜题 输入&#xff1a;board [[4,1,2],[5,0,3]] 输出&#xff1a;5 解释&#xff1a; 最少完成谜板的最少移动次数是 5 &#xff0c; 一种移动路径: 尚未移动: [[4,1,2],[5,0,3]] 移动 1 次: [[4,1,2],[0,5,3]] 移动 2 次: [[0,1,2],[4,5,3]] 移动 3 次: [[1,0,2],[4,5,3]…

前端实现展开收起的效果 (react)

需求背景&#xff1a;需要实现文本的展开收起效果&#xff0c;文本是一行一行的&#xff0c;数据格式是数组结构。 如图所示&#xff08;图片已脱敏&#xff09; 简单实现&#xff1a;使用一个变量控制展开收起效果。 展开收起逻辑部分&#xff08;react&#xff09; const […

layer is not a constructor缺少报错解决方案参考开发教程并在相关页面引入

问题场景&#xff1a; 1.在使用Mars3d热力图功能时&#xff0c;提示mars3d.layer.HeatLayer is not a constructor 问题原因: 1.mars3d的热力图插件mars3d-heatmap没有安装引用。 解决方案&#xff1a; 1.参考开发教程&#xff0c;找到相关的插件库&#xff1a;Mars3D 三维…

Power BI依据列中值的范围不同计算公式增加一列

Power BI依据列的范围不同计算公式增加一列&#xff0c;在我们遇到了依据范围不同的公式计算时&#xff0c;就可以采用下面公式 一、增加组计算公式 佣金分组 SWITCH(TRUE(), ry_vue clawer_zhuan[到手价]>0&&ry_vue clawer_zhuan[到手价]<475,80, ry_vue claw…

华为OD机考算法题:数字加减游戏

目录 题目部分 解读与分析 代码实现 题目部分 题目数字加减游戏难度难题目说明小明在玩一个数字加减游戏&#xff0c;只使用加法或者减法&#xff0c;将一个数字 s 变成数字 t 。 每个回合&#xff0c;小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减…

华为云云耀云服务器L实例评测|华为云上试用主机安全产品Elkeid

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上试用主机安全产品Elkeid一、背景&#xff1a;什么是主机安全二、主机安全之Elkeid1. Elkeid 介绍2. Elkeid Server3. Elkeid Server 架构Elkeid AgentCenter&#xff08;下面简称AC&#xff09;Elkeid Service Discov…

[构建自己的 Vue 组件库] 小尾巴 UI 组件库

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee&#xff1a…