数据逆向(二)——区分常量、变量、指针

汇编基本指令复习,以及逆向中如何跟esp ,ebp参数 mov eax , ebx   // eax = ebx lea eax , [ebx + 30] // eax = ebx + 30 push pop  //入栈,出栈 pushax popax //全部入栈,全部出栈 add eax,5 // eax += 5 sub eax, 5 //eax -= 6 inc eax  // eax += 1 mul  //乘法 div  / 阅读详情

做数据逆向分析最先应该区分数据是常量、变量,还是指针。可是作为二进制数据本身不会标记自己是什么,然而编译器将不同的的类别储存在不同的区域。

 

 

变量数据应分为这两类:

      1. 局部非静态变量:对于1KB以下的该种变量,一般都要放在栈区,那么它的寻址必然用到ebp寄存器来间接变址进行寻址。另外,有些编译器(比如gcc)出于优化考虑,也会用到esp寄存器。

举例:

void fun()
{
 int i=0;
 char a[5]="AAAA";
}

//vc2005Debug版反汇编

void fun()
{

-------------------------------------------------保护寄存器数据
00411390  push        ebp 
00411391  mov         ebp,esp
00411393  sub         esp,0E0h
00411399  push        ebx 
0041139A  push        esi 
0041139B  push        edi 

---------------------为局部变量在栈区预留内存,以及vc编译器的添加防溢出措施

0041139C  lea         edi,[ebp-0E0h]
004113A2  mov         ecx,38h
004113A7  mov         eax,0CCCCCCCCh
004113AC  rep stos    dword ptr es:[edi]
004113AE  mov  eax,dword ptr [___security_cookie (417000h)] //研究溢出漏洞
的人,

                                                                                       //可以看一下蓝色代码,

                                                                                       //通过在回调地址前,

                                                                                       //添加安全码

                                                                                       //使shellcode不可以覆盖

                                                                                       //这里,否则异常
004113B3  xor           eax,ebp
004113B5  mov         dword ptr [ebp-4],eax 

                                                                                        //这是vs2005的新特性,

                                                                                        //你想能出破解方案吗?

-------------------------------------------------

int i=0

004113B8  mov         dword ptr [ebp-0Ch],0
 char a[5]="AAAA";
004113BF  mov         eax,dword ptr [string "AAAA" (41563Ch)]
004113C4  mov         dword ptr [ebp-1Ch],eax

004113C7  mov         cl,byte ptr ds:[415640h]
004113CD  mov         byte ptr [ebp-18h],cl
}

004113D0 push edx
004113D1 mov ecx,ebp
004113D3 push eax
004113D4 lea edx,[ (4113F4h)]
004113DA call @ILT+140(@_RTC_CheckStackVars@8) (411091h)
004113DF pop eax
004113E0 pop edx
004113E1 pop edi
004113E2 pop esi
004113E3 pop ebx
004113E4 mov ecx,dword ptr [ebp-4]
004113E7 xor ecx,ebp
004113E9 call @ILT+25(@__security_check_cookie@4) (41101Eh)
004113EE mov esp,ebp
004113F0 pop ebp
004113F1 ret  

     2. 全局变量、局部静态变量:它们统一储存在数据节,因为它们的实现方式是一样的,都是直接寻址方式来寻址,只是全局变量,在所有区域均可访问,而局部静态变量只能在函数内部访问。

 

char a[5]="AAAA";
void fun()
{
 static int i;
 i=0;
 a[0]='b';
 
}

 

 

 void fun()
{
00411390  push        ebp 
00411391  mov         ebp,esp
00411393  sub         esp,0C0h
00411399  push        ebx 
0041139A  push        esi 
0041139B  push        edi 
0041139C  lea         edi,[ebp-0C0h]
004113A2  mov         ecx,30h
004113A7  mov         eax,0CCCCCCCCh
004113AC  rep stos    dword ptr es:[edi] //由于没有使用堆栈,编译器没有添加防溢出措施
 static int i;
 i=0;
004113AE  mov         dword ptr [41719Ch],0
 a[0]='b';
004113B8  mov         byte ptr [417034h],62h 
 }

004113BF pop edi
004113C0 pop esi
004113C1 pop ebx
004113C2 mov esp,ebp
004113C4 pop ebp
004113C5 ret

 

 

常量  

      常量和全局变量、静态变量实现方法使一样的,使用直接寻址,但区别是:只能读、不可写。

 

      比如:1. mov eax, [417034h]

              2. cmp eax, [417034h]

 

