写在前面

  此系列是本人一个字一个字码出来的,包括示例和实验截图。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

你如果是从中间插过来看的,请仔细阅读 跟羽夏学 Ghidra ——简述 ,方便学习本教程。请认准 博客园寂静的羽夏 ,目前仅在该平台发布。

前言

  虽然标题起的是“引用”,但不会仅仅讲这个。我们将会涉及函数、交叉引用相关的知识。话不多说,下面开始。

交叉引用

  先讲最简单的:交叉引用。我们经常在Ghidra看到有这样的注释:

                        ************************************************
* FUNCTION *
************************************************
undefined variable()
undefined AL:1 <RETURN>
tstruct Stack[-0x18]:16 lstruct XREF[1,3]:00401185(W),
00401189(W),
0040118f(W),
00401196(W)
variable XREF[4]: Entry Point(*),
main:0040137c(c),
00402238, 00402318(*)
00401162 55 PUSH RBP

  其中XREF就是所谓的交叉引用。如果你在某个函数中调用了其他函数,或者引用了其他数据,这都属于交叉引用的范围。好,寂静的羽夏讲完了这,下面轮到函数。

函数

  函数,是一个十分简单又十分复杂又十分重要的东西。从汇编层面,函数就是一个重复使用的一个汇编代码片段,可以传参,完成功能,也可以返回一个值作为结果。

  在逆向过程中,我们有时候遇到过这样的问题,比如一串代码被识别为数据(ShellCode 会经常遇到),我们转化为代码之后,我们还需要将其转为函数,方便分析:

  点击之后,我们就可以创建一个函数。

  在分析一个函数的功能之后,我们会习惯加个注释,以后的时候方便继续或者回顾,Ghidra有添加注释的功能,热键是;,一个英文状态的分号。注释有五种,下面介绍一下:

  • EOL Comments:这个也许是最常用的注释类型是行结束EOL注释,它位于列表窗口中现有行的末尾。若要添加注释,请使用分号唤出对话框,并选择EOL Comments选项卡。默认情况下,EOL注释显示为蓝色文本,如果在“注释”文本框中输入多行,则将跨越多行。每一行都将缩进,以便在反汇编的右侧对齐,现有内容将向下移动,以便为新注释留出空间。您可以通过重新打开对话框随时编辑注释。删除注释的最快方法是单击列表窗口中的注释,然后按Delete键。Ghidra本身在自动分析期间添加了许多EOL注释。只有在拥有与特定数据类型相关联的信息时才能这样做。这些信息通常包含在类型库中,这些类型库显示在数据类型管理器窗口中。

  • Pre/Post Comments:预注释Pre Comments和后注释Post Comments是在给定反汇编行之前或之后出现的完整行注释。将鼠标悬停在截断的注释上,将显示完整的注释。默认情况下,预注释显示为紫色,后注释显示为蓝色,以便轻松地将它们与列表中的正确地址关联。

  • Plate Comments:它允许您对注释进行分组,以便在列表窗口中的任何位置显示。该注释居中并放置在以星号为界的矩形内。我们检查过的许多清单都包括一个简单的板注释Plate Comments,在边界框中包含单词函数。当在所选函数中的第一个地址打开注释对话框时,你可以选择用您自己的、信息更丰富的注释替换此通用板注释。除了替换默认板注释之外,Ghidra还将注释添加为反编译器窗口顶部。如果创建Plate Comments时光标位于反编译器窗口的顶部,结果将是相同的。

  • Repeatable Comments:可重复注释输入一次,但在整个反汇编过程中可能会自动出现在许多位置。可重复注释的行为与交叉引用的概念有关。基本上,在交叉引用的目标输入的可重复评论在交叉引用源处得到回应。因此,单个可重复注释可能会在反汇编中的多个位置得到响应(因为交叉引用可以是多对一)。在反汇编列表中,可重复注释的默认颜色为橙色,回应注释为灰色,使其易于与其他类型的注释区分开来。

  当EOL注释和可重复注释在同一地址时,只有EOL注释在列表中可见。如果删除EOL注释,可重复注释将在列表中显示。

  其实,在Ghidra还有一种注释:附注Annotations。它可以在其设置注释对话框中通过指向程序、URL、地址和符号的链接注释做注释。符号名称更改时,注释中的符号信息将自动更新。当使用注释来启动指定的可执行文件时,你可以提供可选参数以获得更多控制。

  其实,本练习还有函数相关的,体现如何传递参数的,这就当课外练习了,这个不是我们本教程的重点,这个是前置知识。

