分析数组,结构体在反汇编中存储

本文会在IDA中分析数组,结构体在内存中的存储

目录

IDA分析数组存储

IDA分析结构体存储

传递参数的方式


IDA分析数组存储

测试代码如下:

/************************************************************************/
/*@Author            : 玄都大法师
/*@Data              : 2023/09/11
/*@Description       : 汇编学习/************************************************************************/#include <stdio.h>int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int n = 2;arr[2] = 20;return 0;
}

去除main函数的栈帧汇编,留下有关数组的部分

.text:004143F5                 mov     [ebp+var_18], 1
.text:004143FC                 mov     [ebp+var_14], 2
.text:00414403                 mov     [ebp+var_10], 3
.text:0041440A                 mov     [ebp+var_C], 4
.text:00414411                 mov     [ebp+var_8], 5
.text:00414418                 mov     [ebp+var_24], 2
.text:0041441F                 mov     eax, 4
.text:00414424                 shl     eax, 1
.text:00414426                 mov     [ebp+eax+var_18], 14h

进入到main函数的堆栈空间查看

数组在内存堆栈中存储是一段连续的空间,数组名就是这段空间的首地址

得到数组地址是 0x00B5FEB4

在内存搜索

数组数据的存储是从首地址开始的

在IDA分析数组,这是在对数组初始化,[EBP-18h]就是数组的首地址

双击var_18进入main的堆栈空间,修改var_18的名字为arr

把这段数据转换为数组形式,需要设置整个数组的元素个数,从首地址开始转换

IDA数组部分汇编发生了变化

可以总结出来一个公式,访问数组的元素就是通过 数组首地址+偏移量 

&arr[n] = arr + 4*n   

分析如下:

.text:004143F5                 mov     [ebp+arr], 1    ; 数组第一个元素
.text:004143FC                 mov     [ebp+arr+4], 2  ; 数组第二个元素
.text:00414403                 mov     [ebp+arr+8], 3  ; 数组第三个元素
.text:0041440A                 mov     [ebp+arr+0Ch], 4 ; 数组第四个元素
.text:00414411                 mov     [ebp+arr+10h], 5 ; 数组第五个元素
.text:00414418                 mov     [ebp+var_24], 2 ; int n = 2;  给变量n赋值
.text:0041441F                 mov     eax, 4
.text:00414424                 shl     eax, 1          ; 配合上一条 4 = 0100 shL偏移一位
.text:00414426                 mov     [ebp+eax+arr], 14h ; 修改数组第三个元素   arr[2] = 20;
.text:0041442E                 xor     eax, eax        ; return 0

IDA分析结构体存储

测试代码

/************************************************************************/
/*@Author            : 玄都大法师
/*@Data              : 2023/09/11
/*@Description       : 汇编学习/************************************************************************/#include <stdio.h>struct MyStruct
{int nNum;float fNum;char chA;
};void Print(MyStruct stc)
{printf("int %d, y %f,z %c", stc.nNum, stc.fNum, stc.chA);
}int main()
{MyStruct stc = {1, 2.2, 'A'};stc.fNum = 5.5;Print(stc);return 0;
}

分析和结构相关的汇编代码

.text:004143E0 ; int __cdecl main_0(int argc, const char **argv, const char **envp)
.text:004143E0 _main_0         proc near               ; CODE XREF: _main↑j
.text:004143E0
.text:004143E0 var_14          = byte ptr -14h
.text:004143E0 var_10          = dword ptr -10h
.text:004143E0 var_C           = dword ptr -0Ch
.text:004143E0 var_8           = dword ptr -8
.text:004143E0 argc            = dword ptr  8
.text:004143E0 argv            = dword ptr  0Ch
.text:004143E0 envp            = dword ptr  10h
.text:004143E0
.text:004143E0                 push    ebp
.text:004143E1                 mov     ebp, esp
.text:004143E3                 sub     esp, 0D4h
.text:004143E9                 push    ebx
.text:004143EA                 push    esi
.text:004143EB                 push    edi
.text:004143EC                 lea     edi, [ebp+var_14]
.text:004143EF                 mov     ecx, 5
.text:004143F4                 mov     eax, 0CCCCCCCCh
.text:004143F9                 rep stosd
.text:004143FB                 mov     ecx, offset unk_41C003
.text:00414400                 call    j_@__CheckForDebuggerJustMyCode@4 ; __CheckForDebuggerJustMyCode(x)
.text:00414405                 mov     [ebp+var_10], 1
.text:0041440C                 movss   xmm0, ds:dword_417BE0 ; 浮点数的存储应该和编译器有关
.text:00414414                 movss   [ebp+var_C], xmm0 ; 浮点数的赋值往往借助xmm0寄存器
.text:00414419                 mov     byte ptr [ebp+var_8], 41h ; 'A'
.text:0041441D                 movss   xmm0, ds:dword_417BE4 ; 字符的赋值也是往往借助xmm0寄存器
.text:00414425                 movss   [ebp+var_C], xmm0
.text:0041442A                 sub     esp, 0Ch        ; 这种函数传参也很有意思
.text:0041442D                 mov     eax, esp        ; 把esp给eax,通过eax来实现参数压入栈
.text:0041442F                 mov     ecx, [ebp+var_10]
.text:00414432                 mov     [eax], ecx      ; [eax]是对eax存储的地址引用,相当于 esp
.text:00414434                 mov     edx, [ebp+var_C]
.text:00414437                 mov     [eax+4], edx
.text:0041443A                 mov     ecx, [ebp+var_8]
.text:0041443D                 mov     [eax+8], ecx
.text:00414440                 call    sub_4113C0
.text:00414445                 add     esp, 0Ch
.text:00414448                 xor     eax, eax
.text:0041444A                 push    edx
.text:0041444B                 mov     ecx, ebp        ; Esp
.text:0041444D                 push    eax
.text:0041444E                 lea     edx, Fd         ; Fd
.text:00414454                 call    j_@_RTC_CheckStackVars@8 ; _RTC_CheckStackVars(x,x)
.text:00414459                 pop     eax
.text:0041445A                 pop     edx
.text:0041445B                 pop     edi
.text:0041445C                 pop     esi
.text:0041445D                 pop     ebx
.text:0041445E                 add     esp, 0D4h
.text:00414464                 cmp     ebp, esp
.text:00414466                 call    j___RTC_CheckEsp
.text:0041446B                 mov     esp, ebp
.text:0041446D                 pop     ebp
.text:0041446E                 retn
.text:0041446E _main_0         endp