指针

       指针可以当做是存储地址的变量,它即可以是全局变量,也可以是局部非静态变量,但与普通变量的区别是:"初始化时使用offset或lea,使用指向内容时二次寻址"。

      举例:初始化:

              1.mov [417034h],offset “AAAA”//全局指针

              2.lea   eax,ARRAY

                 mov [esp-4ch],eax//局部指针

              使用:

              1.mov eax, [417034h]

                 mov edx, [eax]

              2.mov eax, [esp-4ch]

                 mov edx, [eax+i]//指针可能指向的是数组

//vc2005Debug版反汇编

逆向实战:易语言按钮事件特征码的精准捕获与干扰排除 本文深入探讨了逆向分析中易语言按钮事件特征码的精准捕获与干扰排除实战技巧。针对经典特征码FF 55 FC 5F 5E失效或存在干扰(如时钟事件)的常见问题,文章详细讲解了如何提取稳定特征码、使用OD条件断点进行精准过滤,以及通过调用堆栈分析进行事件溯源,旨在帮助逆向分析人员高效定位核心功能入口。 阅读详情

相关推荐

CheatEngine多级指针实战:手动追踪与指针扫描法对比(附详细步骤)

本文深入对比了CheatEngine中定位动态内存地址的两种核心方法:手动追踪法与指针扫描法。通过详细步骤解析,阐述了手动追踪如何通过分析汇编指令逆向推导稳定指针链,以及指针扫描如何通过暴力搜索与重启验证快速定位。文章旨在帮助中高级用户深入理解内存寻址原理,掌握稳定修改游戏数据的实用技能,并提供了方法选择建议与高级技巧。

weixin_29213655的博客 668

逆向工程入门学习(FreeBuf)

逆向工程 (一):汇编、逆向工程基础篇 VillanCh2015-11-24共883215人围观 ,发现 43 个不明物体周边系统安全 本文原创作者:VillanCh 本系列文章将讲解逆向工程的各种知识,难度由浅入深。  汇编是逆向工程的基础,这篇文章讲解并不深入但是覆盖了你刚开始学习汇编需要了解的所有基础知识!汇编语言是一切程序的起点和终点,毕竟所有的高

一个冠军黑猿的自觉 3万+

一次看透const

a、#defineb、const#define修饰的符号名称是一个真量数值,而const修饰的栈常量,是一个“假”常量。在实际中,使用const定义的栈变量,最终还是一个变量,只是在编译期间对语法进行了检查,发现代码有对const修饰的变量存在直接修改行为则报错。——《C++反汇编与逆向分析技术揭秘》const 修饰的变量,根据实测,要区分是局部变量还是全局变量。如下图所示全局变量g_val,虽然我们通过指针转换,绕过了编译器检查,但实际在写入操作时,引发异常。

Tadecanlan的博客 2053

逆向学习笔记之汇编04

ESP寻址 ESP--栈顶指针寄存器,存储了堆栈现在用到的地方 优点:调用方便 缺点:如果函数同时使用多个寄存器,则寄存器的值要保存入栈,此时ESP的值会发生改变 所以在读取堆栈中所需数据时,要灵活使用ESP+4,8,16等 最后注意堆栈平衡! EBP寻址 EBP--栈底指针寄存器 具体为在进入函数前让EBP的值等于ESP,这样后续存入的数据影响ESP的值 但是我们使用未受影响的EBP进行寻址,同时让ESP减去一个自然数,相当于开辟了一块空间专供此函数使用 PUSH EBP MOV EBP,ESP SUB

PlumpBoy的博客 217

AniME框架深度体验:用AI自动生成《修真小说》动画全流程记录

本文详细记录了使用开源多智能体框架AniME,结合其核心动画生成模型AniSora V3,将一段修真小说文本自动转化为风格统一动画视频的全流程实战。文章深入解析了从环境搭建、导演智能体任务分解,到多智能体协作生成分镜、角色、动画及最终合成的每一步操作与挑战,为AI驱动的长视频创作提供了宝贵的实践经验与流程优化思路。

ol789012345的博客 625

2023-07-04 Fast-Lio论文中公式(6)与BCH公式中近似雅可比公式的一致性推导

将(1)式代入(6)式,就有。

wmorries的博客 478

汇编基本语法

