按了ALT+8出现了最简单的C++反汇编程序,求逐行解释和扫盲

war10811 2011-06-29 03:51:45
调试时好奇按了论坛中某人提示的ALT+8,跳出来了汇编的东东,这可吓坏我了,没一句看的懂的
我之前也学过点汇编(用汇编编过排序算法!!),不过估计忘了差不多了,这个简单的程序谁能给
逐行的解释下呢?把每个寄存器的作用稍微提一下嘛,我感觉我啥都没印象了。
不知道有米有此方面的心得资料书籍,求推荐啊!


int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp
00871733 sub esp,0D8h
00871739 push ebx
0087173A push esi
0087173B push edi
0087173C lea edi,[ebp-0D8h]
00871742 mov ecx,36h
00871747 mov eax,0CCCCCCCCh

//这句代表什么
0087174C rep stos dword ptr es:[edi]
int x = 3;
0087174E mov dword ptr [x],3
int y = 4;
00871755 mov dword ptr [y],4

printf("sum = %d\n", x + y);
//呀的,都看不懂啊,我想哭了
0087175C mov eax,dword ptr [x]
0087175F add eax,dword ptr [y]
00871762 mov esi,esp
00871764 push eax
00871765 push offset string "World!" (876878h)
0087176A call dword ptr [__imp__printf (8793DCh)]
00871770 add esp,8
00871773 cmp esi,esp
00871775 call @ILT+400(__RTC_CheckEsp) (871195h)

return 0;
0087177A xor eax,eax
}
//main函数都结束了,还有啊
0087177C pop edi
0087177D pop esi
0087177E pop ebx
0087177F add esp,0D8h
00871785 cmp ebp,esp
00871787 call @ILT+400(__RTC_CheckEsp) (871195h)
0087178C mov esp,ebp
0087178E pop ebp
0087178F ret
--- 无源文件 -----------------------------------------------------------------------
//这么多3又是什么东东
00871790 int 3
00871791 int 3
00871792 int 3
00871793 int 3
...全文
409 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-06-29
  • 打赏
  • 举报
回复
;1:    #include <stdio.h>
;2: int main()
;3: {
00401010 55 push ebp
00401011 8B EC mov ebp,esp
00401013 83 EC 48 sub esp,48h
00401016 53 push ebx
00401017 56 push esi
00401018 57 push edi
;4: int x = 3;
00401019 C7 45 FC 03 00 00 00 mov dword ptr [ebp-4],3
;5: int y = 4;
00401020 C7 45 F8 04 00 00 00 mov dword ptr [ebp-8],4
;6: printf("sum = %d\n", x + y);
00401027 8B 45 FC mov eax,dword ptr [ebp-4]
0040102A 03 45 F8 add eax,dword ptr [ebp-8]
0040102D 50 push eax
0040102E 68 1C 30 41 00 push offset string "sum = %d\n" (0041301c)
00401033 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
00401039 83 C4 08 add esp,8
;7: return 0;
0040103C 33 C0 xor eax,eax
;8: }
0040103E 5F pop edi
0040103F 5E pop esi
00401040 5B pop ebx
00401041 8B E5 mov esp,ebp
00401043 5D pop ebp
00401044 C3 ret

赵4老师 2011-06-29
  • 打赏
  • 举报
回复
1:    #include <stdio.h>
2: int main()
3: {
//00401010 55 push ebp
//00401011 8B EC mov ebp,esp
//00401013 83 EC 48 sub esp,48h
//00401016 53 push ebx
//00401017 56 push esi
//00401018 57 push edi
4: int x = 3;
//00401019 C7 45 FC 03 00 00 00 mov dword ptr [ebp-4],3
5: int y = 4;
//00401020 C7 45 F8 04 00 00 00 mov dword ptr [ebp-8],4
6: printf("sum = %d\n", x + y);
//00401027 8B 45 FC mov eax,dword ptr [ebp-4]
//0040102A 03 45 F8 add eax,dword ptr [ebp-8]
//0040102D 50 push eax
//0040102E 68 1C 30 41 00 push offset string "sum = %d\n" (0041301c)
//00401033 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
//00401039 83 C4 08 add esp,8
7: return 0;
//0040103C 33 C0 xor eax,eax
8: }
//0040103E 5F pop edi
//0040103F 5E pop esi
//00401040 5B pop ebx
//00401041 8B E5 mov esp,ebp
//00401043 5D pop ebp
//00401044 C3 ret

