博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《黑客免杀攻防》读书笔记-软件逆向工程(6) switch-case分支
阅读量:6624 次
发布时间:2019-06-25

本文共 635 字,大约阅读时间需要 2 分钟。

hot3.png

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语句的编译,主要是两种数据结构的应用。

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

转载于:https://my.oschina.net/rkd/blog/479105

你可能感兴趣的文章
品牌的网闸介绍
查看>>
手势滑动源码(适合新手)
查看>>
我的友情链接
查看>>
快速熟悉开源项目
查看>>
Linux Centos 6.2 装好PHP启动Apache错误libmysqlclient.so.18:
查看>>
我的开发工具包
查看>>
运维角度浅谈MySQL数据库优化
查看>>
多版本python下,安装pip
查看>>
AndroidManifest.xml文件解析
查看>>
互联网 免费的WebService接口
查看>>
【我的V日志】2010年1月29日星期五
查看>>
我的友情链接
查看>>
六种微服务架构的设计模式
查看>>
路由器配置大全
查看>>
JACK——AgentManual3 Agents
查看>>
[转载] 的士速递4
查看>>
基于QT平台的手持媒体播放器项目实战视频教程下载
查看>>
一名奔三的程序猿的困惑
查看>>
嵌入式Linux裸机开发(一)——点亮Led
查看>>
搭建Websocket简易聊天室
查看>>