我用VS调试的时候,查看了代码的反汇编,局部变量,哪里有什么关于栈的操作呢?

enisdle 2012-11-16 04:03:38
下面是int and()函数,int xy=99;是一个局部变量。
通过汇编代码,我怎么也看不到,xy变量,哪里有关于栈的操作?


int and()
{
004113C0 push ebp
004113C1 mov ebp,esp
004113C3 sub esp,0D8h
004113C9 push ebx
004113CA push esi
004113CB push edi
004113CC lea edi,[ebp-0D8h]
004113D2 mov ecx,36h
004113D7 mov eax,0CCCCCCCCh
004113DC rep stos dword ptr es:[edi]
int xy=99;
004113DE mov dword ptr [xy],63h
int* yx=&xy;
004113E5 lea eax,[xy]
004113E8 mov dword ptr [yx],eax
return xy;
004113EB mov eax,dword ptr [xy]
}

...全文
611 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoulinli915 2013-02-25
  • 打赏
  • 举报
回复
得到汇编代码,能否转成代码?高手指点,谢谢
enisdle 2012-11-17
  • 打赏
  • 举报
回复
明白了,我想确定的,就是这个问题。 总之,其实无论是全局、还是局部变量,无论什么变量,它的最内层的相对地址,都是在exe生成后,就确定的。
引用 10 楼 yisikaipu 的回复:
每次函数调用需要一个栈帧,局部变量在栈帧里,相对于一个栈帧的首位置是确定的 好比一个集装箱将被垒到什么位置难以确定,但集装箱内部的结构是确定的
yisikaipu 2012-11-17
  • 打赏
  • 举报
回复
每次函数调用需要一个栈帧,局部变量在栈帧里,相对于一个栈帧的首位置是确定的 好比一个集装箱将被垒到什么位置难以确定,但集装箱内部的结构是确定的
enisdle 2012-11-17
  • 打赏
  • 举报
回复
其实我能不能这样说:一个exe生成后,局部变量相对于ebp的相对地址,就确定了。 ebp的地址值,在栈中可变,但局部变量相对于这个ebp的相对地址,就永远不变,是吧?
引用 8 楼 bluesky12312388 的回复:
引用 6 楼 enisdle 的回复:那就是说,xy相对ebp的位置,是在exe生成后,就确定的了? 引用 5 楼 dpdp_2012 的回复:004113C3 sub esp,0D8h 预留出栈空间 xy通过ebp访问 理论上在确认了调用方式后是的。 调用方式的不同会影响参数传递,也同时会影响栈变量的相对地址。
bluesky12312388 2012-11-16
  • 打赏
  • 举报
回复
引用 6 楼 enisdle 的回复:
那就是说,xy相对ebp的位置,是在exe生成后,就确定的了? 引用 5 楼 dpdp_2012 的回复:004113C3 sub esp,0D8h 预留出栈空间 xy通过ebp访问
理论上在确认了调用方式后是的。 调用方式的不同会影响参数传递,也同时会影响栈变量的相对地址。
dpdp_2012 2012-11-16
  • 打赏
  • 举报
回复
引用 6 楼 enisdle 的回复:
那就是说,xy相对ebp的位置,是在exe生成后,就确定的了? 引用 5 楼 dpdp_2012 的回复:004113C3 sub esp,0D8h 预留出栈空间 xy通过ebp访问
没运行只有一段代码,只有运行了,才存在栈分配
enisdle 2012-11-16
  • 打赏
  • 举报
回复
那就是说,xy相对ebp的位置,是在exe生成后,就确定的了?
引用 5 楼 dpdp_2012 的回复:
004113C3 sub esp,0D8h 预留出栈空间 xy通过ebp访问
dpdp_2012 2012-11-16
  • 打赏
  • 举报
回复
004113C3 sub esp,0D8h 预留出栈空间 xy通过ebp访问
enisdle 2012-11-16
  • 打赏
  • 举报
