逆向程序分析:Windows的main(),启动函数分析

《C++反汇编与逆向分析技术揭秘》笔记-第3章认识启动函数,找到用户入口 C++反汇编揭秘 阅读详情

Windows main 启动函数分析

实验环境

Windows10
Vs2015
x86程序

启动函数

C/C++的运行时启动函数,该函数负责对C/C++运行库进行初始化。

启动函数的作用:

检索指向新进程的命令行指针、检索指向新进程的环境变量指针、全局变量初始化、内存初始化等。

当所有的初始化操作完成之后,启动函数会调用应用程序的进入点函数。

调试实战

我们写一个简单的main函数,然后F5进入调试。

在这里插入图片描述

mainCRTStartup()

这个函数调用了__scrt_common_main(),我们直接来看它。

__scrt_common_main()

发现这个函数主要在做,GS和SEH检查,这俩个检查主要是防止内存溢出的,想要了解的可以进一步了解一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DIZhl3mz-1634980724377)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211023170621872.png)]

__scrt_common_main_seh()

这里代码比较多,直接贴出来

static __declspec(noinline) int __cdecl __scrt_common_main_seh() throw()
{
    if (!__scrt_initialize_crt(__scrt_module_type::exe))
        __scrt_fastfail(FAST_FAIL_FATAL_APP_EXIT);

    bool has_cctor = false;
    __try
    {
        bool const is_nested = __scrt_acquire_startup_lock();

        if (__scrt_current_native_startup_state == __scrt_native_startup_state::initializing)
        {
            __scrt_fastfail(FAST_FAIL_FATAL_APP_EXIT);
        }
        else if (__scrt_current_native_startup_state == __scrt_native_startup_state::uninitialized)
        {
            __scrt_current_native_startup_state = __scrt_native_startup_state::initializing;

            if (_initterm_e(__xi_a, __xi_z) != 0)
                return 255;

            _initterm(__xc_a, __xc_z);

            __scrt_current_native_startup_state = __scrt_native_startup_state::initialized;
        }
        else
        {
            has_cctor = true;
        }

        __scrt_release_startup_lock(is_nested);

        // If this module has any dynamically initialized __declspec(thread)
        // variables, then we invoke their initialization for the primary thread
        // used to start the process:
        _tls_callback_type const* const tls_init_callback = __scrt_get_dyn_tls_init_callback();
        if (*tls_init_callback != nullptr && __scrt_is_nonwritable_in_current_image(tls_init_callback))
        {
            (*tls_init_callback)(nullptr, DLL_THREAD_ATTACH, nullptr);
        }

        // If this module has any thread-local destructors, register the
        // callback function with the Unified CRT to run on exit.
        _tls_callback_type const * const tls_dtor_callback = __scrt_get_dyn_tls_dtor_callback();
        if (*tls_dtor_callback != nullptr && __scrt_is_nonwritable_in_current_image(tls_dtor_callback))
        {
            _register_thread_local_exe_atexit_callback(*tls_dtor_callback);
        }

        //
        // Initialization is complete; invoke main...
        //

        int const main_result = invoke_main();

        //
        // main has returned; exit somehow...
        //

        if (!__scrt_is_managed_app())
            exit(main_result);

        if (!has_cctor)
            _cexit();

        // Finally, we terminate the CRT:
        __scrt_uninitialize_crt(true, false);
        return main_result;
    }
    __except (_seh_filter_exe(GetExceptionCode(), GetExceptionInformation()))
    {
        // Note:  We should never reach this except clause.
        int const main_result = GetExceptionCode();

        if (!__scrt_is_managed_app())
            _exit(main_result);

        if (!has_cctor)
            _c_exit();

        return main_result;
    }
}

invoke_main()

初始化环境变量,并且在最后调用了main函数,进入了程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrjIn45e-1634980724379)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211023165907159.png)]

总结

本片文章分析的是32位程序的入口函数,并且这只是入口函数的一种main(),下一篇文章我们将分析Winmain(),看看他们有什么不一样。

参考资料

C语言中的main函数为什么被称作程序入口

windows编程 进程(一):进程简介

《C++反汇编与逆向分析》动态调试找到main函数 我们在VS C++开发程序在调试时总是从main或WinMain函数开始,这就让我们很容易误认为它们是程序的第一条指令,但是事实并非如此。main或WinMain函数需要一个调用者,在它们被调用前,编译器其实已经做了很多事情, 阅读详情

相关推荐

