每天一个IDA小技巧(六)交叉引用

article/2025/10/28 15:16:49

在使用IDA进行逆向时,经常会碰到需要「定位某个变量被哪些函数访问」或者「某个函数是从什么地方被调用的」。这种跟踪变量或函数的功能在IDA中被称作交叉引用(XREF),同时IDA还提供了图形生成功能,以更直观的方式显示代码与数据之间的关系。

一. 交叉引用

先总结,IDA中有两类交叉引用:

  • 代码交叉引用 CODE XREF

    • 函数调用导致的交叉引用

    • 跳转交叉引用

  • 数据交叉引用 DATA XREF

    • 读取交叉引用

    • 写入交叉引用

    • 偏移量交叉引用

所有的交叉引用都是在一个地址引用另一个地址。这些地址可能是代码地址或数据地址。如果引入有向图论,那么就可以把每个地址看成是有向图中的节点,交叉引用看成为边,边的方向就代表着谁引用了谁。

1.1. 代码交叉引用

代码交叉引用是一个非常重要的概念,因为它可帮助IDA生成控制流图形和函数调用图形,这些图形最直观的用法就是可以帮助我们识别程序的流程,例如判断代码是否被OLLVM的控制流平坦化混淆过。

一个基本的代码交叉引用类似如下:

.text:00401000 sub_40100 proc near ; CODE XREF: main+2A ↓p

CODE XREF代表这是一个代码交叉引用,后面的地址(这里为_main+2A)是交叉引用的源头地址,即_main+2A处调用了该方法,交叉引用中使用的地址提供了额外的信息,指出交叉引用是在一个名为_main的函数中提出的,具体而言是_main函数中的第0x2A(42)字节。

地址后面总是有一个上行或下行箭头,表示引用位置的相对方向。需要向下滚动才能到达该地址。同样,上行箭头表示引用地址是一个较低的内存地址,需要向上滚动才能到达。

箭头后还包含了一个单字符后缀,代表交叉引用的类型,p代表这是一个调用类型,j则代表这是一个跳转类型的交叉引用。

可能很多人会好奇为什么将例如if else的代码改写成switch case的形式会被成为控制流平坦化,在IDA中,指令转交控制权的方式叫做流(flow)。IDA中有3种基本流:普通流、跳转流和调用流。

普通流(ordinary flow)是一种最简单的流,它表示由一条指令到另一条指令的顺序流。这是所有非分支指令(如ADD)的默认执行流。除了指令在反汇编代码清单中的显示顺序外,正常流没有其他特殊的显示标志。

每个无条件分支指令和条件分支指令将分配到一个跳转流(jump flow)。函数调用则被分配到一个调用流例如call指令。

通过交叉引用我们可以快速的追溯到每个跳转流和调用流的关系流程。

1.2. 数据交叉引用

数据交叉引用用于跟踪二进制文件访问数据的方式。IDA中最常用的3种数据交叉引用分别用于表示某个位置何时被读取、何时被写入以及何时被引用。下面这张图就展示了这三种数据交叉引用:

1.3. 读取交叉引用

读取交叉引用(read cross-reference)表示访问的是某个内存位置的内容,使用r作为单字符后缀,例如上面IDA反汇编中可以得知read_it被main+E处被读取。

同理write_it处的写入交叉引用表示修改write_it处的值,使用w作为单字符后缀,值得注意的是,write_it位置显示的交叉引用以省略号处结束,表明对write_it的交叉引用数量超出了当前的交叉引用显示限制。你可以通过Options▶General对话框中Cross-references选项卡中的Number of displayed xrefs(显示的交叉引用数量)设置修改这个限制。

第三类数据交叉引用为偏移量交叉引用(offset cross-reference),它表示引用的是某个位置的地址(而非内容),使用o作为后缀。通常,代码或数据中的指针操作会导致偏移量交叉引用。例如,数组访问操作一般通过在数组的起始地址上加上一个偏移量来实现。因此,许多全局数组的第一个地址通常可以由偏移量交叉引用来确定。为此,许多字符串数据(在C/C++中,字符串作为字符数组)成为偏移量交叉引用的目标。

一. 交叉引用列表窗口

