3.21~3.22
识编程语言中的,局部变量,全局变量,以及变量生存周期,整形,浮点型数据的内存表示,od的内存窗口的使用
先看一个代码样例
#include<windows.h>
#include<stdio.h>#pragma warning(disable:4996)int c = 0;void sub()
{double a = 0;int b = 0;scanf_s("%lf", &a);printf("%lf", a);scanf_s("%d", &b);printf("%d", b);
}int main()
{sub();scanf_s("%d", &c);printf("%d", c);return 0;
}
样本test.exe
上传到了我上传的资源中,自行寻找
我们用IDA32打开该样本可以看到
观察这幅图我们看看
三个变量分别在哪里
注意: 代码顺序和汇编顺序是一致的,变量出现的前后也是一致的
同时变量应该是根据代码来找,而不是IDA生成的这个局部变量
仔细看看这段伪指令
lea eax, [esp+40h+var_10]
mov [esp+40h+var_14], 0
push eax
xorps xmm0, xmm0
push offset _Format ; "%lf"
movsd [esp+48h+var_10], xmm0
call _scanf_s
在汇编层面,函数调用,参数传递,大部分是通过堆栈搞的
push xxx
push xxx
call xxxx
我们再看看scanf_s有几个参数
两个
所以汇编里面,压了两次栈
lea指令:
1、lea eax,[addr]
就是将表达式addr的值放入eax寄存器,示例如下:
lea eax,[401000h]; 将值401000h写入eax寄存器中
lea指令右边的操作数表示一个精指针,上述指令和mov eax,401000h是等价的
2、lea eax,dword ptr [ebx];将ebx的值赋值给eax
3、lea eax,c;其中c为一个int型的变量,该条语句的意思是把c的地址赋值给eax;
原文链接:https://blog.csdn.net/qq_34432960/article/details/108101247
xorps指令:
XOR指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存在目标操作数中
原文链接:https://blog.csdn.net/QinZhen20100224/article/details/123151547
ABC对应的地址分别为
.text:004010B4 lea eax, [esp+40h+var_10]
.text:004010E9 lea eax, [esp+4Ch+var_14]
.text:00401106 push offset ?c@@3HA ; int c
为什么会是这样?
我们看源码会发现
ab 是局部变量,c 是全局变量
lea 后面跟的是不是ESP开头的?
说明,这两个参数是放在堆栈上的
而push offset xxx 对应的变量往往不是放到堆栈上的
a 和b 的地址 和c的地址,都放在堆栈上
但是a 和 b 本身家就在堆栈上
而c 的家不在堆栈上
所以,局部变量的生命周期,在函数返回后,局部变量的里的值,就可能会被别的程序占用了
大多数函数开始前,.text:004010A6
sub esp, 40h这条指令,就是为局部变量建家
而为什么是40h?
这个是依据编译器,计算得到的,不同函数,这个值会不同
现在我们来看看,a和b 的实际字节数
b的存储大小是|-14| 减|-10| ,绝对值减,所以b的大小是4个字节
是不是一个int的大小
a的大小是 10H - 4
目前a算出来的大小是12个字节
和 longlong 有偏差对不对
打开ob,我们看看
跳转到对应的地址,我们看看,scanf赋值后,到底覆盖了多长的字节
再ob里按m看到PE的文件头前的地址
在IDA里点击edit
点segmen
点rebase program
点image
输入在ob里看到的地址
最后确定
在ob里面按c
ctr+g
输入主函数的地址,直接跳转
之间到这个地址,下个断点F2
然后F9按一次
单步到110b8
单步到110B8之后,在寄存器窗口,EAX 右键 数据窗口跟随
中途因为不是很熟这些操作,程序跑飞了很多次
所以后面的截图地址有差别,请注意
F8到10D4
注意观察数据窗口对应的地址内容
在数据框输入一个内容
刚才的变化是:内存单元的值变成00 00 00 00 00 00 F0 3F
我这边输入6,内存单元可以看出是6
内存单元变化:06 00 00 00
1的值,在内存中,8个字节,却看不见0x1的影子
但是第二输入6 却可以看出0x6
想想,a 和 b 是什么类型?
a是double类型
b是int型
double类型存储和int类型是不一样的
浮点数的存储:https://www.cnblogs.com/onedime/archive/2012/11/20/2779723.html
继续看第三个C的值
补充db命令
db 就是在数据窗口,跟踪特定地址的命令
堆栈里面的A6就是166的十六进制
db 0x3E3374
观察数据数据窗口的两种方法:
右键–数据窗口跟随,用db 命令
总结
局部变量,全局变量,的汇编指令表示形式,生存周期;局部变量,函数返回后,就失效了,全局变量,函数退出后失效,函数参数传参形式,传参顺序从右到左
传参顺序从右到左: https://blog.csdn.net/zDavid_2018/article/details/82634525
认识数组在内存中的表现形式,地址赋值形式,数值赋值形式,熟悉if,for,while汇编表现形式。
第一个样本addr_code
#include<windows.h>
#include<stdio.h>#pragma warning(disable:4996)int main()
{//地址赋值PINT pCount = NULL;int a = 0;pCount = &a;//数值赋值int b = 166;//数组赋值CHAR tmp[12] = { 0 };strcpy_s(tmp, sizeof(tmp), "HelloWorld! GUET");return 0;
}
找 a pCount 和 数组初始化的位置
这是给pCount地址赋值的NULL
这是把a地址赋值给pCount
这是给b的赋值
因为初学,我们这里是看得到源码的
当我们不清楚的时候,可以多往源码去看
在这个汇编程序中涉及到一个知识点,我们用ob去寻找
b赋值的代码时
在下面的代码中,没有用到的局部变量,编译器在Release中,不会给其生成代码的
所以也就找不到变量b的相关信息
第二个样本if
#include<windows.h>
#include<stdio.h>#pragma warning(disable:4996)int main()
{int a = 0,b =5;PCHAR pstr = "HelloWorld";//注意局部变量的初始化//单条件IFif (a == 1) {printf("first if\n");}//多条件IFif (a == 0 && b == 5) {printf("second if\n");}//带函数判断条件的IFif (b!=4 && a != 3 && 0 == strcmp(pstr, "Helloworld")) {printf("third if\n");}return 0;
}
**补充:**在IDA里面我们可以按n键进行重命名
问题还是同上
a、b赋值
pstr数组赋值
同时我们再找到判断C语言和汇编语言所对应的指令
再看for样本
#include<windows.h>
#include<stdio.h>int main()
{int Count = 100;int Len = 1000;//FOR循环for (int j = 0; j < Count; j++) {Len--;}printf("%d", Len);return 0;
}
J++在哪里?
LEN–呢?
J < count 呢 具体时哪一条指令?
while样本
#include<windows.h>
#include<stdio.h>int main()
{int Count = 100;int Len = 1000;//While循环do {Len--;Count--;} while (Count != 0);printf("first:%d\r\n", Len);Count = 100,Len = 1000;while (Count != 0) {Len--;Count--;}printf("Second:%d\r\n", Len);return 0;
}
先是变量
第一个循环
第二个循环
第一个循环
第二个循环分别退出的条件
** do while 和 while 有什么区别**
do whlie 是做后判断
while是先给出判定
后做
本次学习中最开始的样本是由VC2022编译出来的
导致其实用IDA看到的代码全都是优化过的,也就是变量啥的,都看不到
后续学习内容
switch 结构,内存类函数,标准库函数和底层函数的区别
相关文章:

