首页 > 其他分享 >加密与解密x64逆向——变量、if和switch、循环语句

加密与解密x64逆向——变量、if和switch、循环语句

时间:2023-04-21 23:22:20浏览次数:48  
标签:语句 识别 jmp x64 解密 switch 数组 跳转 else

数据结构

主要是对局部变量,全局变量,数组等的识别。

1.局部变量

局部变量是函数内定义的变量,存放的内存区域称之为栈区。生命周期就是从函数进入到返回释放。


函数在入口处申请了预留栈空间和局部变量空间,也就是sub rsp,30h。局部变量空间在高地址。在应用程序被编译成release版本的时候,需要有更高的性能,所以在取局部变量的时候选用寄存器,当不够的时候再采用栈空间。

2.全局变量

全局变量一般会用固定的地址去访问全局变量。

3.数组

数组是相同数据类型的组合,以线性方式连续存储在内存中。数据是从低地址到高地址顺序排列的。
数组中有4个类型为int的集合。内存大小就是

比如下面这个例子可以见得一个字符4个字节,就可以推算出来数组中的位置

①数组寻址公式

编译器采用数组寻址公式来定位一个数组元素的地址。因此,掌握数组寻址公式,进行逆向分析的时候可以快速识别编译器访问的是哪个元素。一维数组寻址公式如下。

多维数组也适用。

可以这么理解第一个int【3】是指三个为一组的一维数组要排到第二个,再从第二排第一个开始定位。

②一维数组



可以看出,编译器访问数组的代码是利用数组寻址公式去访问的。当数组下标为常量的时候,公式可以直接计算出数组相对于数组首地址的偏移。

逆向的时候如果由以上特征,就怀疑是一个数组访问。

控制语句

主要介绍的是两种识别控制语句的方法,特征识别法和图形识别法。

1.if语句

真为非0,假为0.

特征识别:有一个jxx用于向下跳转,且跳转的目的if_end中没有jmp指令。
图形识别:虚线箭头表示条件跳转jxx,实线就是无条件跳转jmp。

2.if...else

比if语句多出一个else。当if表达式为真的时候就跳过else。


如果if成立就不jnz,接着运行,不成立就jnz,再跳出。
特征识别:有一个jxx用于向下跳转,且跳转的目的else中有jmp。else代码尾部没有jmp,else的代码会执行if_else_end代码。
图形识别:会有一个向下的虚线箭头,所以虚线箭头中会有一个向下的实线箭头。

3.if...else if...else语句

其实就是if...else多嵌套一层。

特征识别:多几个if中嵌套。
图形识别:如上。

4.switch...case语句

是比较常用的多分支结构。switch语句通常比if语句有更高的效率。编译器也有多种优化方案,比如switch分支小于6的时候直接用if...else语句实现,大于等于6的时候就会进行优化。


case表如下。

当大于等于6的时候,编译器会采用case表的方式实现switch语句。这样就可以避免使用if语句来提高性能。

这里有一个值的留意的地方,为什么要把argc减去1。答案就是argc减n为了switch表空闲空间减少,如下有个例子。

当case项较多的时候,编译器直接用if语句来实现switch语句。就有另外一个优化方案-判定树。将每一个case值作为一个节点,然后再节点中找到一个值,成立一个二叉平衡树。




这里已经将整个判断过程一分为二.

5.转移指令机器码的计算.

①call/jmp direct

例子如下

也就是在跳转的时候会先进行转移量的计算.

②call/jmp memory direct


在32位系统当中这里是绝对地址。然而在x64系统当中就是相对地址。

循环语句

1.do循环

先执行语句块,再执行表达式判断。

特征识别:有一个jxx指令用于向上跳转,且跳转的目的语句当中没有jxx指令。
图形识别:有一个向上的虚线箭头。

2.while循环

先进行表达式判断,再执行语句块

循环的特点是向低地址跳转。需要注意的是while比do多一次if判断
,循环上效率不如do。
特征识别:会先有一个jmp向上跳转的指令,然后下面有一个jxx跳转指令。
图形识别:因为有jmp向上跳转,实现箭头。还有一个向下的虚线箭头。

3.for循环

是由赋初值,循环条件,循环步长。

