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

news2024/11/26 2:34:49

本文会在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.coloradmin.cn/o/1020237.html

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

相关文章

《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 《优化接口设计的思路》系列&#xff1a;第三篇—留下用户调用接口的痕迹 前言 大家好&#xff01;我是sum…

【TCP】延时应答 与 捎带应答

延时应答 与 捎带应答 一. 延迟应答&#xff08;效率机制&#xff09;二. 捎带应答&#xff08;效率机制&#xff09; 一. 延迟应答&#xff08;效率机制&#xff09; 延时应答&#xff1a;相当于 流量控制 的延伸。 流量控制是 踩下了刹车&#xff0c;是发送方发的不要太快&a…

墨天轮专访星环科技刘熙:“向量热”背后的冷思考,Hippo如何打造“先发”优势?

导读&#xff1a; 深耕技术研发数十载&#xff0c;坚持自主可控发展路。星环科技一路砥砺前行、坚持创新为先&#xff0c;建设了全面的产品矩阵&#xff0c;并于2022年作为首个独立基础软件产品公司成功上市。星环科技在今年的向星力•未来技术大会上发布了分布式向量数据库Tra…

ReactNative进阶(二十一)开源插件 react-native-device-info 获取设备信息

文章目录 一、前言二、Android 平台三、iOS 平台四、拓展阅读 一、前言 项目开发过程中&#xff0c;需要获取设备信息&#xff0c;例如获取设备名称。可通过使用开源的第三方组件react-native-device-info&#xff0c;该组件适用于iOS和Android双平台。 在ReactNative项目中可…

Comparator 接口使用方法,结合java8新特性及源码分析

目录 1 Comparator介绍1.1 函数式声明1.2 简单的小案例 2. Comparator中的方法2.1 compare 抽象方法例子 2.2 comparing方法源码参考解释详细解释 <? super T, ? extends U>讲解comparing代码样例例子comparing中的方法源码分析<T, U extends Comparable<? supe…

Python asynchat模块-异步套接字处理-服务器程序示例

介绍 此模块在asyncore架构上建立&#xff0c;简化了异步客户端和服务器&#xff0c;并且使得处理元素为任意字符串结束或者为变长度的协议更加容易。asynchat定义了一个可以由使用者来子类化的抽象类async_chat&#xff0c;提供了collect_incoming_data()和found_terminator(…

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

文章目录 单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数&#xff0c;设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数&…

科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?

科技云报道原创。 近年来&#xff0c;在云计算和网络安全产业的蓬勃发展下&#xff0c;我国云安全行业市场规模呈现高速增长态势&#xff0c;在网络安全市场总体规模中占比不断上升。 据统计&#xff0c;近5年我国云安全市场保持高速增长&#xff0c;2021年我国云安全市场规模…

VMware workstation 中centos7虚拟机在nat模式下怎么配置网卡,指定我想要的IP并且可以联网

1、首先打开我们的虚拟网络编辑器 2、查看我们的网关 3、查看IP池&#xff0c;根据需求自己设置 4、打开centos7虚拟机 编辑网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-ens160####我的网卡是ens160TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic …

全新交友平台,探索在线交流的乐趣!

大家好&#xff01;今天给大家介绍一款全新的交友平台&#xff0c;让您轻松享受在线交流的乐趣&#xff01;这个平台以其丰富多样的功能和互动体验而广受欢迎。无论您是想结识新朋友还是找到心仪的主播&#xff0c;这里都能满足您的需求。 首先&#xff0c;我们来看一下首页列表…

基于SpringBoot的超市管理系统

基于SpringBootVue的超市管理系统、超市进销存系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员…

三、C#—变量,表达式,运算符(1)

&#x1f33b;&#x1f33b; 目录 一、变量1.1 变量1.2 使用变量的步骤1.3 变量的声明1.4 变量的命名规则1.5 变量的初始化1.6 变量初始化的三种方法1.7 变量的作用域1.8 变量使用实例1.9 变量常见错误 二、C#数据类型2.1 数据类型2.2 值类型2.2.1 值类型直接存储值2.2.2 简单类…

Vivado初体验LED工程

文章目录 前言一、PL 和 PS二、LED 硬件介绍三、创建 Vivado 工程四、创建 Verilog HDL 文件五、添加管脚约束六、添加时序约束七、生成 BIT 文件八、仿真测试九、下载测试 前言 本节我们要做的是熟练使用 Vivado 创建工程并实现对 LED 灯控制&#xff0c;每秒钟控制开发板上的…

微信小程序手写时间间隔组件,可设置间隔时间一分钟,半小时,一小时的间隔

纯手写时间间隔组件 需求&#xff1a;小程序中可以根据时间段进行选择开始时间和结束时间&#xff0c;如&#xff1a;当前时间是09&#xff1a;00&#xff0c; 则我可以从9点开始选择时间&#xff0c;每半个小时为间隔&#xff0c;那么下一个时间就算9&#xff1a;30&#xff…

vue基础知识十三:Vue中的$nextTick有什么作用?

一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM 什么意思呢&#xff1f; 我们可以理解成&#xff0c;Vue 在更新 DOM 时是异步执行的。当数据发生变化&#xff0c;Vue将开启一个异…

阿里测试岗:惨不忍睹的三面,幸好做足了准备,月薪17k,已拿offer....

我今年25岁&#xff0c;专业是电子信息工程本科&#xff0c;19年年末的时候去面试&#xff0c;统一投了测试的岗位&#xff0c;软件硬件都有&#xff0c;那时候面试的两家公司都是做培训的&#xff0c;当初没啥钱&#xff0c;他们以面试为谎言再推荐去培训这点让我特别难受。 …

开启编程之门

自我介绍 目前已经大二了&#xff0c;计算机专业在读&#xff0c;是一个热爱编程&#xff0c;做事踏实专注的人。转眼间一年已经过去了&#xff0c;也接触编程一年了&#xff0c;但开始并没有对所学所想进行很好的总结和输出&#xff0c;这一年也有了新的很多感悟与心得&#x…

JVM——5.类文件结构

这篇文章我们来讲一下jvm的类文件结构 目录 1.引言 2.类文件结构概论 3.魔数与class文件的版本 4.常量池 5.访问标志 6.类索引、父类索引与接口索引集合 7.字段表集合 8.方法表集合 9.属性表集合 9.1code属性 9.2 Exception属性 10小结 1.引言 代码编译的结果从本…

vue学习-02vue入门之组件

删除Vue-cli预设 在用户根目录下(C:\Users\你的用户名)这个地址里有一个.vuerc 文件,修改或删除配置 组件 Props(组件之间的数据传递) Prop 的大小写 (camelCase vs kebab-case)不敏感Prop 类型: String Number Boolean Array Object Date Function Symbol传递静态或动态 Pr…

「聊设计模式」之抽象工厂模式(Abstract Factory)

&#x1f3c6;本文收录于《聊设计模式》专栏&#xff0c;专门攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎持续关注&&收藏&&订阅&#xff01; 前言 在软件开发中&#xff0c;设计模式是一种被广泛使用的经验…