//1:    #include <stdio.h>
//2: int main()
//3: {
00401010 55 push ebp
00401011 8B EC mov ebp,esp
00401013 83 EC 48 sub esp,48h
00401016 53 push ebx
00401017 56 push esi
00401018 57 push edi
//4: int x = 3;
00401019 C7 45 FC 03 00 00 00 mov dword ptr [ebp-4],3
//5: int y = 4;
00401020 C7 45 F8 04 00 00 00 mov dword ptr [ebp-8],4
//6: printf("sum = %d\n", x + y);
00401027 8B 45 FC mov eax,dword ptr [ebp-4]
0040102A 03 45 F8 add eax,dword ptr [ebp-8]
0040102D 50 push eax
0040102E 68 1C 30 41 00 push offset string "sum = %d\n" (0041301c)
00401033 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
00401039 83 C4 08 add esp,8
//7: return 0;
0040103C 33 C0 xor eax,eax
//8: }
0040103E 5F pop edi
0040103F 5E pop esi
00401040 5B pop ebx
00401041 8B E5 mov esp,ebp
00401043 5D pop ebp
00401044 C3 ret

赵4老师 2011-06-29
  • 打赏
  • 举报
回复
编译选项加/Gm禁止堆栈检查
hahayezhe112 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mlee79 的回复:]
引用 11 楼 war10811 的回复:

引用 8 楼 mlee79 的回复:
看汇编的时候一定记得看 Release 版本的, 一定要在IDA下看....

int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp ; 这个跟后面的mov esp,ebp,pop ebp一起构成函数栈帧

……
[/Quote]

呵呵 厉害10年,8年C 一直都搞的技术?
c_losed 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mlee79 的回复:]

引用 11 楼 war10811 的回复:

引用 8 楼 mlee79 的回复:
看汇编的时候一定记得看 Release 版本的, 一定要在IDA下看....

int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp ; 这个跟后面的mov esp,ebp,pop ebp一起构成函数栈帧
……
[/Quote]
膜拜牛人
mLee79 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 war10811 的回复:]

引用 8 楼 mlee79 的回复:
看汇编的时候一定记得看 Release 版本的, 一定要在IDA下看....

int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp ; 这个跟后面的mov esp,ebp,pop ebp一起构成函数栈帧


00871733 sub esp,0D8h……
[/Quote]

当你工作了10年, C用了8年的时候, 不用特别看啥大概也知道了... 然后你看C都像汇编... 不知道啥时候能看汇编就像看C...


xunxun 2011-06-29
  • 打赏
  • 举报
回复
逆向很多资料的,多去看雪转转

有俩工具现在较为盛行:IDA、Ollydbg
war10811 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mlee79 的回复:]
看汇编的时候一定记得看 Release 版本的, 一定要在IDA下看....

int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp ; 这个跟后面的mov esp,ebp,pop ebp一起构成函数栈帧


00871733 sub esp,0D8h
00871739 push ……
[/Quote]

你太NIU了吧
这方面您有什么资料推荐一下嘛?
您是哪里学的这功夫..@_@
至善者善之敌 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mlee79 的回复:]
看汇编的时候一定记得看 Release 版本的, 一定要在IDA下看....

int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp ; 这个跟后面的mov esp,ebp,pop ebp一起构成函数栈帧


00871733 sub ……
[/Quote]

学习。。。。。。
pengzhixi 2011-06-29
  • 打赏
  • 举报