结构体赋值

分析print函数调用,新的调用传参

.text:0041442A                 sub     esp, 0Ch        ; 这种函数传参也很有意思
.text:0041442D                 mov     eax, esp        ; 把esp给eax,通过eax来实现参数压入栈
.text:0041442F                 mov     ecx, [ebp+var_10]
.text:00414432                 mov     [eax], ecx      ; [eax]是对eax存储的地址引用,相当于 esp
.text:00414434                 mov     edx, [ebp+var_C]
.text:00414437                 mov     [eax+4], edx
.text:0041443A                 mov     ecx, [ebp+var_8]
.text:0041443D                 mov     [eax+8], ecx
.text:00414440                 call    sub_4113C0
.text:00414445                 add     esp, 0Ch

这种函数传参调用函数,没有通过esp,借助eax寄存器来寻址把参数入栈,实际上效果和原来一样,换汤不换药。

IDA中添加结构体

在IDA空白界面右击,选择 Add struct type  或者空白处摁下insert  如果想要创建标准结构体,就点击 add standard structure

输入名字

创建成功

在ends这一行,摁下d就可以创建结构体元素,在元素一行后面摁d可以修改大小

应用结构体

选到首个元素地址,摁下y,输入需要修改的结构体名称,然后重命名

IDA的变化

结构体的特征:给一段连续空间赋值,数组也有,但区别在于,两者寻址方式不一样,而且数组元素类型单一

传递参数的方式

方式一:

push 0x1;
push 0x2;
push 0x3;

方式二:

sub esp 0xC;
mov [esp+0x0],1;
mov [esp+0x4],2;
mov [esp+0x8],3;

方式三:

sub esp 0xC;
mov eax,esp;mov [eax+0x0],1;
mov [eax+0x4],2;
mov [eax+0x8],3;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

已解决 Kotlin Error: Null can not be a value of a non-null type String

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

Intel汇编在VS下开发的环境配置

1. 创建一个C/C的空项目 2. 创建汇编源码文件, 就是C文件改后缀为asm 3. 在生成依赖项一栏中选择自定义 4. 选择masm 5. 在源文件上右击选择属性 6. 这么设置一下 7. 为了让代码看的更舒服一些, 添加一些高亮插件 8. 安装AsmHighligher和AsmDude插件(非必须), 其中前者主要是高…

signal(SIGPIPE, SIG_IGN)

linux查看signal常见信号。 [rootplatform:]# kill -l1) HUP2) INT3) QUIT4) ILL5) TRAP6) ABRT7) BUS8) FPE9) KILL 10) USR1 11) SEGV 12) USR2 13) PIPE 14) ALRM 15) TERM 16) STKFLT 17) CHLD 18) CONT 19) STOP 20) TSTP 21) TTIN 22) TTOU 23) URG 24) XCPU 25) XFSZ 2…

【动态规划刷题 16】最长等差数列 (有难度) 等差数列划分 II - 子序列

1027. 最长等差数列 https://leetcode.cn/problems/longest-arithmetic-subsequence/ 给你一个整数数组 nums&#xff0c;返回 nums 中最长等差子序列的长度。 回想一下&#xff0c;nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] &#xff0c;且 0 < i1 <…

学Python的漫画漫步进阶 -- 第十一步.常用的内置模块

学Python的漫画漫步进阶 -- 第十一步.常用的内置模块 十一、常用的内置模块11.1 数学计算模块——math11.2 日期时间模块——datetime11.2.1 datetime类11.2.2 date类11.2.3 time类11.2.4 计算时间跨度类——timedelta11.2.5 将日期时间与字符串相互转换 11.3 正则表达式模块—…