如前所述,在某个位置显示的交叉引用注释的数量由一个配置控制,其默认设置为2。只要一个位置的交叉引用数量不超出这个限制,你就可以相当直接地访问这些交叉引用。

但如果想要查看某个位置的交叉引用完整列表,第一种方法是打开与某一特定位置有关的交叉引用子窗口。将光标放在一个或多个交叉引用的目标地址上,并选择View▶OpenSubviews▶Cross-References(查看▶打开子窗口▶交叉引用),即可打开指定位置的交叉引用完整列表。

第二种访问交叉引用列表的方法是选中一个你感兴趣的符号名称,在菜单中选择Jump▶Jump to xref(使用热键CTRL+X)打开一个对话框,其中列出了引用选中符号的每个位置。

交叉引用列表可用于迅速确定调用某个特殊函数的位置。例如如果想要确定程序中哪些地方调用了C标准库中的strcpy函数,可以用上述方法打开该函数的交叉引用列表窗口,甚至可以添加一段包含strcpy文本的注释,并使用该注释激活“交叉引用”对话框,因为IDA会讲注释中的符号名称也作为一个操作数处理,通过点击注释中的strcpy也能快速打开交叉引用列表。

最后,欢迎大家关注公众号「菜鸟学Python编程」,共同进步



http://chatgpt.dhexx.cn/article/EvF86ZNY.shtml

相关文章

word学习(一):交叉引用和题注学习

交叉引用和题注学习 参考文献交叉引用交叉引用的使用图片和表格的引用小结 参考文献 参考文献是指在学术研究过程中,对某一著作或论文的整体的参考或借鉴。征引过的文献在注释中已注明,不再出现于文后参考文献中。 交叉引用 交叉引用就是在文档的一个位…

参考文献使用交叉引用的注意事项(实用篇)

文章目录 一、使用交叉引用插入文献(插入一篇文献操作方法)二、使用交叉引用插入文献(连续插入两篇文献操作方法)三、使用交叉引用插入文献(连续插入三篇及以上的文献操作方法)四、将交叉引用的参考文献角标…

WordNet的使用

LawsonAbs的认知与思考,还请各位读者批判阅读。 0.总结 持续更新~ 1.说明 待更新~ 2.使用 2.1 同义词集合 from nltk.corpus import wordnet as wn print(wn.synsets(necktie)) # 打印necktie的多个词义 a wn.synset(necktie.n.01) # necktie的同义词集…

WordNet-Princeton 大学的心理学家,语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。

WordNet: Princeton 大学的心理学家,语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。它不是光把单词以字母顺序排列,而且按照单词的意义组成一个“单词的网络”。 比如,如果查一个单词: train. 我们马上可以得到它的6个名…

Python NLTK WordNet的在线与手动安装方法

nltk是自然语言处理中常用的包,在使用nltk进行处理的时候,会用到WordNet。 WordNet使用前一般需要先下载nltk的corpus import nltk nltk.download() 这样子会弹出如上窗口。,我这里是已经安装好的了,如果第一次运行则是点击左下…

Imagenet和wordnet的联系

Imagenet数据集 是由根据WordNet层次结构(目前只有名词)组织的图像数据库,其中层次结构的每个节点都有成百上千的图像。其总共有大约21K类,每一类节点对应一个wnid(WordNet ID of class),1500多万张图片,如…

【WordNet】词典——omw-1.4下载

from nltk.corpus import wordnet syns wordnet.synsets("bank") print(syns[0].name())运行这段代码时,编译器会提示找不到【omw-1.4】这个东西 官方地址 官方NLTK网址 但是要科学上网… 分享一个已经下载好的 链接:https://pan.baidu.c…

NLP——WordNet;Word Similarity; Word Sense Disambiguition

WordNet WordNet是一个广泛使用的英语词汇数据库和语义网络。它由普林斯顿大学认知科学实验室开发,旨在帮助人们理解单词之间的关系和意义。WordNet的主要目标是将英语词汇组织成一种层次结构,其中每个词都与其他相关词联系起来。WordNet中的单词按照它们…

nltk安装Wordnet出错[nltk_data] Error loading wordnet: <urlopen error [Errno 111]