保姆级教程:用Ghidra分析一个Windows程序,从导入到找到main函数

本文提供了一份详细的Ghidra逆向分析Windows程序的保姆级教程,从环境准备、工具安装到定位main函数的完整流程。通过实战案例和实用技巧,帮助零基础用户快速掌握逆向分析的核心方法,特别适合想要学习逆向工程的初学者。

weixin_42550597的博客 295

函数栈帧详解

函数栈帧万字详解,学不会你来捶我!!!在学习函数的时候我们或许会有一些疑惑,比如1、局部变量是怎末创建的?2、为什么局部变量的值是随机值?3、函数是怎末传参的,传参的顺序是怎么样的?4、形参和实参是什么关系?5、函数调用是怎末实现的?6、函数调用结束后是怎末返回返回值的?今天,博主就和大家一起探讨一起探讨一下函数栈帧的创建和销毁,学会了些,我们的疑惑也就自然解决了;回答一下前面的问题httpshttpshttpshttpshttpshttpshttps。......

南猿北者博客 2044

逆向分析实战:用Ghidra快速定位程序入口点(main/entry)的三种高效方法

本文详细介绍了在Ghidra中快速定位程序入口点的三种高效方法,包括基础函数窗口搜索、符号表与交叉引用分析以及识别编译器启动模式。这些技巧特别适用于没有符号表的二进制文件逆向分析,帮助逆向工程师迅速找到分析起点,提升工作效率。

weixin_33701251的博客 402