音乐随行,公网畅享,群辉Audiostation给你带来听歌新体验!

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…

代码随想录算法训练营第23期day2 | 977.有序数组的平方 、209.长度最小的子数组、59.螺旋矩阵II

目录 一、&#xff08;leetcode 977&#xff09;有序数组的平方 1.暴力解法 2.双指针法 二、&#xff08;leetcode 209&#xff09;长度最小的子数组 1.暴力解法 ​编辑2.滑动窗口 三、&#xff08;leetcode 59&#xff09;螺旋矩阵II 一、&#xff08;leetcode 977&…

ChatGLM 配置CUDA使用GPU本地训练

Cuda的下载及安装 cuda版本 由于显卡的不同,需要先查看我们显卡及驱动最高支持的cuda。 进入cmd输入nvidia -smi 版本支持向下兼容,为了保证能够和其他开发库版本兼容,这里使用的CUDN版本为11.6. cuda下载 CUDA Toolkit| NVIDIA Developer官网找到对应CUDA版本。(我这里…

基于Java的Base64编解码优化探讨

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

eclipse svn插件安装

1.进入eclipse的help->Eclipse Marketplace,如下图所示&#xff1a; 2.输入“svn”,再按回车&#xff0c;如下图&#xff1a; 3.这我选择的是 Subversive,点击后面的“install”按钮&#xff0c;如下图 Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive &…

java面向对象(八)

文章目录 一、abstract关键字的使用1.概念2. abstract修饰类:抽象类3.abstract修饰方法&#xff0c;抽象方法4.abstract使用上的注意点&#xff1a;5.抽象类的匿名子类 二、计算一段代码执行所花费的时间三、接口的使用1.接口的使用2.定义接口中的成员3.代码demo4.Java类可以实…

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

浙江大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许

代码随想录算法训练营第一天(C)| 704. 二分查找 27. 移除元素

文章目录 前言一、704. 二分查找二、27. 移除元素三、34. 在排序数组中查找元素的第一个和最后一个位置总结 前言 这次是C&#xff1b; 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_愚者__的博客-CSDN博客 &#xff08;java&#xff09; 一、704. 二分查找 的优…

【Java 基础篇】Java线程安全与并发问题详解

多线程编程在Java中是一个常见的需求&#xff0c;它可以提高程序的性能和响应能力。然而&#xff0c;多线程编程也带来了一系列的线程安全与并发问题。在本文中&#xff0c;我们将深入探讨这些问题&#xff0c;以及如何解决它们&#xff0c;适用于Java初学者和基础用户。 什么…

在visual studio里安装Python并创建python工程

在2009年&#xff0c;云计算开始发力&#xff0c;Python、R、Go这些天然处理批量计算的语言也迅猛发展。微软在2010年&#xff0c;把Python当成一个语言包插件&#xff0c;集成到了visual studio 2010里。在"云优先&#xff0c;移动优先"的战略下&#xff0c;于2015年…

如何在 Excel 中进行加,减,乘,除

在本教程中&#xff0c;我们将执行基本的算术运算&#xff0c;即加法&#xff0c;减法&#xff0c;除法和乘法。 下表显示了我们将使用的数据以及预期的结果。 | **S / N** | **算术运算符** | **第一个号码** | **第二个号码** | **结果** | | 1 | 加法&#xff08;&#xff…

【Redis】深入探索 Redis 的哨兵(Sentinel)机制原理,基于 Docker 模拟搭建 Redis 主从结构和哨兵分布式架构

文章目录 一、对 Redis Sentinel 的认识1.1 什么是 Redis Sentinel1.2 为什么要使用 Redis Sentinel1.2.1 主从复制问题1.2.2 人工恢复主节点故障 二、Redis Sentinel 原理剖析2.1 Redis Sentinel 架构2.2 Raft 算法和领袖节点2.3 哨兵节点2.4 故障检测2.5 故障切换2.6 监控和通…

MybatisMybatisPlus 操作 jsonb 格式数据

最近有用到postgresql&#xff0c;里面的一个特色数据类型便是jsonb&#xff0c;和json差不多&#xff0c;但是查询比较快&#xff0c;关于概念&#xff0c;这里就提一句&#xff0c;不赘述。 我们先来看下用mybatisplus&#xff0c;首先是查询数据。 依赖&#xff1a; <d…

【MySQL】 MySQL的增删改查(进阶)--壹

文章目录 &#x1f6eb;数据库约束&#x1f334;约束类型&#x1f38b;NOT NULL约束&#x1f38d;UNIQUE&#xff1a;唯一约束&#x1f333;DEFAULT&#xff1a;默认值约束&#x1f384;PRIMARY KEY&#xff1a;主键约束&#x1f340;FOREIGN KEY&#xff1a;外键约束&#x1f…

idea中提示:error has occurred, please check your installation and try again

目录 报错原因解决总结 报错 idea中提示&#xff1a;error has occurred, please check your installation and try again 原因 1.起初我是把一个运行正常的java程序&#xff0c;放到了src下&#xff0c;新建的一个包&#xff08;包名为java.first&#xff09;中&#xff0c…