为啥我在VC2008.Release下反汇编switch代码,会跳出2个_main的入口函数?

lin_style lin_style 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

int _tmain(int argc, _TCHAR* argv[])
{
00401000 push ebp
00401001 mov ebp,esp
00401003 and esp,0FFFFFFF8h
int i;


cin>>i;
00401006 mov ecx,dword ptr [__imp_std::cin (402044h)]
0040100C sub esp,8
0040100F lea eax,[esp+4]
00401013 push eax
00401014 call dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (402064h)]
switch (i)
0040101A mov eax,dword ptr [esp+4]
0040101E sub eax,1
00401021 je wmain+58h (401058h)
00401023 sub eax,1
00401026 je wmain+43h (401043h)
00401028 sub eax,8
0040102B jne wmain+7Bh (40107Bh)

int _tmain(int argc, _TCHAR* argv[])
{
int i;


cin>>i;
switch (i)
{
case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"2"<<endl;
break;
case 10:
cout<<"10"<<endl;
0040102D mov ecx,dword ptr [__imp_std::endl (402038h)]
00401033 mov edx,dword ptr [__imp_std::cout (402048h)]
00401039 push ecx
0040103A push ecx
0040103B push offset string "10" (40213Ch)
00401040 push edx
break;
00401041 jmp wmain+6Bh (40106Bh)
private:

};

int _tmain(int argc, _TCHAR* argv[])
{
int i;


cin>>i;
switch (i)
{
case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"2"<<endl;
00401043 mov eax,dword ptr [__imp_std::endl (402038h)]
00401048 push eax
00401049 push ecx
0040104A mov ecx,dword ptr [__imp_std::cout (402048h)]
00401050 push offset string "2" (402138h)
00401055 push ecx
break;
00401056 jmp wmain+6Bh (40106Bh)
{
case 1:
cout<<"1"<<endl;
00401058 mov edx,dword ptr [__imp_std::endl (402038h)]
0040105E mov eax,dword ptr [__imp_std::cout (402048h)]
00401063 push edx
00401064 push ecx
00401065 push offset string "1" (402134h)
0040106A push eax
0040106B call std::operator<<<std::char_traits<char> > (401220h)
00401070 add esp,0Ch
00401073 mov ecx,eax
00401075 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402040h)]
default:
break;
}


if( 1==i )
0040107B mov eax,dword ptr [esp+4]
0040107F cmp eax,1
00401082 jne wmain+9Ah (40109Ah)
{
cout<<"1"<<endl;
00401084 mov ecx,dword ptr [__imp_std::endl (402038h)]
0040108A mov edx,dword ptr [__imp_std::cout (402048h)]
00401090 push ecx
00401091 push ecx
00401092 push offset string "1" (402134h)
00401097 push edx
00401098 jmp wmain+0CCh (4010CCh)
}
else if( 2==i )
0040109A cmp eax,2
0040109D jne wmain+0B4h (4010B4h)
{
cout<<"2"<<endl;
0040109F mov eax,dword ptr [__imp_std::endl (402038h)]
004010A4 push eax
004010A5 push ecx
004010A6 mov ecx,dword ptr [__imp_std::cout (402048h)]
004010AC push offset string "2" (402138h)
004010B1 push ecx
004010B2 jmp wmain+0CCh (4010CCh)
}
else if( 10==i )
004010B4 cmp eax,0Ah
004010B7 jne wmain+0DCh (4010DCh)
{
cout<<"10"<<endl;
004010B9 mov edx,dword ptr [__imp_std::endl (402038h)]
004010BF mov eax,dword ptr [__imp_std::cout (402048h)]
004010C4 push edx
004010C5 push ecx
004010C6 push offset string "10" (40213Ch)
004010CB push eax
004010CC call std::operator<<<std::char_traits<char> > (401220h)
004010D1 add esp,0Ch
004010D4 mov ecx,eax
004010D6 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402040h)]
}

return 0;
004010DC xor eax,eax
}


//这里是原C++代码