自增就是圈中的地方。
特征识别:多了一个jmp跳转用于自增。
图形识别:因为多了一个跳转,所以会比while循环多一个向下的箭头。

数学运算符

本节讲的是release版本中编译器优化过的四则运算。

1.整数加法和减法

①加法和减法

加法是add,减法是sub,但很多时候用lea来简化

②常量折叠

当出现两个以上常量运算的时候,编译器可以在编译期间计算出结果。这样在程序允许中就可以不用计算。

2.整数的乘法

有有符号(imul)无符号(mul)两种。周期较长,所以经常用lea比例因子寻址优化乘法指令。

3.整数的除法

除法指令周期较长所以一般用其他指令来代替除法指令。目前本人境界实在看不懂,待我重新看看书。

标签:语句,识别,jmp,x64,解密,switch,数组,跳转,else
From: https://www.cnblogs.com/bonelee/p/17342184.html

相关文章

  • 加密与解密x64逆向——虚函数
    4.整数的取模取模运算可以通过除法指令实现。一般的优化做法是将其转换成等价的位运算或者除法运算,再由除法运算进行优化。虚函数C++的三大核心机制是封装,继承,多态,而虚函数就是多态的一种体现。软件逆向中,难免遇到使用面向对象思想设计的软件,而虚函数就是在实际软件逆向过程中......
  • 【逆向】x64程序逆向基础——调用约定和栈使用
    【逆向】x64程序逆向基础 主要区别1.所有地址指针都是64位。2.增加和扩展新的寄存器,并兼容原32位版本的通用寄存器。3.原指令指针寄存器EIP扩展为RIP。寄存器1.64位寄存器兼容原32位寄存器。2.新增加8个XMM寄存器(XMM8-XMM15)。3.扩展原32位寄存器的64位版本,并......
  • AES加解密
    AES加解密 https://www.cnblogs.com/SjhCode/p/AES.htmlAES加解密工具类  importjavax.crypto.Cipher;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjava.util.Objects;/***@author*@date2022/8/3115:......
  • 用C#写一个上传下载文件至OSS后返回文件路径用DES加密解密
    废话不多说,直接上代码:usingAliyun.OSS;//引入阿里云OSSSDKusingSystem;usingSystem.IO;usingSystem.Security.Cryptography;//引入.NETFramework中的加密库usingSystem.Text;publicclassOSSHelper{///<summary>///将文件上传至OSS,并使用D......
  • AES算法 前端JavaScript加密 后端Java解密
    CryptoJShttps://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js中文文档https://cryptojs.gitbook.io/docs/varAES=function(){ constuuid32="00010203-04050607-08090A0B-0C0D0E0F".toString();constparam=Array.from(uuid32......
  • 升级Java17后Maven中使用bouncycastle加解密遇到JCE cannot authenticate the provide
    网上找了很多办法,逐一试过之后,发现有效的方式为修改打包方式:<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version&......
  • [Java并发包学习七]解密ThreadLocal
    相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!看看JDK中的源码是怎么......
  • Android中架构X64与X32的不同
    1.Android中架构X64与X32的不同。众所周知,安卓支持3类处理器(CPU):ARM,Intel和MIPS。其中ARM无疑被使用得最为广泛。Intel因为普及于台式机和服务器而被人们所熟知,然而对移动行业影响力相对较小。MIPS在32位和64位嵌入式领域中历史悠久,获得了不少的成功,可目前Android的采用率在三者......
  • Linux系统bootx64是怎么引导grub的
    在Linux系统中,bootx64.efi是一个启动加载程序,用于引导GRUB。GRUB(GrandUnifiedBootloader)是一个开源的多操作系统引导加载程序,用于加载和启动Linux、Windows和其他操作系统。当计算机启动时,UEFI固件会读取硬件设备、分区和文件系统来找到可引导的EFI程序。如果GRUB已经安装在硬......
  • 支持win8 x32和x64的抓包软件Microsoft Network Monitor
    win8系统中N多常用软件水土不服,其中包括工作中常用的抓包神器wireshark,wireshark在win8系统驱动加载失败不能获取网卡不能抓包。搜索资料库MicrosoftNetworkMonitor脱颖而出,MicrosoftNetworkMonitor支持TCP/Ip、UDP等底层协议的捕获抓包,并且有包过滤功能方便分析。Micros......