文章目录

  • 正文

正文

有一个问题,比如在游戏里

这些东西放到数组里肯定是不行的,因为数组要求数据类型是一样的


但是结构体,想存多少存多少,想存多少字节存多少个

struct AA
{int 生命;int 魔法;int 技能;...int 移动速度;char name[0x20];//十个中文
}

int AA char double是等级的,int用在哪AA就可以在哪,AA只是我定义新的一个东西,上述的代码也是定义
基址:全局变量
偏移:血值的

AA y;y //所有的人物信息
+4//魔法,y最开始对应生命
+4//技能

AA与int平级,但是里面如果都是int的话,那我们AA里面可不可以在弄一个

struct Point
{float x;float y;float z;char name[0x20];//十个中文
}
struct AA
{int 生命;int 魔法;int 技能;Point 坐标;...int 移动速度;char name[0x20];//十个中文
}
比如我们得到一个地址AA gamer 【0x41234567】
生命  +4
魔法 +8
技能  +c
坐标 +10//+4 x//+8 y//+c z

上面的偏移,是一级偏移,注释掉的就是二级偏移
除了自己以外,可以用任何东西,就比如AA里面不能用AA,定义结构体struct不会分配内存空间的,什么时候分配内存空间:比如

这个时候,x就分配了4个字节,y不分配空间,在调用函数的时候才给y分配在ebp-4
给结构体分配空间比如:st x; 才会给分配空间

定义各种类型的结构体

给结构体赋值

给函数取出来,这里printf是变参函数,想写多少个都可以

打印结果:10 20 30 1 2 3 4
x.a = 10;处下断点
function反汇编:

我们看到,这里的地址都写死了,就直接给写出来了,全局变量一开始编译的时候都分好了,数组的反汇编就是等宽连续的,数组和结构体不同就是数组是等宽的,但如果结构体中都是等宽的,逆向可以成数组,只要明白其思想就行了
前面讲,返回值16位放ax,32位放eax,64位放eax+edx(win32),但这个结构体可以定义100字节,那这个怎么传?

反汇编:

这个时候,如果只看反汇编,不能看到它是不是结构体,只知道三个局部变量,但是如果不是同一个类型就可以看出来如果

反汇编

而下面这个是int类型的结构体,定义在局部变量

分的空间一样的,但是结构体此时和数组一样,都是从上往下分配的

如果是这样写的话,把结构体当作参数


这么一大堆怎么存进去?那就来分析,首先提升栈顶,ecx为6,就是执行某个指令6次,后面取ebp-18的地址,因为提升堆栈提升18,然后令edi为esp,读入6次到edi里面,这样就完成了传入参数的过程
把结构体当作返回值

这里注意到,平时我们用的时候,返回值存到eax里,堆栈里面就都变成垃圾了,所以不影响返回值传递,但是这里就有个矛盾,那么大一堆,不可能放到寄存器啊
复制到返回值
之前都是一大部分都放到一个地方,此处同理

如图,先将eax = ebp-30,然后再push eax,调用函数前编译器就考虑到这个是一大堆

看到有将eax = 0xcccccccc的,eax被覆盖,但是丢了不要紧,因为这里ebp+8就是eax那个值,因为之前push eax,后面就把ebp+8的值给了eax,ecx = ebp - 10然后ecx的值给到eax的地址,后面也是一样,分别到eax+4,eax+8.。。。里面了


【滴水逆向笔记】C语言结构体相关推荐

  1. linux中c语言结构体详解,Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  2. python展开 c函数中的宏预处理_Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  3. c语言2个字符串可以相互赋值吗,c语言结构体2之变量赋值于字符串

    #include #include struct dangdang { char email[]; char name[]; char addr[]; int num; int bugnum; cha ...

  4. C语言结构体和结构体指针的简单用法

    C语言结构体和结构体指针的简单用法 这里总结一下自己的学习笔记,关于C语言当中的结构体指针的用法,以及结构体简单使用. 简单介绍一下今天出场的嘉宾–>结构体和结构体指针 什么是结构体: 1,定义 ...

  5. golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)

    文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...

  6. c语言结构体教案,结构体——教学设计

    <结构体--教学设计>由会员分享,可在线阅读,更多相关<结构体--教学设计(7页珍藏版)>请在人人文库网上搜索. 1.课堂教学设计表章节名称结构体学科C语言程序设计授课班级大一 ...

  7. C语言——结构体struct与typedef的使用

    我们常常在某些C语言代码中看到有时候typedef关键字和struct一起连用定义结构体,有时候只用struct关键字直接定义结构体,在此记录两者的一些用法,给自己做一个笔记,希望对大家也有所帮助.如 ...

  8. c语言结构体和联合体,C语言结构体和联合体

    1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...

  9. ARM汇编语言实现peek()_ARM汇编之访问C语言结构体数据

    前言 本文的写作目的在于装逼,没有要产生实际价值的意思. 前几天在做编译器的项目,有一个项目团队成员一直在问我ARM汇编能不能读C语言的结构体.我心想,我这生成ARM汇编的代码是用C++写的呀,又不是 ...

  10. C语言结构体和结构体数组示例 - Win32窗口程序演示

    C语言结构体和结构体数组的使用: /* C结构体和结构体数组示例,by bobo */#include <windows.h>LRESULT CALLBACK WndProc (HWND, ...

最新文章

  1. 以下哪个不是python中的关键字-以下不是python中的关键字
  2. 《播客》项目总结——web标准页面设计方面
  3. Java黄金五年——1~5年一个Java程序员从入行到大牛的晋升之路
  4. vue项目中处理左侧导航栏问题的分享
  5. php网站通过什么联网,PHP通过Ajax调用连接百度效果实现检测网站是否联网的功能...
  6. pandas_profiling :教你一行代码生成数据分析报告
  7. java怎么缓存行填充_为什么java的Exchanger.Slot缓存行填充像这样?
  8. listview侧滑删除
  9. AndroidStudio_安卓原生开发_什么是AndroidStudio NDK ---Android原生开发工作笔记140
  10. 聚能聊每周精选 第十一期
  11. 454. 四数相加 ||
  12. JEECG(三) JEECG minidao如何封装自己的 多表联合查询 分页查询
  13. 驱动模块的安装与卸载指令
  14. 安装matpower
  15. 10部顶级数学纪录片
  16. gstreamer插件指南
  17. html图片自动适应屏幕代码,css让图片宽度自适应屏幕的例子
  18. http://blog.csdn.net/lnb333666/article/details/7772344
  19. OpenGL(十五)——Qt OpenGL三种不同的纹理滤波方式、光照、物体的移动
  20. 卡莱特led显示屏调试教程_如何使用卡莱特软件点亮LED电子显示屏

热门文章

  1. FLASK RESTFUL TOKEN用户验证笔记
  2. idea如何配置jdk环境_idea配置jdk环境变量
  3. 转发和重定向的区别以及适用范围
  4. matlab如何使用源代码,rosenbrock函数的matlab源程序代码是怎么样的?
  5. 静电容键盘和机械键盘声音对比
  6. Exchange 2010 Ps 之使用更新脱机地址簿系列命令get-offlineaddressbookUpdate-offlineaddressbook
  7. 互联网新机遇: 移动社交电商将成为下一个风口?
  8. 正能量:前思科中国区总裁林正刚先生以自己35年职业经历和心得
  9. 如何实现双因素认证?
  10. xadmin安装与使用