3.21~3.22
识编程语言中的,局部变量,全局变量,以及变量生存周期,整形,浮点型数据的内存表示,od的内存窗口的使用 先看一个代码样例 #include<windows.h> #include<stdio.h>#pragma warning(disable:499…...
Chromium 改造实录:增加 MPEG TS 格式支持
在《选择最新 Chromium,支持 H264 / H265》一文中,记录了我通过升级 Chromium 版本解决了 H264 / H265 视频支持难题。然而难题接踵而至,这次的难题是 MPEG TS 流的支持。MPEG2-TS 传输流广泛应用于数字电视广播系统,所以是一个不…...

性能优化之-事件代理
js中的事件委托或是事件代理简单理解 事件委托也叫事件代理,“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown…)委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。 概述&#x…...
MSDS 即化学品安全说明书
MSDS 即化学品安全说明书,亦可译为化学品安全技术说明书或化学品安全数据说明书,是化学品生产商和进口商用来阐明化学品的理化特性(如PH值,闪点,易燃度,反应活性等)以及对使用者的健康ÿ…...

真人手办没法实现网购?我有一个好办法!
记得以前在网上看到过一个冷笑话式的问答,问的是中国最早的手办是什么,有网友回答是秦始皇兵马俑,这个抖机灵式的回答简直妙得让人会心一笑。 你接触过手办吗? 提到手办,大家第一时间想到的,肯定都会是各…...
2019湖南省大学生程序设计竞赛题解(D)
D-Modulo Nine 很妙的类似区间dp, 我自己是想不到,本题解题思路来自学长的博客: 长沙橘子猫 题意 有一个长度为 nnn 的序列,你可以给每个位置填 0∼90\sim90∼9 的一个数,有 mmm 个限制,每个限制 [li,ri…...

【开发】中间件——RocketMQ
分布式消息系统 RocketMQ概念,用途,特性安装RocketMQ掌握RocketMQ的api使用对producer、consumer进行详解了解RocketMQ的存储特点 简介及相关概念JavaAPISpringBoot整合RocketMQ消息的顺序收发消息系统的事务、存储、重试策略消息系统的集群 RocketMQ R…...

36 UnitTest框架 - 参数化
目录 一、参数化环境准备 1、方式一:在终端(cmd)安装parameterized 2、方式二:在Pycharm中安装parameterized 二、参数化 1、什么事参数化? 2、参数化引入案例 (1)需求 (2&a…...
Qt源码阅读(四) 事件循环
事件系统 文章为本人理解,如有理解不到位之处,烦请各位指正。 文章目录事件系统什么是事件循环?事件是如何产生的?sendEventpostEvent事件是如何处理的?事件循环是怎么遍历的?事件过滤器event夹带私货时间Q…...

银行数字化转型导师坚鹏:银行数字化领导力提升之道
银行数字化领导力提升之道 ——融合中西智慧,践行知行合一思想,实现知行果合一 课程背景: 很多银行存在以下问题:不知道如何领导数字员工?不清楚银行数字化领导力模型的内涵?不知道如何开展银行数字化…...

Vue2 -- 自定义单选内容的单选框组件
自定义单选内容的单选框组件 之前做的一个项目,在项目中有一个关于人员权限分配的功能,给人员指定各个模块的权限信息,分为 write 可写权限read 可读权限none 没有权限 项目要求画面中只显示 W R 两个按钮控制指定权限信息,都不…...

让PyTorch训练速度更快,你需要掌握这17种方法
掌握这 17 种方法,用最省力的方式,加速你的 Pytorch 深度学习训练。近日,Reddit 上一个帖子热度爆表。主题内容是关于怎样加速 PyTorch 训练。原文作者是来自苏黎世联邦理工学院的计算机科学硕士生 LORENZ KUHN,文章向我们介绍了在…...

LeetCode-309. 最佳买卖股票时机含冷冻期
目录题目思路动态规划题目来源 309. 最佳买卖股票时机含冷冻期 题目思路 每天最多只可能有三种状态中的一种 0表示当前处于买入状态(持有股票) 1表示当前处于卖出状态(不持有股票) 2表示当前处于冷冻状态 设dp[i][j]表示i - 1天状态为j时所拥有的最大现金 dp[i][0] Math.ma…...

AUTOSAR知识点Com(七):CANSM初认知
目录 1、概述 2、CanSM主要做什么 2.1、CAN控制器状态管理 2.2、CAN收发器状态管理 2.3、Busoff检测 1、概述 CANSM(Controller Area Network State Manager)是AUTOSAR(Automotive Open System Architecture)标准中的一个模块…...

递归:斐波那契数列、递归实现指数型枚举、递归实现排列型枚举
递归:O(2^n) 调用自己 例题及代码模板: 斐波那契数列 输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0。 数据范围 0≤n≤39 样例 输入整数 n5 返回 5 #include <iostream> #include <cstring&g…...
oracle模糊查询时字段内容包含下划线的解决办法
最近项目中遇到一个关于模糊查询问题。表tabA中的字段name的值有下划线的情况,在模糊查询时发现查询的记录不对。 表的结构 表名:tabA id name sex 1 test_601 1 2 test_602 2 3 test16 1 4 t…...

C++:explicit关键字
C中的explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的,而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。那么显示声…...

【C5】bmc wtd,post
文章目录1.bmc_wtd_cpld:syscpld.c中wd_en和wd_kick节点对应寄存器,crontab,FUNCNAME2.AST芯片WDT切换主备:BMC用WDT2作为主备切换的控制器2.1 AC后读取:bmc处于主primary flash(设完后:实际主&…...

200.Spark(七):SparkSQL项目实战
一、启动环境 需要启动mysql,hadoop,hive,spark。并且能让spark连接上hive(上一章有讲) #启动mysql,并登录,密码123456 sudo systemctl start mysqld mysql -uroot -p#启动hive cd /opt/module/ myhadoop.sh start#查看启动情况 jpsall#启动hive cd /opt/module/hive/…...

区块链系统:挖矿原理
在比特币的P2P网络中,有一类节点,它们时刻不停地进行计算,试图把新的交易打包成新的区块并附加到区块链上,这类节点就是矿工。因为每打包一个新的区块,打包该区块的矿工就可以获得一笔比特币作为奖励。所以,…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...