error LNK2019: 无法解析的外部符号 main,函数 “int __cdecl __scrt_common_main_seh(void)“ (?__scrt_common_main_seh

error LNK2019: 无法解析的外部符号 main,函数 "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ) 中被引用

wang1zhong1quan的博客 3712

CTF逆向入门:IDA定位主函数与加密逻辑分析实战指南

在软件逆向工程中,理解程序执行流程是分析的基础。程序通常从主函数(main)开始执行,这是用户代码的逻辑起点。通过静态分析工具如IDA Pro,可以快速定位主函数,从而揭示程序的核心逻辑。这一技术对于安全研究、漏洞挖掘和CTF竞赛至关重要,尤其在分析加密算法、验证逻辑时,能有效提升效率。本文聚焦于逆向工程中的关键步骤,详细介绍了通过字符串交叉引用、启动函数特征识别等方法定位主函数,并初步解析加密逻辑,帮助读者掌握从入口点到核心代码的追踪技巧。

weixin_34378767的博客 668

Windows PE文件逆向分析:从结构解析到恶意软件检测实战

可执行文件分析是软件安全与逆向工程领域的核心基础。其原理在于解析程序的二进制结构,理解代码与数据的组织方式,从而在不依赖源代码的情况下洞察软件行为。这项技术的核心价值在于软件安全审计、漏洞挖掘、恶意代码分析和闭源程序调试。在应用场景上,它广泛用于安全研究、数字取证和软件兼容性分析。本文聚焦于Windows平台的PE文件格式,深入剖析其DOS头、PE文件头、节表等核心结构,并详解相对虚拟地址与文件偏移的转换关系。通过介绍IDA Pro、Ghidra、x64dbg等静态与动态分析工具的组合使用,以及如何识别导入

585

函数栈帧的创建和销毁(详细)

函数栈帧的创建和销毁main函数被调用的过程:具体过程 main函数被调用的过程: mainCRTStartup() 调用 _tmainCRTStartup() 再调用 main() 寄存器: ebp(栈底指针),esp(栈顶指针)(sp 是esp的低16位,esp是rsp的低32位,ss是16位堆栈段寄存器) 了解更多:x86汇编学习历程7----从1加到100并显示(引入栈) 具体过程 C代码如下: #include <stdio.h> int Add(int x, int y)

qq_41420788的博客 892

CTF逆向实战:从静态分析到动态调试破解jocker程序

逆向工程是计算机安全领域的核心技术之一,它通过分析程序的执行逻辑与数据结构,理解其工作原理。这项技术对于漏洞挖掘、恶意软件分析和软件保护至关重要。在工程实践中,结合静态分析与动态调试是破解复杂程序的有效方法。静态分析侧重于反汇编与代码梳理,而动态调试则允许在运行时观察内存与寄存器状态,验证算法行为。本文以一道典型CTF逆向题目为例,深入剖析了如何通过识别异或运算等加密操作,并利用动态调试技术跟踪数据流,最终还原出完整的校验逻辑与flag生成过程。

diaogan4202的博客 336

逆向基础-汇编寻找C程序入口

观察点说明push指令个数粗略判断参数个数表明是 cdecl 调用且有 3 个参数三个参数特征符合调用位置通常位于的尾部操作系统加载程序(kernel32.dll)↓mainCRTStartup(C 运行时启动函数)↓初始化堆、环境变量、命令行参数等↓调用 main(argc, argv, envp)↓程序执行用户代码↓返回值交给 mainCRTStartup → ExitProcess概念说明程序真正入口,负责初始化main用户编写的逻辑入口寻找 main。

rasssel的博客 1599

从零开始病毒逆向分析:环境搭建、动静结合与实战解密

恶意软件分析是网络安全领域的核心技能,其本质是通过逆向工程理解程序行为。其原理在于结合静态与动态分析技术,在不运行或受控环境中剖析可执行文件。掌握这项技术对于构建有效防御、编写检测规则至关重要,广泛应用于安全运维、应急响应和威胁情报分析。本文聚焦于Windows平台典型样本,通过搭建安全的虚拟机沙箱环境,利用PEiD、IDA Pro、Process Monitor等工具,从文件哈希、字符串、导入表等静态信息入手,再结合进程监控、注册表快照等动态行为,最终深入核心代码解读加密逻辑,完整演示如何将未知程序从“黑

weixin_34293059的博客 3102

CTF逆向入门:从“欢迎来到魔法世界”解析程序分析与动态调试

逆向工程是信息安全领域的核心技术之一,它通过分析程序的二进制代码来理解其内部逻辑与运行机制。其基本原理是结合静态分析与动态调试,静态分析借助反编译工具(如IDA Pro、Ghidra)还原代码结构,动态调试则使用GDB等工具实时监控程序执行状态,从而揭示数据流与控制流。这项技术的核心价值在于漏洞挖掘、恶意软件分析和CTF竞赛解题,尤其在CTF逆向题中,参赛者需快速定位关键验证函数、理解加密或校验逻辑,并反向推导出正确输入(如flag)。应用场景广泛,从软件安全评估到数字取证都离不开逆向技能。本文以一道典型C

weixin_30855099的博客 400

逆向分析之基本知识点

逆向分析之基本知识点 EP EnterPoint 入口点 EP是windows可执行文件的代码入口点,是程序的最先执行的代码的起始位置,它依赖于CPU(就是用OD打开exe最初始的位置) 可以看到一个CALL和JMP指令 CALL指令调用的函数里面就是程序的启动函数 启动函数并不是我们写的,而是编译器(VS)为了保证程序的运行自动添加的 启动函数里面通常有许多系统API(红色注释部分) 启动函数不只是CALL 0040270c这条指令,JMP 0040104F跳转的0040104F地址处也是启动函数 注

learn112的博客 836

小程序逆向分析实战:从抓包到签名算法破解全流程解析

在移动应用开发和安全研究领域,网络通信协议分析是一项基础且关键的技能。其核心原理在于通过抓包工具捕获客户端与服务器之间的数据交互,解析请求与响应的结构,从而理解应用的数据传输机制。这项技术的价值在于帮助开发者学习优秀架构设计、协助安全研究员评估潜在风险,并为自动化测试提供深度支持。典型的应用场景包括电商、社交、金融等各类小程序和App的接口分析。以电商小程序为例,其通信过程往往涉及复杂的参数签名和加密机制,这是保障数据安全的重要环节。通过静态分析源码结构与动态调试运行时行为相结合的方法,可以逐步定位到关键的

转些好文章,促进分享。 504

HexRays逆向分析实战:如何快速定位main函数并应用FLIRT签名

本文详细介绍了使用IDA Pro的HexRays反编译器进行逆向分析的实战技巧。重点讲解如何在不同平台(Windows/Linux)和场景(带符号/去符号化/静态链接)下快速定位程序的main函数入口,并深入解析了手动应用FLIRT签名来精准识别库函数的方法,从而显著提升逆向工程的分析效率与代码可读性。

emacs5lisp的博客 536

Nuitka打包程序逆向分析:定位授权验证与绕过实战

软件逆向工程是理解程序内部逻辑与安全机制的关键技术,其核心原理在于通过静态与动态分析,解析程序的执行流程与数据交互。这项技术在软件安全评估、漏洞挖掘与协议分析等领域具有重要价值,尤其在分析经过编译保护的应用程序时作用显著。以Nuitka打包的Python程序为例,其将Python代码编译为原生机器码,增加了直接查看源码的难度,为逆向分析提供了典型场景。通过结合IDA Pro、x64dbg等工具链,分析者可以系统性地定位授权验证函数、解密算法与关键跳转逻辑。本文聚焦于**授权验证**机制的深度解析,详细阐述了

weixin_30698527的博客 410

OpenClaw Windows 最详细安装指南

Windows上养龙虾:OpenClaw完整安装教程+钉钉接入,助你养只大龙虾

weixin_43405859的博客 2215

从C++函数调用到逆向分析:手把手教你用OD/IDA定位main函数入口(附实战技巧)

本文详细讲解了从C++函数调用底层原理到逆向分析实战,重点介绍如何使用OllyDbg和IDA Pro定位main函数入口的实用技巧。通过分析程序启动逻辑、寄存器作用、调用约定识别等核心概念,结合实战案例演示不同编译器下的main函数特征识别方法,帮助逆向工程师快速掌握关键技能。

weixin_30945039的博客 445

300m半径无人机单兵侦测设备技术详解

300m半径无人机单兵侦测设备凭借其卓越的侦测性能、高效的识别能力、便捷的告警方式以及广泛的应用场景,成为现代军事、安保及应急救援领域的重要装备。300m半径无人机单兵侦测设备,融合了最新的无人机技术、高精度传感技术与实时数据处理技术,为单兵作战、巡逻及侦察任务提供了前所未有的视野与效率。该设备通过无人机搭载的高性能侦测模块,能够在复杂环境中实现300米范围内的精准侦测,大幅提升单兵的战场感知能力和决策效率。设备为被动式探测设备,确保安静安全运行,不暴露目标 设备耗电功率小,可长时间在野外使用。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1120

Windows 10下搭建Go逆向分析环境:IDA Pro与go_parser实战指南

二进制文件逆向分析是安全研究和软件工程中的基础技术,它涉及对编译后程序的结构、逻辑和数据流进行解析。其核心原理在于理解特定编程语言的编译约定、运行时内存布局和符号信息存储方式。对于采用Go语言编写的程序,由于其独特的运行时模型和编译机制,传统基于C/C++的逆向工具往往失效,这凸显了专用解析工具的技术价值。在恶意软件分析、闭源工具研究和安全审计等应用场景中,快速恢复Go二进制文件的函数名、字符串和类型信息至关重要。本文聚焦于使用go_parser这一IDA Pro插件,它通过自动化解析firstmodule

weixin_34161029的博客 373

STM32cube HAL库两条命令实现i2c通信---Nucleo L476RG用I2C实现tmp117模块温度读取并串口打印

Getting Started with STM32 - I2C Example

m0_54706625的博客 1834

Unsloth Desktop 本地大模型微调量化实战指南

大语言模型的本地化定制正在成为开发者与内容创作者的重要需求,而微调与量化则是其中最关键的两项技术。LoRA 与 QLoRA 通过仅训练少量低秩矩阵,大幅降低显存占用和训练成本,让消费级 GPU 也能完成模型适配;GGUF 格式则打通了训练与推理的边界,使微调后的模型可直接接入 Ollama、llama.cpp 等主流推理引擎。本文以 Unsloth Desktop 为切入对象,从其底层加速原理出发,梳理了环境准备、模型加载、对话测试、量化导出、微调验证及 API 批量调用的完整链路,并针对显存优化、端口冲突

weixin_29055137的博客 399

CTF逆向工程:IDA Pro快速定位main函数与加密逻辑实战指南

逆向工程是分析软件内部工作原理的关键技术,广泛应用于软件安全、漏洞挖掘和CTF竞赛。其核心原理是通过静态与动态分析相结合的方法,解析程序的执行流程与数据结构。掌握逆向技术对于理解软件行为、发现潜在风险具有重要价值,尤其在安全审计和竞赛解题中不可或缺。在CTF逆向挑战中,快速定位程序入口和核心逻辑是解题效率的关键。本文聚焦于使用IDA Pro这一主流工具,通过识别入口点特征、利用字符串交叉引用等技巧,系统性地讲解如何从复杂的二进制代码中精准定位主函数(main)和关键的加密算法逻辑,帮助逆向工程师从“大海捞针

weixin_34025051的博客 343

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3494
上一篇: 热补丁:为什么Windows API都以无意义的 mov edi,edi 开头?
下一篇: 逆向程序分析:Win32程序入口函数
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值