回复
mLee来了。我还是靠边站着了。
mLee79 2011-06-29
  • 打赏
  • 举报
回复
看汇编的时候一定记得看 Release 版本的, 一定要在IDA下看....

int main()
{
//每个函数前面都有这些,是干嘛的呢
00871730 push ebp
00871731 mov ebp,esp ; 这个跟后面的mov esp,ebp,pop ebp一起构成函数栈帧


00871733 sub esp,0D8h
00871739 push ebx
0087173A push esi
0087173B push edi
0087173C lea edi,[ebp-0D8h]
00871742 mov ecx,36h
00871747 mov eax,0CCCCCCCCh

//这句代表什么
0087174C rep stos dword ptr es:[edi] ; 这些在DEBUG版本里才有, 就是把函数局部变量全部初始化为 0xCC (int 3指令) , 就是内存里很烫烫烫烫烫烫烫的东西....

int x = 3;
0087174E mov dword ptr [x],3
int y = 4;
00871755 mov dword ptr [y],4

printf("sum = %d\n", x + y);
//呀的,都看不懂啊,我想哭了
0087175C mov eax,dword ptr [x]
0087175F add eax,dword ptr [y]
00871762 mov esi,esp
00871764 push eax
00871765 push offset string "World!" (876878h)
0087176A call dword ptr [__imp__printf (8793DCh)] ; dllimport 的函数实际上一个函数指针, 通过 import table 跳转
00871770 add esp,8
00871773 cmp esi,esp
00871775 call @ILT+400(__RTC_CheckEsp) (871195h) ; 当你用开了 Program Database for Edit and Continue ( /ZI ) 或者打开了 Link incrementally (/incremental:yes) 选项的时候生成的代码就是酱紫的, 所有的函数通过ILT跳转, 所以当你调试中改变了代码的时候, 编译器可以直接修改 ILT 内容, 这样你下次调用的时候就跳到了新的函数里面....

return 0;
0087177A xor eax,eax
}
//main函数都结束了,还有啊
0087177C pop edi
0087177D pop esi
0087177E pop ebx
0087177F add esp,0D8h
00871785 cmp ebp,esp
00871787 call @ILT+400(__RTC_CheckEsp) (871195h) ; 这个是给调试用的, 如果你用 cdecl 的调用约定调用了一个 stdcall 的函数, 那函数的堆栈就不再平衡鸟....

0087178C mov esp,ebp ; 这个也是传说中的函数栈帧.
0087178E pop ebp
0087178F ret
--- 无源文件 -----------------------------------------------------------------------
//这么多3又是什么东东
00871790 int 3 ; int 3 就是断点, 断点就是 int 3 , 单步就是 int 1 , 编译器自动插入的对齐代码, 比如编译器一般都把每个函数放在 8字节对齐的边界上, 这多出来的地就可以随便插入一些代码啥的...
00871791 int 3
00871792 int 3
00871793 int 3
war10811 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hahayezhe112 的回复:]
具体的详细解释
可以查找 从汇编语言到核心编程 这本书里有很详细的介绍

加密与解密 开篇也有过介绍!
[/Quote]

谢谢,上豆瓣看了下,这本书评价很好啊
就想叫yoko 2011-06-29
  • 打赏
  • 举报
回复
上这问

https://forum.csdn.net/SList/ASM/
c_losed 2011-06-29
  • 打赏
  • 举报
回复

