一、概述
本文将继续补充之前文章中关于 CPU 和内存的部分,重点弥补了不足之处。我们将使用 PEView 软件来分析 PE 结构。此外,我们将使用 Ollydbg 软件来观察和操作编译后的程序的流程。
Ⅱ. CPU 和内存
中央处理器关于更详细的信息,请参考之前的帖子。CPU 可以分为双核、六核等,每个核心都拥有独立的寄存器,这与现代... 多任务处理工作变得更加容易。需要注意的是,多处理器和CPU的双核、六核等,是不同的概念。处理器指的是像CPU这样的硬件设备,因此,多处理器是指CPU数量超过一个。而“核心”指的是CPU内部的一部分。也就是说, 多处理器这套系统包含两个或多个CPU,每个CPU都可以拥有像十六核处理器一样的多个核心。
如果我们再回顾一下内存的结构:

在这种情况下,内核负责与硬件进行信号的交换。 壳它负责接收用户的指令,并将其传递给相应的设备,从而控制计算机的扬声器、显示器、网卡等各种硬件。 类似于在Linux系统中
[SK쉴더斯 SeSAC 东城分校] 虚拟机、Linux、Ubuntu
这是学习过的内容,但进行了更详细的整理,供您参考。出于安全和保密的原因,我们无法直接访问硬件。也就是说,我们需要通过内核驱动程序来访问内核,而要访问内核,则需要通过shell。Shell 就像一个外壳,它可以帮助我们这些不熟悉机器语言的用户,通过它来向内核和硬件发出指令。 父母与子女的关系它可以实现,如果您有网页开发经验,可能会联想到继承。它有一个主shell,这个shell可以创建各种子shell,这... 主流程啊 子进程它是由一个程序创建并运行的。在Windows系统中,主要的命令行界面是“
'explorer.exe'当我们打开浏览器、Word、PowerPoint等程序时,它们会通过主进程来运行。新创建的进程会成为子进程,其中包含主线程和子线程,分别负责执行程序的各项功能。 主线程负责整个流程的协调和管理。 子线程每个功能都有其特定的职责。
* 在创建 Windows 进程管理模块程序时,有一些有用的 Python 模块可以使用。 建议尝试使用 Python 模块中的 WMI 模块,这可能会很有趣。
关于内核的讨论比较冗长,但回到正题:内存(Memory)主要分为以下几类 “堆栈区 - 堆区 - 数据区 - 代码区” 可以理解为按照一定的顺序排列。实际上,数据区域和代码区域的顺序并不重要,因此,如图所示,它们是这样的结构。这是因为数据区域… 用于存储全局变量或静态变量并且代码区域就是按照字面意思。 包含与流程执行相关的代码它们各自有不同的作用和特点。然而,栈区和堆区的顺序很重要。 内存地址是从下往上的,而从上往下的。它位于堆区之下。 从高地址存储到低地址可以实现。相反,嘻哈文化领域是 从低地址到高地址进行存储将会实现。堆栈区域是 用于存储区域变量或参数并且,可以随时查阅相关的资料。 动态分配,并创建实例这些信息已保存在那里。
Ⅲ. 可移植可执行文件 (PE)
正如之前帖子中提到的,Windows 应用程序(进程)都采用 PE 结构。 结构了解这些信息有助于理解:结构体(structure)是一种替代传统列表或JSON格式的方法,它将程序代码、数据等信息以字节的形式组织起来。具体如何呈现这些结构,取决于每个Header的设计。无论是ZIP文件、PE文件,还是MFT、VBR等,它们都采用不同的呈现方式。 头部结构它包含着类似的结构。Header部分按照字节进行划分,详细列出了每个字节的功能、作用以及实际包含的数据。

虽然这些内容已经简单地介绍过,但通过使用显示PE结构的项目,我们可以了解Header的类型和分类,并了解实际的地址值。Header中既有固定值,也有动态值。在分析时,了解每个字节的具体含义非常重要。因此,我们将尝试通过简单的实践,来了解和操作程序的流程。
“零旗”操纵
在这个示例程序中,实际执行的代码从 401000 内存地址开始。因此,设置断点,然后使用 F9 快捷键(一次性执行到断点位置),跳转到 401000 内存地址。Zero Flag 在比较时,如果相等则返回 1,如果不相等则返回 0。

请看红色部分,这里使用了汇编语言中的“CMP”(比较指令),通过“JNZ”(如果比较结果不相等,则跳过后续指令)来实现跳转。因此,当我们使用 F7、F8 等快捷键来执行程序时,实际上就是通过这种方式实现的。

如果将它修改为 1,那么比较运算的结果会被认为是相等的,从而不会跳过,代码会继续执行。
修改 JNZ 指令
那么,是否可以将“Zero Flag”的指令改为“JNZ”,而不是直接更改为“JE”、“JZ”(如果比较结果相同,则跳过后续代码)?当然,这是可行的。

我们可以从流程图中看到,这些指令能够顺利地执行,而无需跳过任何步骤。 更改指令的方法有两种:一种是像图片中所示,将“JE”和“JZ”指令的十六进制值从“75”改为“74”;另一种方法是直接将指令改为“JE”和“JZ”。
流程逻辑地址修改
在这些照片中,您可以清楚地看到“Sample_0”后面跟着“00401079”。前面的“Sample_0”是程序名称,后面的“00401079”是代码地址,它指示在执行“JNZ”指令时,应该执行哪个代码。如果将这个代码地址更改为“401000”,会发生什么?


就像图片所示,数字将从 401000 开始,无限循环地重复到 401048。
※ 401000、401048 等这些地址,严格来说, 偏移据说,它能从内存中的特定地址获取相对地址。 掌握这个 Offset 非常重要,建议您了解它。
通过HxD,修改比较运算的数据
这指的是通过使用 HxD 软件,直接修改开发者编写的比较运算的结果。

红色部分是实际比较值,可以看到,这里使用了 `GetLocalTime` 函数来获取当前时间。 此外,在上面的 PE 结构中,Base Code 的起始地址是 1000。 并且,在图片中,可以看到 16 进制的 7D5 位于 401040 的地址。 前面的 400000 可能是指程序内存的起始地址,因为实际的代码基于 Base Code,从 1000 开始。 通过 HxD,可以找到 1040 这个地址。

我们可以看到这样的结果。现在,我们需要将这个值转换为当前年份,然后找到剩余的 0 和 20,并将其转换为当前月份和日期。

之后,再次运行 OllyDbg 并进行调试,

我们可以看到这些值发生了变化,并且成功通过了 CMP 比较运算。

※ 流程在内存中运行,通过引用地址值来使用变量、函数或数据。堆栈区域从较高的地址开始,并以后进先出的(LIFO)结构逐渐向下。因此,当我们查看代码的起始地址时, 字幕 通过指令 ESP我们正在从114处开始减,而ESP(环境指针)则从堆栈区的底部(也就是最末一个地址,虽然可能有些困惑,但从下往上来看,底部就是最末一个地址)开始减,以 확보空间。 这可能比较难以理解。 由于是从上到下进行,并且是从高地址到低地址的移动,因此函数需要减去执行所需的内存空间(114)。
评论
刚开始学习和使用这个应用程序,比上周遇到的网络问题更加困难…… 🤑 感觉我在这方面经验不足,很难快速上手,作为非专业人士,学习起来确实存在很大的挑战。但我还是努力完成了这个星期,希望以后能通过发布更多文章来复习和总结所学。
登录