int _tmain(int argc, _TCHAR* argv[])
{
int i;


cin>>i;
switch (i)
{
case 1:
cout<<"1"<<endl;
break;
case 2:
cout<<"2"<<endl;
break;
case 10:
cout<<"10"<<endl;
break;
default:
break;
}


if( 1==i )
{
cout<<"1"<<endl;
}
else if( 2==i )
{
cout<<"2"<<endl;
}
else if( 10==i )
{
cout<<"10"<<endl;
}

return 0;
}


另:在DEBUG模式下就没有。加了switch就会这样
...全文

相关推荐

Windows 11 系统部署实战:3 步完成 VC++、.NET、DirectX 运行库自动化安装

本文详细介绍了在Windows 11系统中通过PowerShell脚本实现VC++、.NET和DirectX运行库的自动化安装方案。针对IT管理员和系统工程师,提供三步部署流程,包括环境检测、静默安装和验证机制,显著提升运行库部署效率,解决版本碎片化和依赖复杂等问题。

H_MZ

VC6雷霆战机源码解析:从Windows API到游戏主循环的经典实现

面向对象编程是软件工程的核心范式,通过封装、继承和多态构建复杂系统。在游戏开发领域,这一原理体现为将游戏实体抽象为对象,并通过类层次结构管理其行为与状态。双缓冲绘图技术是解决图形界面闪烁问题的关键,通过在内存中预渲染完整帧再一次性显示,保障了画面的流畅性。这些基础技术共同构成了经典2D游戏引擎的骨架,其教学价值在于剥离现代引擎的封装,直接展示底层实现。以VC6时代的《雷霆战机》完整源码为例,它清晰呈现了基于Windows API的消息循环、GDI图形绘制及矩形碰撞检测等核心模块的实现细节。通过剖析此类项目,

weixin_34168880

PCIe-2.6.1 Flow Control Rules

这张表格是您设计SoC PCIe接收子系统时的最低硬件资源清单和配置规范确定系统参数:首先明确SoC的角色(EP/RC/Switch)、是否支持原子操作、以及关键的。规划缓冲区深度:根据表格计算每种信用类型所要求的最小缓冲区项数,并据此在RTL中实例化对应深度的FIFO。PH/NPH至少1项;PD/NPD/CplD需精确计算。实现流控初始化逻辑:在硬件状态机中,实现自动计算这些最小信用值,并正确填入InitFC1DLLP。对于CplH/CplD,要根据角色正确选择“无限”或“有限”。评估缩放需求。

余大大.

DLL加密与代码聚合:通达信指标保护的核心技术解析

在软件安全领域,代码保护是防止核心算法被逆向分析的关键技术。其基本原理是通过混淆、加密等手段,增加代码的逆向难度和成本。从技术价值看,有效的代码保护不仅能保护知识产权,还能提升软件的整体安全性。在应用场景上,金融交易指标、游戏反作弊、商业软件等领域都有广泛需求。本文聚焦于通达信指标保护,深入探讨DLL加密的局限性,并详细解析代码聚合技术中的控制流扁平化、字符串加密等热词技术,如何将安全等级从中等提升到商业级,为开发者提供一套立体化的防护方案。

weixin_34037173

IDA Pro 7.0逆向分析入门:从静态分析到伪代码反编译实战指南

逆向工程是理解程序底层逻辑、分析恶意软件和挖掘软件漏洞的关键技术。其核心原理在于将机器码翻译成可理解的逻辑,这依赖于强大的静态分析工具。IDA Pro作为交互式反汇编器,通过重建控制流图、识别函数和解析数据结构,实现了这一技术价值,广泛应用于安全研究、软件调试和闭源程序分析等场景。本文聚焦于IDA Pro 7.0这一成熟版本,详细介绍了如何利用其伪代码生成引擎(Hex-Rays Decompiler)和强大的静态分析能力,手把手引导读者完成从二进制文件加载、核心界面导航到生成并优化可读性极高的伪代码(Pse

diaopang1934
评论 6
收藏 已收藏
分享
返回顶部
lin_style
C++ 语言 65,214 成员 250,514 内容