int main()
{
//每个函数前面都有这些,是干嘛的呢 //初始化
00871730 push ebp
00871731 mov ebp,esp
00871733 sub esp,0D8h
00871739 push ebx
0087173A push esi
0087173B push edi
0087173C lea edi,[ebp-0D8h]
00871742 mov ecx,36h
00871747 mov eax,0CCCCCCCCh

//这句代表什么 //;rep重复操作前缀 stos从累加器EAX传送4个字节,到由EDI作为指针的目的串中,同时修改EDI以指向 串中的下一个单
元。利用重复操作可以在串在建立一串相同的值。

0087174C rep stos dword ptr es:[edi]
int x = 3;
0087174E mov dword ptr [x],3
int y = 4;
00871755 mov dword ptr [y],4

printf("sum = %d\n", x + y);
//呀的,都看不懂啊,我想哭了 就是把值移动 然后相加一下
0087175C mov eax,dword ptr [x]
0087175F add eax,dword ptr [y]
00871762 mov esi,esp
00871764 push eax
00871765 push offset string "World!" (876878h)
0087176A call dword ptr [__imp__printf (8793DCh)]
00871770 add esp,8
00871773 cmp esi,esp
00871775 call @ILT+400(__RTC_CheckEsp) (871195h)

return 0;
0087177A xor eax,eax
}
//main函数都结束了,还有啊 堆栈要平衡 有始要有终
0087177C pop edi
0087177D pop esi
0087177E pop ebx
0087177F add esp,0D8h
00871785 cmp ebp,esp
00871787 call @ILT+400(__RTC_CheckEsp) (871195h)
0087178C mov esp,ebp
0087178E pop ebp
0087178F ret
--- 无源文件 -----------------------------------------------------------------------
//这么多3又是什么东东 //int 3 中断
00871790 int 3
00871791 int 3
00871792 int 3
00871793 int 3



可以看win32汇编
hahayezhe112 2011-06-29
  • 打赏
  • 举报
回复
具体的详细解释
可以查找 从汇编语言到核心编程 这本书里有很详细的介绍

加密与解密 开篇也有过介绍!
bdmh 2011-06-29
  • 打赏
  • 举报
回复
int 3,调用中断
开头和结尾,就是压栈一些指针,末尾恢复,检查

0087174E mov dword ptr [x],3 //把3放到x中
00871755 mov dword ptr [y],4 //把4放到y中

0087175C mov eax,dword ptr [x] //把参数放到寄存器
0087175F add eax,dword ptr [y] //把x+y的值放到eax寄存器,下面就开始调用printf的方法了
00871762 mov esi,esp
00871764 push eax //eax压栈
00871765 push offset string "World!" (876878h) //压入字符串
0087176A call dword ptr [__imp__printf (8793DCh)] //调用printf
00871770 add esp,8
00871773 cmp esi,esp
00871775 call @ILT+400(__RTC_CheckEsp) (871195h)


hahayezhe112 2011-06-29
  • 打赏
  • 举报
回复
rep stos dword ptr es:[edi]
做循环,次数已上面ecx为次数控制,
值以eax里的值
就是给你当前的函数清理出一片栈空间
并在那片空间里填充0xcd
后面应该是程序退出结束代码
int 3 中断
恨天低 2011-06-29
  • 打赏
  • 举报
回复
我调试的时候,那个汇编窗口一直没打开的!!