汇编部分 1、call 的本质相当于push+jmp,ret的本质相当于pop+jmp。 2、Windows中,不管哪种调用方式都是返回值放在eax中,然后返回。外部从eax中得到值。 3、Ebp总是被我们用来保存这个函数执行之前的esp的值。 4、把局部变量区域初始化成全0cccccccch,0cch实际是int 3 指令的机器码,这是一个断点中断指令。 5、任何一段中间不加任何跳转,

2426

私彩视频开奖动画直播源码内部核心技术解析及修改可增加后台操控-持续更新文章!

其实在此很感谢能做出H5开奖系统的码农们,而我本人也喜欢分解此类的东西。 因为特殊原因,该东西本人就不做图片展示,以防他人商业化。 借用开奖摇奖代码首先分解首页index文件。代码如下:(后面持续在原有的作品上添加后台操作) 代码里写的//.....是我的注明代码的所需。 ​ <!DOCTYPE html> <html> <head> <...

yugua3837的博客 5996

c语言使用指针完成逆序输出,逆序数 (C语言代码)指针法

解题思路:反正优质题解是没有什么卵希望的了。随意瞎掰吧!不会的可以留言!1)创建一个指针域2)给指针分配内存空间的大小3)输入数据并对数据的比较4)释放内存空间注意事项:这里用的是一维数组的方式。如果是多维数组则需要给指针创建多级指针,并利用循环给每一个指针级分配空间。参考代码:#include#include//malloc函数库intmain(){int*p;//...

weixin_42303616的博客 4775

pix4d安装步骤

pix4d三维模型软件的安装步骤

Little_Bee_27000的博客 1万+

华为嵌入式面试题及参考答案(持续更新)

异步是指在程序执行过程中,某些任务不需要等待立即完成就可以继续执行其他任务的过程。在计算机编程中,异步通常用于处理长时间运行的操作,如文件读写、网络通信等,以避免阻塞主线程。异步处理通常涉及到回调函数、事件循环、协程或未来的概念。使用宏定义来避免命名冲突。#else#endif堆和栈是计算机程序中用于存储数据的两种不同类型的内存区域。

大模型大数据攻城狮的专栏 2484

数据逆向分析(2)——区分变量,常量以及指针

做数据逆向分析最先应该区分数据是常量、变量,还是指针。可是作为二进制数据本身不会标记自己是什么,然而编译器将不同的的类别储存在不同的区域。     变量数据应分为这两类:       1. 局部非静态变量:对于1KB以下的该种变量,一般都要放在栈区,那么它的寻址必然用到ebp寄存器来间接变址进行寻址。另外,有些编译器(比如gcc)出于优化考虑,也会用到esp寄存器。 举例: void

bobopeng 852

【即插即用模块】Transformer篇 | CVPR 2025 | D2T:双域特征融合,完美适配缺陷检测/小目标检测和分割等频域细节敏感的任务!

本文提出了一种基于小波和原型增强的双域Transformer(WPFormer)用于像素级表面缺陷检测。该模型通过Dual-domain Transformer (D2T)模块融合频域和空间域特征:小波增强交叉注意力(WCA)分解高低频特征并加权平衡,增强缺陷细节捕捉;原型引导注意力(PCA)生成全局原型向量强化关键信息聚合。实验表明,该模块在缺陷检测任务中性能优于现有方法,通过频域细节增强和全局依赖建模有效提升了复杂场景下的检测效果。代码已开源,适用于对频域敏感的目标检测和分割任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1374

C/C++逆向:结构体逆向分析

在C/C++程序的逆向分析中,结构体的逆向分析是非常重要的。结构体是C/C++中管理和组织数据的一种主要方式。了解它们的布局可以帮助你理解程序是如何存储、处理和传递数据的,结构体常用于组织和管理复杂的数据,理解结构体有助于我们更好地还原程序的逻辑、推断数据布局,并解读与操作这些数据的函数。因此,识别并分析结构体可以帮助你更全面地理解程序的内存布局和数据流。接着我们可以来简单说一下如何识别结构体。

WolvenSec的博客 1847

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 632

[SV]SystemVerilog状态机实现案例

本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。

元直的博客 2021

逆向基础-全局和局部变量

