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网络中,有一类节点,它们时刻不停地进行计算,试图把新的交易打包成新的区块并附加到区块链上,这类节点就是矿工。因为每打包一个新的区块,打包该区块的矿工就可以获得一笔比特币作为奖励。所以,…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...
安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗
加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统,彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年,沉淀医疗技术、计算机科学与人工智能经验,聚焦医疗保健领域,提供AR、AI、IoT解决方案。 该方案使医疗…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...
ubuntu系统 | docker+dify+ollama+deepseek搭建本地应用
1、docker 介绍与安装 docker安装:1、Ubuntu系统安装docker_ubuntu docker run-CSDN博客 docker介绍及镜像源配置:2、ubuntu系统docker介绍及镜像源和仓库配置-CSDN博客 docker常用命令:3、ubuntu系统docker常用命令-CSDN博客 docker compose安装:4、docker compose-CS…...
Server - 使用 Docker 配置 PyTorch 研发环境
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/148421901 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 建议使…...
编程笔记---问题小计
编程笔记 qml ProgressBar 为什么valuemodel.progress / 100 在QML中,ProgressBar的value属性用于表示进度条的当前进度值,其范围通常为0到1(或0%到100%)。当使用model.progress / 100来设置value时,这样做的原因是为…...