还不到那个境界!
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 Altium Designer 18是一款功能丰富的电子设计自动化工具,其集成了电路原理图绘制、PCB布局规划、三维视图展示、电路仿真分析以及生产文件生成等多项核心功能,为电子工程师们提供了一个全面的硬件设计解决方案。该软件的官方中文指导材料系统地阐述了从项目初始阶段到最终完成的全过程操作方法。 在“AD18 官方中文指导材料”中,使用者可以掌握以下核心内容要点: 1. **系统配置与界面认知**:熟悉Altium Designer 18的工作平台,涵盖菜单选项、工具栏配置、工作区域安排,以及个性化工作界面的设定方法。 2. **项目创建流程**:掌握如何建立新的项目工程,包括工程参数配置、项目模板选取,以及项目文件的添加操作。 3. **电路图绘制技术**:学习电路原理图的绘制流程,包括元件库的维护管理、元件放置技巧、连接线路绘制、属性编辑操作,以及网络表的自动生成方法。 4. **元件库构建与管理**:了解如何建立自定义元件库,执行元件的导入与导出任务,以及利用Altium Designer自带的元件资源库。 5. **PCB布局设计方法**:掌握PCB设计的基本准则,如元件布局策略、布线技巧、层叠结构调整、布线规则优化,以及冲突检测与短路处理技术。 6. **设计规范与约束条件**:理解设定设计规范和电气约束条件的关键性,包括间距参数设定、焊盘尺寸规格、过孔尺寸要等,以及运用规则检查进行设计验证的流程。 7. **三维模型整合应用**:学习如何将三维模型与PCB设计内容相结合,以实现更为直观的机械配合验证。 8. **电路性能仿真技术**:掌握使用Altium Des...
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### 接口测试知识要点说明 #### 一、接口测试的定义及分类 1. **概念阐释**: - 接口测试作为软件测试的关键环节,主要对系统之间的交互点进行验证。 - 它旨在核实接口的正确性、稳定性和功能性,保障各个系统组件能够依照预期执行交互操作。 2. **实施情境**: - 适用于多系统联合开发的环境。 - 适用于包含多个子系统的复杂应用系统开发过程。 3. **适用范围**: - 为其他系统提供支持的底层基础架构系统。 - 负责协调中心服务的系统架构。 4. **分类标准**: - **模块接口测试**:通常作为单元测试的一部分,适用于独立构建的功能模块。 - **Web接口测试**: - **服务端接口测试**:针对客户端与服务器端之间的接口进行验证。 - **外部接口测试**:对第三方提供的接口进行测试,例如支付平台提供的授权登录接口。 5. **测试角度**: - **接口功能验证**:核实接口功能是否满足预期要。 - **接口性能评估**:衡量接口的处理能力及响应时间。 - **接口稳定性考察**:检测接口在长时间运行中的表现情况。 - **接口安全检测**:确保接口能够抵御非法访问或数据篡改。 6. **测试手法**: - **参数细致测试**:深入测试接口的输入参数和输出结果。 - **场景模拟测试**:依据实际业务场景进行测试验证。 #### 二、接口测试的详细流程 1. **测试规划**: - 明确测试范围、目标及所需资源。 - 规划测试策略,选择适宜的工具和技术手段。 2. **测试用例设计**: - 依据需文档和接口规格文档设计测试用例。 - 覆...
内容概要:本文研究基于遗传算法(GA)与粒子群算法(PSO)相结合的无人机三维路径规划方法,旨在解决无人机在复杂三维环境中避障与路径优化的关键问题。通过构建包含障碍物、威胁区域等约束的三维仿真环境,系统实现了GA与PSO两种智能优化算法的Matlab代码,并对其在路径规划中的性能进行全面对比分析,重点关注路径长度、飞行安全性、算法收敛速度等核心指标。研究充分利用GA的全局搜索能力与PSO的快速局部收敛特性,提出一种混合优化策略,有效克服单一算法易陷入局部最优或收敛缓慢的缺陷。文中不仅详细阐述了算法的设计流程、数学模型与实现细节,还提供了完整的仿真结果,验证了所提混合方法在复杂动态场景下的优越性、有效性和鲁棒性,为无人机自主导航提供了可靠的理论依据和技术方案。; 适合人群:具备一定Matlab编程基础和优化算法理论知识,从事无人机系统设计、智能控制、路径规划、人工智能应用等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、山区、灾害救援等复杂三维环境中的无人机自主避障与最优任务路径规划;②为智能优化算法(GA、PSO及其混合策略)的学习、性能对比与工程化应用提供详实的实践案例和代码参考;③服务于高校科研教学、算法原型快速复现、以及在此基础上的进一步改进与创新研究。; 阅读建议:建议读者结合所提供的Matlab代码进行仿真运行与调试,深入理解两种算法的参数设置、适应度函数设计及路径生成机制,可通过修改环境地图、增加动态障碍物或调整优化目标函数等方式进行扩展性研究,以深化对算法本质和应用场景的理解。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