定义位置:在函数外部声明的变量,或带static的静态变量。内存位置:放在程序的数据段(Data/BSS 段)中,地址在编译/链接后就确定(相对可预测,除非启用地址空间布局随机化 ASLR)。生命周期:程序一启动,该内存段就存在;变量在进程生命周期内一直存在,直到进程结束才释放。初始值如果编译时显式初始化(例如),则在加载时包含初始值。未显式初始化的全局变量在 BSS 段通常被初始化为 0(由运行时或 C 运行时库负责)。定义位置int x;在函数里)。内存位置:一般分配在栈(stack)上;

rasssel的博客 1717

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++逆向分析实战:从游戏内存结构理解数据布局与指针寻址

在软件开发和系统安全领域,理解程序在内存中的数据结构布局是核心基础。C++作为贴近硬件的编程语言,其类与对象在内存中的组织方式直接体现了计算机系统的数据存储与寻址原理。通过逆向分析技术,可以动态探查运行中程序的内存状态,从而理解复杂数据结构的实际排布、指针链的寻址逻辑以及虚函数表(vftable)的实现机制。这项技术对于软件调试、安全漏洞挖掘、性能优化以及理解大型软件架构具有重要价值。以游戏客户端为例,其角色属性、坐标等核心数据在内存中的存储方式,为学习C++内存模型提供了绝佳的实践场景。本文将以游戏《王权

weixin_30376083的博客 305

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C++逆向:数组逆向分析

数组在逆向工程中是一个重要的分析对象,数组是存储数据的重要数据结构,尤其在程序中用于存储一系列相同类型的元素。通过逆向分析数组,可以理解程序是如何处理和组织这些数据的,从而揭示程序的内部逻辑。在软件安全领域,逆向分析数组可以帮助安全研究人员发现程序中的潜在安全漏洞,例如缓冲区溢出、数组越界访问等。这些漏洞可能会被恶意利用,因此通过逆向分析可以增强软件的安全性。

WolvenSec的博客 1174

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Unity C# 爆破计划(二):变量与数据

文章目录二、变量与数据变量与常量类型策略简单类型整型浮点型布尔型可空类型引用类型对象类动态类字符串类类型转换强制类型转换ToType 方法Parse 方法自动类型推导运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符优先级 二、变量与数据 Covers:变量与常量、类型与运算符 变量与常量 懒得废话: C# 对声明和定义不作区分(在 C++ 中定义指发生了内存分配),声明时就发生了定义; 允许变量先定义后初始化,用 TYPE VARNAME; 定义变量 VARNAME 但不初始化; 等号

lfod1997的博客 500

滴水逆向三期-学习记录

记录在学习滴水逆向b站视频课的时候本人亲自踩过的坑。

2301_79091896的博客 1573

滴水逆向三期笔记和作业-c++总结1

this指针,继承 构造-析构函数,权限控制

weixin_44449397的博客 1930

c语言让指针指到特定位置,C语言指针蒙圈?我们逆向把它按在地上摩擦!

原标题:C语言指针蒙圈?我们逆向把它按在地上摩擦!不要陷在指针里面,最好的方法是跳出指针,我们从最终结果来思考问题。于是我的解题思路总是很偏,但是直指本质。我们写一段代码:编译,反编译,反编译这里我们用objdump -dhello >1.txt,如果你是用IDA,会发现出来的汇编不一样,因为各种格式的汇编,有不同的写法,这里主要就是Intel和AT&T,GNU遵循的是AT&...

weixin_42405980的博客 844

Windows逆向工程入门之段寄存器和指令指针寄存器

指令指针寄存器(Instruction Pointer Register)是CPU指令流控制的核心寄存器,负责指向下一条即将执行的机器指令地址。现代操作系统(如Windows)几乎都使用平坦内存模型(Flat Memory Model)来管理内存地址,段寄存器的作用大幅简化。段内存模型是8086以及后续处理器的地址管理模式,允许程序分为不同的逻辑段,比如代码段、数据段和堆栈段等。在x86架构中,段寄存器(Segment Registers)主要用于管理段内存模型。

0xCC说逆向 1747

C语言指针蒙圈?我们逆向把它按在地上摩擦!

C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!不要陷在指针里面,最好的方法是跳出指针,我们从最终结果来思考问题。于是我的解题思路总是很偏,但是直指本质。我们...

程序员入门进阶 2212

【逆向分析课程】复习下篇

逆向分析课程复习(华科网安)

kaarwen的博客 6391
上一篇: 数据逆向(一)——开篇
下一篇: 数据逆向(三)——识别字符串与数组
yangbostar
博客等级 码龄17年 205粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值