《黑客免杀攻防》读书笔记-软件逆向工程(6) switch-case分支

1简单switch-case分支识别


sub eax,0

je


用eax-0代替cmp

当eax为0时,结果自然会使ZF置1。


A如果从1开始自增的case,用倒序减法跳转。

B如果从0开始自增的case,将不同case目标地址的值存储在相邻的数据段中,

用jmp  ds:[eax*4+0x??????]指令来跳转。

(这是数组寻址操作,即读取int型数组的操作)



2复杂一些的例子

A增强1.B中的例子:

从0开始的case,如果遇到列表中没有的case则该地址指向default。


3该分支结构与稀疏矩阵(间接表)

当“列表缺失”严重导致大量default时的一种解决方案。

(实际发现,编译器用if-else来识别这种情况汗)

本质是:用1字节来表示最小索引值与最大索引值之差不大于256的分支表。

movz  ecx,ds:byte_4010A8[eax]


4该分支结构与平衡二叉树

什么是AVL?虽然大体明白,但是不明白该算法。汗

平衡二叉树为:

(1)如果二叉树为空,返回真
(2)如果二叉树不为空,如果左子树和右子树都是AVL树并且左子树和右子树高度相差不大于1,返回真,其他返回假

继续晕

最小索引值与最大索引值之差大于256:

使用平衡二叉树表示。


理解switch-case语句的编译,主要是两种数据结构的应用。



版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(《黑客免杀攻防》读书笔记-软件逆向工程(6) switch-case分支)