首页
社区
课程
招聘
[求助]函数翻译成汇编,求解释
发表于: 2013-7-15 20:46 13703

[求助]函数翻译成汇编,求解释

2013-7-15 20:46
13703
void main()
{
        int i;
        _asm
        {
                MOV i,0x123456
        }
}

在VS2008中下断,然后用汇编查看
--- f:\我的文档\exe\win32_asm\win32_asm\win32_asm.c --------------------------------
// WIN32_ASM.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
void main()
{
004113A0  push        ebp  
004113A1  mov         ebp,esp
004113A3  sub         esp,0CCh
004113A9  push        ebx  
004113AA  push        esi  
004113AB  push        edi  
004113AC  lea         edi,[ebp-0CCh]
004113B2  mov         ecx,33h
004113B7  mov         eax,0CCCCCCCCh
004113BC  rep stos    dword ptr es:[edi]
        int i;
        _asm
        {
                MOV i,0x123456
004113BE  mov         dword ptr [i],123456h
        }
}
004113C5  pop         edi  
004113C6  pop         esi  
004113C7  pop         ebx  
004113C8  add         esp,0CCh
004113CE  cmp         ebp,esp
004113D0  call        @ILT+310(__RTC_CheckEsp) (41113Bh)
004113D5  mov         esp,ebp
004113D7  pop         ebp  
004113D8  ret              
--- 无源文件 -----------------------------------------------------------------------

翻译成这样,我主要就是想搞懂,函数的栈的函数,
所以麻烦,亲们,把汇编语言解释一下,我知道push是压栈,pop出栈,
我想搞明白,压栈和出栈的一些规则呀,协调呀,这些~~~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1392
活跃值: (5212)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
自己拿本汇编的书多看看。问一下,人家告诉你一下。人家这么告诉你,你问题不还是一堆??

同时你这个模式是DEBUG模式,调成RELEASE模式汇编代码会更加简洁易懂
2013-7-15 20:50
0
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
你这是debug模式啊,前后到处都是没有用的代码啊。。。你先改成release再看汇编呗。。。

你的那句汇编,他的前面都是DEBUG模式下编译器生成的堆栈代码,为的就是在你的堆栈里面填充0xCC个0xCC。
0xCC这个数值翻译成汇编指令就是int 3,是个单步中断指令。

你的那句汇编,他后面的是平衡堆栈代码,前面使用了0xCC个堆栈,后面自然要调整ESP回复原状。后面的那个 CheckEsp是编译器运行时库的函数,debug模式就会有这样的奇怪代码出现。。。

你看这些都没有用,因为真正的程序你去逆向的时候都不会有这种东西的。。。

另外就是你这个main函数既没有返回值也没有参数,你想通过他来观看参数传递压栈的流程,是不是有点搞笑了。。

至于你说的压栈和出栈的规则,栈嘛,自然是后入先出呗。。。还能有什么规则。。。

在就和楼上的说的一样,自己多看书,这种很基础的知识是必须自己一点一点学的,靠着提问是问不清楚的。。。
2013-7-15 21:47
0
雪    币: 333
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
004113A0  push        ebp                                 
004113A1  mov         ebp,esp                             上面两句主要是为用EBP读参数做准备,也是为程序运行完毕后恢复堆栈做准备,ESP会随时改变,所以才会用EBP做为读取函数参数的指针
004113A3  sub         esp,0CCh                           留出局部变量空间
004113A9  push        ebx  
004113AA  push        esi  
004113AB  push        edi                                    和你看到的一样,保存寄存器,防止函数里面破坏这些数据
004113AC  lea         edi,[ebp-0CCh]                  EBP-0CCH其实就是局部变量的地址,这是在做什么?我也是菜鸟,不懂
004113B2  mov         ecx,33h
004113B7  mov         eax,0CCCCCCCCh
004113BC  rep stos    dword ptr es:[edi]          这3句我也不懂,我想也不会影响什么
  int i;
  _asm
  {
    MOV i,0x123456
004113BE  mov         dword ptr [i],123456h
  }
}
004113C5  pop         edi  
004113C6  pop         esi  
004113C7  pop         ebx                          和上面的PUSH对应,其实不恢复也没什么,只要函数里不改变这些寄存器就没事,程序能不能平衡堆栈主要看下面MOV ESP,EBP和POP EBP
004113C8  add         esp,0CCh                清除局部变量地址,其实也没真正的清除,就是把指针移动一下而已,不做这步也行,反正后面有MOV ESP,EBP呢
004113CE  cmp         ebp,esp
004113D0  call        @ILT+310(__RTC_CheckEsp) (41113Bh)     这是做什么?估计是C语言怕EBP被改变而造成程序真的不能正确返回而做的检测吧
004113D5  mov         esp,ebp
004113D7  pop         ebp                这两句才是真正保证程序堆栈平衡的关键,配合开始两句使用,如果你不想让程序正确返回只要把EBP的值改乱就行了
004113D8  ret

我也不懂的是INT I;是4字节的变量啊,为什么申请0CCH空间大小?
2013-9-20 15:57
0
游客
登录 | 注册 方可回帖
返回
//