12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 404|回复: 0

逆向基础笔记十二 汇编 全局和局部 变量

[复制链接]

49

主题

49

帖子

108

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
108
发表于 2021-7-18 18:00:59 | 显示全部楼层 |阅读模式
逆向基础笔记一 进制篇
逆向基础笔记二 数据宽度和逻辑运算
逆向基础笔记三 通用寄存器和内存读写
逆向基础笔记四 堆栈篇
逆向基础笔记五 标志寄存器
逆向基础笔记六 汇编跳转和比较指令
逆向基础笔记七 堆栈图(重点)
逆向基础笔记八 反汇编分析C语言
逆向基础笔记九 C语言内联汇编和调用协定
逆向基础笔记十 汇编探求C程序入口
逆向基础笔记十一 汇编C语言根本范例
逆向基础笔记十三 汇编C语言范例转换
逆向基础笔记十四 汇编嵌套if else
逆向基础笔记十五 汇编比较三种循环
逆向基础笔记十六 汇编一维数组
逆向基础笔记十七 汇编二维数组 位移 乘法
逆向基础笔记十八 汇编 结构体和内存对齐
逆向基础笔记十九 汇编switch比较if else
逆向基础笔记二十 汇编 指针(一)
逆向基础笔记二十一 汇编 指针(二)
逆向基础笔记二十二 汇编 指针(三)
逆向基础笔记二十三 汇编 指针(四)
逆向基础笔记二十四 汇编 指针(五) 系列完结
全局变量和局部变量

在提及全局变量和局部变量之前,需要先谈谈程序运行时在内存中的状态
任何一个程序在运行时都会把内存分成如下几块区域:
区域功能区域属性代码区存储程序要执行的代码可读可执行堆栈存储参数、局部变量、暂时数据操作系统分配堆动态申请的、巨细可变的可读可写全局变量区存储全局变量可读可写常量区存储常量只读全局变量


  • 全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面是否有值取决于声明时是否给定了初始值,假如没有,默认为0
  • 全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值.
  • 全局变量所占内存会一直存在,直到整个进程结束.
  • 全局变量的反汇编识别:
    MOV  寄存器,byte/word/dword ptr ds:[0x12345678]上面的0x12345678是固定的地址,每次程序启动都不变
    通过寄存器的宽度,或者byte/word/dword  来判断全局变量的宽度
  • 全局变量就是所谓的基址
局部变量


  • 局部变量在程序编译完成后并没有分配固定的地址
  • 在所属的方法没有被调用时,局部变量并不会分配内存地址,只有当所属的程序被调用了,才会在堆栈中分配内存
  • 政府部变量所属的方法执行完毕后,局部变量所占用的内存将变成垃圾数据.局部变量消失
  • 局部变量只能在方法内部使用,函数A无法使用函数B的局部变量
  • 局部变量的反汇编识别
    [ebp-4]
    [ebp-8]
    [ebp-0xC]
例子

#include "stdafx.h"//全局变量int global=0x610;int main(int argc, char* argv[]){    //局部变量        int temp=0x160;        global=global+temp;        return 0;}
4:    #include "stdafx.h"5:    //全局变量6:    int global=0x610;7:    int main(int argc, char* argv[])8:    {00401010   push        ebp00401011   mov         ebp,esp00401013   sub         esp,44h00401016   push        ebx00401017   push        esi00401018   push        edi00401019   lea         edi,[ebp-44h]0040101C   mov         ecx,11h00401021   mov         eax,0CCCCCCCCh00401026   rep stos    dword ptr [edi]9:        //局部变量10:       int temp=0x160;00401028   mov         dword ptr [ebp-4],160h11:12:       global=global+temp;0040102F   mov         eax,[global (00428a64)]00401034   add         eax,dword ptr [ebp-4]00401037   mov         [global (00428a64)],eax13:14:       return 0;0040103C   xor         eax,eax15:   }0040103E   pop         edi0040103F   pop         esi00401040   pop         ebx00401041   mov         esp,ebp00401043   pop         ebp00401044   ret我们可以看到相关代码在这里:
9:        //局部变量10:       int temp=0x160;00401028   mov         dword ptr [ebp-4],160h11:12:       global=global+temp;0040102F   mov         eax,[global (00428a64)]00401034   add         eax,dword ptr [ebp-4]00401037   mov         [global (00428a64)],eax我们可以很清楚地看到局部变量是直接保存在[ebp-4]也就是堆栈中的
而全局变量则是保存在一个固定的内存地址00428a64里
同时在断点刚断下的时候,就是还没运行上面的代码时,观察[global (00428a64)]也就是全局变量地址里存储的内容时,可以看到

我们全局变量已经初始化并被赋值了,观察整个main函数的反汇编代码,我们并没有看到全局变量赋值相关的语句,但这并不能说明程序在运行前就已经赋值了,别忘了也有大概是在mainCRTStartup中将这里初始化的,为了印证这一点,我们直接将程序用OD打开,然后会在mainCRTStartup函数执行前断下,以此来验证是否是一打开程序全局变量就已经初始化了
不懂mainCRTStartup的可以去回首逆向基础笔记十 汇编探求C程序入口
输入之前全局变量的地址,然后查看


可以观察到左下角数据窗口里,我们的全局变量已经初始化了,验证完毕(●ˇ∀ˇ●)

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 15:23 , Processed in 0.140625 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表