按了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
...全文
356 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
  • 打赏
  • 举报
回复
我调试的时候,那个汇编窗口一直没打开的!!

还不到那个境界!

64,646

社区成员

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

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