回复
那[xy]这个地址值,不是exe生成后,就确定了吗?
引用 3 楼 bluesky12312388 的回复:
mov dword ptr [xy],63h 这个就是对栈变量的操作。 这个是以前测试用的,平台windows, vs2005 C/C++ code?1234567891011121314151617181920212223242526void __declspec(naked) tadd1(int a,int b ){ static co……
bluesky12312388 2012-11-16
  • 打赏
  • 举报
回复
mov dword ptr [xy],63h 这个就是对栈变量的操作。 这个是以前测试用的,平台windows, vs2005
void __declspec(naked) tadd1(int a,int b )
{
	static const char *pFormat = "res:%u \n";
	static int (*pFn)(const char*,...) = printf;
	__asm
	{
		push ebp
		mov ebp,esp

		mov edx,[ebp + 8]
		mov eax,[ebp + 12]
		add eax,edx

		push eax
		mov edx,pFormat
		push edx
		call pFn
		add esp,8
		pop eax

		mov esp,ebp
		pop ebp
		
		ret
	}	
}
gongxujun 2012-11-16
  • 打赏
  • 举报
回复
反汇编函数名变态
baichi4141 2012-11-16
  • 打赏
  • 举报
回复
当楼主看到什么的时候,会认为自己看到了xy变量? 当楼主看到什么的时候,会认为自己看到了关于栈的操作? 没有基础知识,你看什么都是白看 要看反汇编代码,就先学汇编语言
内容简介 · · · · · ·   本书作为有关 Visual C++ Debugger的专著,是一本非常难得的好书。书中深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行代码的过程和方法,说明了关于定位、分析及修复编程错误的方法,介绍了开发 Visual C++程序时所遇到的特殊调试问题。   本书是所有软件工程师的必读书籍,也可作为大专院校师生的参考资料。 目录 ······ 第一部分 代码开发技巧 第1章 编写好的代码. l.l 谁需要本书? l.2 教学方法 1.3 从何处开始阅读? 1.4 警告!并非所有的C/C++编译器都完全相同 · · · · · · (更多) 第一部分 代码开发技巧 第1章 编写好的代码. l.l 谁需要本书? l.2 教学方法 1.3 从何处开始阅读? 1.4 警告!并非所有的C/C++编译器都完全相同 1.5 语言无关的设计工具101 1.5.l 准备 1.5.2 模型! l.5.3 结构图、伪代码及IPO框图 l.6 好的程序设计的五点要素 1.7 规则意味着可以打破 1.7.1 安塞尔亚当斯(Ansel Adams)或毕加索(Picasso) 1.7.2 注释块 1.7.3 标识符:identifiers、IDENTIFIERS和Identifiers 1.7.4 间隔与缩进 1.8 数据类型 1.9 匈牙利表示法 l.9.1 MFC、句柄、控件及结构的命名规范 1.9.2 一般前缀命名规范 1.9.3 变量命名规范 1.9.4 应用程序符号命名规范 1.9.5 Microsoft MFC宏命名规范 1.9.6 库标识符命名规范 1.9.7 静态库版本命名规范 1.9.8 动态连接库命名规范 1.9.9 windows.h命名规范 1.10 操作符优先级 1.11 小结 第2章 使用编译器忧化 2.l 编码的责任与编译器的优化 2.2 Microsoft Visual C++的优化 2.2.1 调度指令 2.2.2 函数级连接 2.2.3 字符串池 2.2.4 使用register键字 2.2.5 常量和复制的传播 2.2.6 消除死代码和死存储 2.2.7 删除冗余于表达式 2.2.8 优化循环 2.2.9 降低强度 2.2.10 inline键字的使用 2.2.11 省略帧指针 2.2.12 关闭堆检查 2.2.13 覆盖堆 2.2.14 函数调用之间允许使用别名 2.2.15 全局优化 2.2.16 产生内部函数的内联 2.2.17 优化math.h 2.3 Microsoft C++的优化开关 2.4 使用 Microsoft Visual Studio设置编译器选项 2.4.1 Project Settings对话框中的 General类型 2.4.2 Project Settings对话框中的 Code Generation类型 2.4.3 选择结构对齐方式 2.4.4 Project Settings对话框中的 Customize类型 2.4.5 Project Settings对话框中的 Optimizations类型 2.5 建立发行版本的建议 2.6 小结 第3章 逻辑与语法错误 3.l 好的调试策略 3.2 四种程序错误类型 3.2.l 语法错误 3.2.2 连接错误 3.2.3 运行错误 3.2.4 逻辑错误 3.3 查看错误消息 3.4 预防性维护 3.4.l 桌面检查的含义 3.5 异常处理设计 3.6 “请多多支持” 3.7 Microsoft Visual C++的帮助 3.8 小结 第4章 debugger 4.l 确认Debugger可以使用 4.2 启动Debugger 4.2.1 Step Into和Step Over的区别 4.2.2 Go 4.2.3 Run to Cursor 4.3 理解Debugger工具栏图标 4.3.1 Restart 4.3.2 Stop Debugging 4.3.3 Break Execution 4.3.4 Apply Code Changes、Edit and Continue 4.3.5 Show Next Statement 4.3.6 Step Into 4.3.7 Step Over 4.3.8 Step Out 4.3.9 Run to Cursor 4.3.10 Quick watch 4.3.11 Watch 4.3.12 Variables 4.3.13 Regisers 4.3.14 Meomry 4.3.15 Call Stack 4.3.16 Disassembly 4.3.17 Debugger Toolbar Menu Equivalents 4.4 其他Debug菜单选项 4.4.1 Step Into Specific Function 4.4.2 Excmpions 4.4.3 Threads 4.4.4 Modules 4.5 本地菜单Debugger选项 4.5.1 List Members 4.5.2 Type Info 4.5.3 Parameter Information 4.5.4 Complete Word 4.5.5 Go Definition/Refefence 4.5.6 Go To Disassembly 4.5.7 Insert/Remove Breakpoint。 4.6 Debugger窗口 4.6.1 Trae窗口 4.6.2 Watch窗口 4.7 View菜单和Debugger窗口 4.7.1 Workspace 4.7.2 Output 4.8 以不同的数据类型查看观察变量 4.9 打开Just-in-Time调式 4.10 Options窗口中的Debug标签 4.10.1 Hexadecimal Display 4.10.2 Source Annotation 4.10.3 Code Bytes 4.10.4 Symbols 4.10.5 Parameter Values 4.10.6 Parameter Types 4.10.7 Return Value 4.10.8 Load COEF& Exports 4.10.9 Address 4.10.10 Format 4.10.11 Re-evaluate Expression 4.10.12 Show Data Bytes 4.10.13 Fixed Width 4。10.14 Display Unicode Strings 4.10.15 View Floating Point Registers 4.10.16 Just-in-Time Debugging 4.10.17 OLE RPC Debugging 4.10.18 Debug Commands Invoke Edit and Continue 4.11 键盘映射 4.12 Debugger快捷键 4.13 小结 第5章 调试版本与发行版本 5.l 缺省的调试版本建立与发行版本建立设置 5.2 为调试版本建立修改工程设置 5.2.l 修改调试选项 5.2.2 修改产生调试信息的格式 5.2.3 产生一个映射文件 5.2.4 重定向调试输入和输出 5.3 什么是.pdb文件? 5.4 什么是.dbg文件 5.5 调试优化的代码 5.6 打开Debugger的另一种方法 5.7 使用基本版或调试版本 5.8 C/C++运行调试库 5.8.l 旧版iostream.h和新版iostrearn之间的混乱 5.9 连接器参考资料 5.10 在调试版本中检测发行版本错误 5.10.l 局部变量的自动初始化 5.10.2 检查函数指针调用稚的合法性 5.10.3 检查调用堆的合法性 5.11 TRACEN 5.12 VEAIFY宏 5.13 移植Visual C++旧的32位版本 5.13.l 转换早期的32位工作空间和工程 5.13.2 与Visual C++以前的版本共存 5.14 小结 第二部分 面向过程的环境 第6章 定位、分析和修复命令行代码错误 6.l 快速启动调试 6.1.l 启动Debugger的快速方法 6.1.2 变量初始化跟踪 6.1.3 小心调试代码 6.1.4 快速查看变量的内容 6.1.5 中途停止Debugger 6.1.6 执行到代码的指定行 6.l.7 全速执行到一个断点 6.1.8 运行至光标处 6.1.9 现在测试 6.2 高级Debugger技巧 6.2.l 使用新值运行 6.2.2 循环调试技巧 6.2.3 调用调试函数 6.2.4 递归调用与调用堆 6.2.5 查看反汇编代码 6.3 进一步观察变量 6.3.l 使用QuickWatch窗口 6.3.2 使用Watch窗口 6.4 小结 第7章 调试内联汇编语言代码 7.l 汇编语言初步 7.1.l 数据类型 7.1.2 寄存器 7.1.3 寻址模式 7.1.4 指针 7.1.5 协处理器 7.2 调试 7.2.l 减法运算 7.2.2 使用256位整数 7.2.3 程序循环 7,2.4 使用协处理器求和实数. 7.2.5 使用协处理器计算正切值 7.3 小结 第8章 在Windows代码中定位、分析和修复错误 8.l 使用两台计算机调试 8.1.l 准备远程目标计算机 8.1.2 准备主计算机 8.1.3 启动调试会话 8.2 简明Windows入门 8.2.l 基本的Windows代码 8.2.2 调试文件详述 8.2.3 程序执行的情况 8.3 调试 8.3.l 一个动画位图程序 8.3.2 使用鼠标绘画 8.4 小结 第三部分 面向对象过程的环境 第9章 定位、分析和修复命令行中的错误 9.l 高级调试工具 9.l.l 内存卸出 9.1.2 定位错误参数从何处传递而来 9.1.3 查找何处修改了指针 9.2 Class View窗口要素 9.2.1 ClassView窗口的 Grouped by Access功能 9.2.2 ClassView窗口的 Base Classes功能 9.2.3 ClassView窗口的 References功能 9.2.4 ClassView窗口的 Derived Classes功能 9.2.5 ClassView窗口中菜单的其余项 9.2.6 ClassView窗口的Properities功能 9.2.7 在ClassView窗日中添加文件夹 9.2.8 在文件夹之间移动类 9.2.9 隐藏或显不 ClassView窗口 9.3 调试ardc和argv[] 9.4 小结 第10章 使用MFC类库开发Windows程序 10.l 为什么使用类库 10.2 一个真正的基础类一一CObject 10.3 什么是应用程序向导和类向导 10.4 一个图形程序 10.4.l 使用AppWizard 10.4.2 使用 ClassWizard 10.4.3 建立AppWizard代码 10.4.4 AppWizard模板代码 10.4.5 在客户区的图形对象 10.5 剖面法 10.6 小结 第11章 定位、分析和修复 MFC Windows代码中的错误 11.l 内存问题 11.1.l 有问题的代码 11.1.2 定位和分析 11.1.3 修复工程 11.2 绘图问题 11.2.l 有问题的代码 11.2.2 定位和分析 11.2.3 修改工程 11.3 小结 第四部分 标准模板库(STL) 第12章 STL编程实践 12.1 多体系结构.. 12.2 掌握 C++ 12.3 STL――进退维谷的数据结构 12.4 初识 STL 12.5 STL和HP公司 12.6 大众化的 STL 12.7 STL总览 12.8 ANSI/ISO C++接受STL的过程 12.9 STL基本组件 12.9.l 什么是容器? 12.9.2 什么是适配器? 12.9.3 什么是算法? 12.9.4 什么是迭代器? 12.9.5 其他的STL组件 12.10 完整的STL程序包 12.11 杂乱的C/C++家族 12.12 回顾数据结构 12.12.l 静态与动态 12.12.2 类型指针 12.12.3 VOid指针 12.13 复习匈牙利命名法 12.14 函数重载 12.15 函数指针 12.16 运算符重载 12.16.l 运算符和函数调用的重载 12.16.2 编写自己的重载运算符 12.17 从结构到模板 12.17.l template关键字 12.17.2 模板语法 12.17.3 模板函数 12.17.4 模板类 12.18 为什么STL比模板好 12.19 小结 第13章 定位、分析和修复STL代码中的错误 13. l 从标准C++转向STL语法的过程中出现的问题 13.1.l 用迭代器遍历容器 13.1.2 仔细研究迭代器 13.1.3 流迭代器 13.1.4 为什么使用end() 13.1.5 复制列表 13.1.6 列表中的列表 13.1.7 STL字符串指针的麻烦 13.1.8 释放 STL指针 13.2 一个C++程序转变为STL语法的例子 13.2.l 第一步――更新aSingleCard类 13.2.2 第二步――更新 WarDeck类 13.2.3 第三步――修复STL代码的执行错误 13.2.4 第四步――更新Opponent类 13.2.5 第五步――运转的STL程序 13.3 STL语法的源文件Wargame.cpp 13.4 小结 第五部分 特殊的调试问题 第14章 使用DLL工作 14.l 创建一个基于MFC的动态链接库 14.1.l 头文件 Framer.h 14.1.2 源代码文件Framer.cpp 14.1.3 建立Framer.dll 14.2 创建使用DLL的主应用程序 14.2.l 头文件 DLLDemoView.h 14.2.2 源代码文件DLLDemoView.cpp 14.3 更加仔细地查看 14.3.1 远程调试 14.3.2 有问题的代码 14.3.3 改正后的代码 14.4 小结 第15章 使用ActiveX控件工作 15.1 开发一个 ActiveX控件 15.1.l 使用Colltrolwizard 15.1.2 Test Container 15.1.3 产生一个真实的Clock控件 15.2 调试 Clock控件 15.2.l 准备远程目标计算机 15.2.2 准备主计算机 15.2.3 开始调试过程 15.2.4 查找问题 15.3 小结 第16章 调试 COM、ATL和DHTML 16.1 COM对象模型 16.2 创建一个ATL多边形工程 16.2.1 优化模块代码 16.2.2 测试控件 16.3 调试ATLCOM控件 16.4 小结 第17章 STL和 MFC编程 17.l 产生一个STL和MFC应用程序 17.1.l 复数 17.1.2 模板语法 17.1.3 基本的应用程序代码 17.2 调试 17.3 小结
20秋学期(1709、1803、1809、1903、1909、2003、2009 )《计算机病毒分析》在线作业 ()是可以记录程序详细的运行信息的调试技术。 A:内存映射 B:基地址重定位 C:断点 D:跟踪 答案:D 在WinDbg的搜索符号中, ()命令允许你用符号在没有加载的代码中设置一个延迟断点。 A:bu B:x C:Ln D:dt 答案:A WinDbg的内存窗口支持通过命令来浏览内存,以下WinDbg读选项中,()选项描述读取内存数据并以ASCII文本显示。 A:da B:du C:dd D:dc 答案:A GFI沙箱生成报告不包括哪个小节()。 A:分析摘要 B:文件活动 C:注册表 D:程序功能 答案:D 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第1页。 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第1页。 以下哈希值做的事是() A:将哈希值作为标签使用 B:与其他分析师分享哈希值,以帮助他们来识别恶意代码 C:通过哈希值计算文件的生成日期 D:在线搜索这段哈希值,看看这个文件是否已经被识别 答案:C 在获取不到高级语言源码时,()是从机器码中能可信并保持一致地还原得到的最高一层语言。 A:机器指令 B:微指令 C:汇编语言 D:机器码 答案:C 而0x52000000对应0x52这个值使用的是()字节序。 A:小端 B:大端 C:终端 D:前端 答案:A 以下那个窗口是操作和分析二进制的主要位置,也是反汇编代码所在的地方 A:函数窗口 B:结构窗口 C:反汇编窗口 D:二进制窗口 答案:C ()能够将一个被调试的进程转储为一个PE文件 A:OllyDump B:调试器隐藏插件 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第2页。C:命令行 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第2页。 D:书签 答案:A 源代码通过()后形成可执行文件。 A:汇编 B:编译 C:连接 D:编译和连接 答案:D WinDbg的内存窗口支持通过命令来浏览内存,以下WinDbg读选项中,()选项描述读取内存数据并以内存32位双字显示。 A:da B:du C:dd D:dc 答案:C 计算机病毒的编写者使用的哪项技术可以使编写的代码,功能不变,语义混淆。 A:垃圾指令 B:多态技术 C:变形技术 D:单项执行技术 答案:C 内存中的()节用于函数的局部变量和参数,以及控制程序执行流。 A:数据 B:堆 C:代码 D: 答案:D 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第3页。PE文件中的分节中唯一包含代码的节是()。 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第3页。 A:.rdata B:.text C:.data D:.rsrc 答案:B 在以下寄存器中用于定位要执行的下一条指令的寄存器是()。 A:通用寄存器 B:段寄存器 C:状态寄存器 D:指令指针 答案:D 以下Windows API类型中()是描述一个双字节、32位的无符号数值。 A:WORD B:DWORD C:Habdles D:Callback 答案:B 下列对内核套件的描述正确的是()。 A:恶意代码将自身安装到一台计算机来允许攻击者访问 B:这是一类只是用来下载其他恶意代码的恶意代码 C:用来启动其他恶意程序的恶意代码 D:设计用来隐藏其他恶意代码的恶意代码网络造成破坏的软件 答案:D 在WinDbg的搜索符号中, ()命令允许你使用通配符来搜索函数或者符号。 A:bu B:x C:Ln D:dt 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第4页。答案:B 20秋学期(1909、2003、2009-)《计算机病毒分析》在线作业全文共11页,当前为第4页。 要插入一个跨反汇编窗口,并且在任何时候只要存在对你添加注释的地址的交叉引用就重复回显,应该按()键。 A:; B:: C:shift D:ctrl 答案:A ()被定义为一个相似数据项的有序集合。 A:数组 B:结构体 C:链表 D:变量 答案:A 以下哪个选项属于木马()。 A:震网病毒 B:WannaCry C:灰鸽子 D:熊猫烧香 答案:C WinINet API实现了()层的协议。 A:网络层 B:数据链路层 C:应用层 D:传输层 答案:C 单步调试是通过( )实现的 A:每条代码之前添加软件断点 20秋学期(1909、2003、2009-)《计算机病毒分

64,636

社区成员

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

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