LawsonAbs的认知与思考&#xff0c;还请各位读者批判阅读。 环境配置 ubuntu 18.04nltk 3.5在nltk中安装wordnet 出现问题[nltk_data] Error loading wordnet: <urlopen error [Errno 111]。解决方法适用于所有的nltk.download()报错 问题 在使用nltk中的语料库wordnet时…

WordNet介绍,一个开放知识图谱

1 WordNet简介 传统词典一般都是按字母顺序组织词条信息的&#xff0c;这样的词典在解决用词和选义问题上是有价值的。然而&#xff0c;它们有一个共同的缺陷&#xff0c;就是忽略了词典中同义信息的组织问题。20世纪以来&#xff0c;语言学家和心理学家们开始从一个崭新的角…

如何使用wordnet

介绍 WordNet是包含语义信息的英语词典。 wordnet根据单词的语义分组&#xff0c;相同语义的单词组合在一起称为synset&#xff08;同义词集&#xff09;&#xff0c;一个一词多义的单词将出现在它的每个语义对应的同义词集中wordnet为每一个synset提供了简短&#xff0c;概要…

中文WordNet的安装与使用

最近在中文语料上数据分析&#xff0c;想借用一些外部资源&#xff0c;就想到了WordNet&#xff0c;在这里记录一下&#xff0c;以备后用。 文章目录 &#xff08;一&#xff09;WordNet的介绍&#xff08;二&#xff09;WordNet的安装&#xff08;三&#xff09;中英文WordNet…

WordNet介绍

WordNet 1 WordNet简介 传统词典一般都是按字母顺序组织词条信息的&#xff0c;这样的词典在解决用词和选义问题上是有价值的。然而&#xff0c;它们有一个共同的缺陷&#xff0c;就是忽略了词典中同义信息的组织问题。20世纪以来&#xff0c;语言学家和心理学家们开始从一个崭…

nltk.download(‘wordnet‘)错误;Resource wordnet not found. Please use the NLTK Downloader to obtain th

问题 使用nltk.download(wordnet)下载不下来要用的包&#xff0c;导致代码加载资源错误 解决 离线下载NLTK Data github&#xff1a;nltk_data 将解压文件后得到的packages文件夹 目录下面的所有文件&#xff08;防止再少什么文件报错&#xff09; 按照下图报错中的目录&a…

WordNet简介

WordNet 1 WordNet简介 传统词典一般都是按字母顺序组织词条信息的&#xff0c;这样的词典在解决用词和选义问题上是有价值的。然而&#xff0c;它们有一个共同的缺陷&#xff0c;就是忽略了词典中同义信息的组织问题。20世纪以来&#xff0c;语言学家和心理学家们开始从一个崭…

快速了解WordNet

1、什么是WordNet WordNet是由Princeton 大学的心理学家&#xff0c;语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。它不是光把单词以字母顺序排列&#xff0c;而且按照单词的意义组成一个“单词的网络”。 WordNet是一个覆盖范围宽广的英语词汇语义网。名…

Android studio调用webview出现Webpage not available

题记 今天写一个Android程序时&#xff0c;出现了Webpage not available&#xff0c;如下所示&#xff0c;无法显示浏览器&#xff0c;捣鼓了半个早上。 解决办法&#xff1a; 查看AndroidMainifest.xml是否有开权限和信任未加密流量。 添加的位置如下所示&#xff1a; <u…

解决genymotion使用内置浏览器访问网页Webpage not available的问题

1. 学习到Android使用浏览器打开外部网页的时候出现了网页不能够被访问的情况 2. 下面是几种具体的解决方案&#xff1a; ① Virtual Box的设置 首先需要关闭正在运行的genymotion模拟器&#xff0c;打开Virtual Box&#xff0c;右键你需要的设置的模拟器&#xff0c;点击社渚…

使用WebView时错误:WebPage not available

在第一行代码书中仅仅提到在AndroidManifest中添加 <uses-permission android:name"android.permission.INTERNET" />但实际上是不够的&#xff0c;经过参考 https://blog.csdn.net/zgd826237710/article/details/95520785?depth_1-utm_sourcedistribute.pc…

MSQL Webpage

Mars Nov 19, 2014