汇编之youyouyou内存图15

@TOC

内存图

exe 程序运行时 内存的划分,定义

代码区
可读可执行

存放 if,else,while 等你写的代码.

堆栈

参数,局部变量,临时数据. 比如: 一些中间结果就是临时数据
当堆栈执行完毕,其中的数据变成 垃圾数据


可读可写

动态申请的,大小是可变的. 

全局变量区
可读可写

存放了全局变量

常量区
只读

存放常量的地方

在这里插入图片描述

详解

全局变量

int g,n = 10;
int Function()
{
	int x = 2;
	int y = 3;
	return g+n+x+y;
}
全局变量 在程序编译完毕后的地址 已经确定下来了.
全局变量所占内存会一直存在,直到整个进程结束
全局变量反汇编识别
MOV  寄存器  ,  byte/word/dword ptr:ds[2012345678]

通过寄存器宽度 或者 byte/word/dword 判断全局变量的宽度
在这里插入图片描述
在这里插入图片描述

最后一行	mov [arr (00427320)],eax.等同于
mov dword ptr:[00427320] ,eax

这里最后eax 的mov 和 add, mov 是一个死的地址. 所以是一个全局变量. 这个地址是一个基质

局部变量

函数内的变量

ebp - 4. 大多是局部变量

在这里插入图片描述

参数判断

判断参数有几个参数
在这里插入图片描述
在这里插入图片描述
这里 代表着 不同参数调用方式之后的堆栈平衡的方式
在这里插入图片描述
平衡堆栈, ret 参数. 4 字节存放一个参数 .以此类推. 分别是1,2,3,4 个参数
在这里插入图片描述
fastCall 传递参数使用 寄存器传递参数

案例

1
在这里插入图片描述

这种情况下,可能都是参数,也可能只有几个是参数

有时候我们看不到 调用代码的地方. 也就看不到 push 操作

2

我们跟到代码中. 
1 不考虑 ebp,esp
2 只找给别人赋值的寄存器,eax,ecx,edx,ebx,esi,edi
3 找到以后追查其来源. 如果该寄存器中的值不是在函数内赋值. 
	那么一定是传递进来的参数
1 寄存器 + ret  4 = 参数个数
2 寄存器 + [ebp + 8 ] + [ebp + 0x ] = 参数个数 

在这里插入图片描述
图: ret 4 代表有一个压栈的参数

IF

在这里插入图片描述
在这里插入图片描述

# ebp保存的是 栈低的地址. 将 ebp 内部的值入栈
push  ebp
# 栈顶 的值 赋给 ebp. 
mov ebp,esp
# 开辟 0x40 个字节. 开辟堆栈空间完成
sub esp,0x40
# 将ebx 的值入栈
push ebx
# 将 esi的值入栈
push esi
# 将edi的值入栈 
push edi
# 将 ebp - 40h 的值 是一个地址值,将该地址值内部数据的地址给 edi 存储
lea edi,[ebp - 40h]
# 填充堆栈空间数据
mov ecx,10h
mov eax,0cccccccch
rep stos dword ptr:[edi]

主要功能
主要分析识别 if 语句

看到一些影响标志位的 语句,看到 jcc指令语句之后. 很可能就是  if  语句

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值