实验

  有关本篇博文寂静的羽夏就介绍这些,下面开始动手,破解crakeMe,也就是第四个练习。这次先从源码的角度,来分析这个破解这个练习。下一篇博客园博文,我们将从逆向者的角度,来分析这个程序。

  通过比对源码,我们看到如下伪代码:

if (local_14 != 4) break;
iVar1 = crackMe();
if (iVar1 == 0) {
puts("抱歉,没成功哦,再试一次!");
}
else {
puts(">> 祝贺破解成功!");
}

  也就是说,第四个练习是调用crackMe,判断是否非零决定是否成功。我们跟进去:

bool crackMe(void)
{
int iVar1; iVar1 = getKey();
return iVar1 == 0x123456;
}

  这个函数很简单,调用getKey函数,看看是否返回值是0x123456,如果是返回真,反之为假,这个是判断是否破解成功的依据。接下来我们看看getKey干了啥:

int getKey(void)
{
int local_c; puts("请输入密钥:");
__isoc99_scanf("%d",&local_c);
return local_c;
}

  可以看到,该函数只是读取一下输入内容,作为整数返回到调用者。

  至此,简单的博文就到此结束。

下一篇

  跟羽夏学 Ghidra ——导航

跟羽夏学 Ghidra ——引用的更多相关文章

  1. 跟羽夏学 Ghidra ——数据

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  2. 跟羽夏学 Ghidra ——工具

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  3. 跟羽夏学 Ghidra ——窗口

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  4. 跟羽夏学 Ghidra ——导航

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  5. 跟羽夏学 Ghidra ——初识

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  6. 跟羽夏学 Ghidra ——调试

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  7. 羽夏 Bash 简明教程(上)

    写在前面   该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容 ...

  8. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  9. (九)羽夏看C语言——C++番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

随机推荐

  1. 简单性能测试:springboot-2.x vs actix-web-4.x benchmark

    性能测试:springboot-2.x vs actix-web-4.x benchmark 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/15956465.h ...

  2. (零)机器学习入门与经典算法之numpy的基本操作

    1.根据索引来获取元素* 创建一个索引列表ind,用来装载索引,当numpy数据是一维数据时:一个索引对应的是一个元素具体的例子如下: import numpy as np # 数据是一维数据时:索引 ...

  3. 阿里云有奖体验:如何通过ECS挂载NAS文件系统

    实验简介 本实验提供CentOS系统ECS一台和NAS文件服务. NAS基于POSIX文件接口,天然适配原生操作系统,提供共享访问,同时保证数据一致性和锁互斥.它提供了简单的可扩展文件存储以供与ECS ...

  4. PTA(BasicLevel)-1094 谷歌的招聘

    一.问题定义 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址, 而前面的网址是一个 10 位素数,这个素数 ...

  5. RS485通信电路

    RS485由RS232和RS422发展而来,弥补了抗干扰能力差.通信距离短.速率低的缺点,增加了多点.双向通信能力,即允许多个发送器连接在同一条主线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了 ...

  6. HelloWord程序代码的编写和HelloWord程序的编译运行

    1.新建文件夹,存放代码 2.新建一个Java文件 文件后缀名.java(Hello.java) 3.编写代码public class Hello{public static void main(St ...

  7. Tomcat深入浅出——最终章(六)

    前言 利用了六天的时间,对Tomcat的内容进行了整理. 学习不易.整理也不易,自己坚持的更了下来,很不错. 希望每一位在努力前行的小伙伴,都要相信坚持就会有收获. 本次Tomcat就探寻到这里,明年 ...

  8. SpringMVC pom

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  9. 微信安装包从0.5M暴涨到260M,为什么我们的程序越来越大?

    最近,微信安装包从v1.0的0.5M暴涨到V8.0的 260M引起大家热议,为什么我们开发的程序越来越大?本文做一个简单的讨论.(本文主要根据B站科技老男孩<逆向工程微信安装包,11年膨胀575 ...

  10. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...