一、概述
继上一篇文章之后 CPU和 Memory完成有关的任何缺失信息 PEView 使用该程序 PE 我们来看看结构。 Ollydbg 使用该程序可以检查和操作已编译进程的流程。
II. CPU和 MEMORY
CPU如需详细说明,请参阅之前的帖子。 CPU它可以分为双核、六核等,其中每个核都是一个独立的单元。 Register因为它具有现代 多任务处理 (Multitasking)Multi-Tasking)情况变得更加容易了。这里需要注意的是,在具有多个处理器和 CPU双核、六核等都是不同的概念。处理器 CPU 由于它指的是同一硬件设备,因此它是一个多处理器。 CPU有两个或更多个核心,并且这些核心是 CPU 的组成部分。 多处理器含 2 个或更多的拉面 CPU在每个 CPU它可以具有多个核,类似于六核。
让我们再次回顾一下内存结构。

它的工作原理是:内核向硬件发送和接收信号, 外壳 (Shell)当接收到用户的命令时,它负责操作相应的设备。因此,所有操作系统都通过 shell 向内核发送命令,然后内核操作计算机的扬声器、显示器和局域网卡等各种硬件组件。 Linux在
[SK Shillers SeSAC Sungdong 第 1 代] 虚拟机, Linux, ubuntu
我已经更详细地总结了内容,因此值得参考。出于安全和稳定的考虑,不允许直接访问硬件。这意味着对驱动程序的访问是通过内核进行的,而对内核的访问则需要使用一个 shell。shell起着一种包装器的作用,使像我们这样不了解机器代码的用户能够向内核和硬件发出命令。这个 shell就是 父母与子女的关系你可以使用继承,如果你做过任何 Web 开发,这很容易想到。有一个主 shell,这个 shell 创建了各种程序 shell,它们 主要流程 子进程它已被创建并运行。在 Windows 中,主要 shell 为 '
'explorer.exe'当我们打开浏览器或运行 Word、PowerPoint 等程序时,它们都会通过主进程壳进行运行。新创建的壳会成为子进程,在其中,主线程和子线程分别执行程序功能。 主线程它控制整个过程, 子线程其中每个都执行特定的功能。
※ 在创建 Windows 进程管理模块程序时,有许多有用的 Python 模块。在 Python 中尝试使用 wmi 模块也很有趣,因此我们建议您尝试一下。
这段话谈了很长时间关于内核的问题,但我们还是回到内存上来。Memory)它从底部开始 '堆栈 (Stack) 区域 - HIPHeap) 区域 - 数据Data) 区域 - 代码Code) 区域' 你可以把它想象成是有序的。实际上,数据和代码区域并不真正在乎顺序,因此在上图中它们被排列成这样,因为数据区域 全局变量、静态变量等都会被存储代码区域实际上是 与进程执行相关的代码被存储起来堆栈和堆区的顺序很重要。 内存地址在下面是高地址,在上面是低地址堆栈区位于堆区的下方。 从高地址保存到低地址相反,堆区域是 从低地址到高地址 保存堆栈区域是 局部变量或参数被存储在堆区可以随时引用 动态分配,是实例已被存储。
Ⅲ. PE(可移植可执行文件)
我在之前的文章中简要提到了这一点,但 Windows 的运行程序(进程) PE 它的结构是这样的。 结构很高兴知道结构是我们所了解的东西。 列表而不是使用 JSON,我将其分解为字节,并展示了过程中的代码、数据和其他元素。 Header这取决于它是 ZIP 文件还是 PE 文件。 MFT, VBR 等等,这些都各不相同,各具特色 Header 结构它有相似之处。 Header它被分为字节,并进行了详细的分类,包括哪些字节执行哪些功能或角色,以及实际数据是什么。

是一个已经简要介绍过的部分,但是通过使用显示 PE 结构的程序,我们可以检查 Header 的类型和分类,并了解实际地址值。Header 存在固定值,但也存在动态 Header 值,因此在分析时了解每个字节包含什么是很重要的。我想尝试一个简单的练习,来操纵进程的流程。
Zero Flag 操作
在本示例程序中,实际执行的主代码开始于地址 401000。 BreakPoint把它放在那里。 F9 快捷方式 (Break Point前往地址 401000 (最多执行一次)。 Zero Flag如果进行比较,如果它们相等则返回 1,如果不相等则返回 0。

如果你看看那红色的部分,就是汇编器。Assembly)的 CMP(比较命令)通过 JNZ(如果比较操作不产生相等的值,则跳过以下内容。) F7, F8 在使用快捷方式运行程序时

如果将其设置为 1,比较操作将会识别结果值相等,代码将继续执行而不会跳过。
JNZ 指令修改
那么,我们是否可以不改变 Zero 和 Flag,而是将 JNZ 指令改为 JE 和 JZ (如果比较操作结果相等,则跳过下一个执行代码)?当然可以。

这样,我们可以看到,流程流程没有跳过,并且顺利进行。可以通过两种方式更改命令,如图所示, JE 和 JZ 命令的十六进制值为 75。您可以将此值更改为 74,或者直接输入 JE 和 JZ 命令。
更改进程逻辑地址
如果仔细观察上述照片, Sample_0 您可以看到,00401079位于样本的后面。前面的样本是程序名称,后面的地址是代码地址。 JNZ 它指示当执行命令时执行哪个代码。如果我们将此代码地址更改为 401000,也就是最前面的一个,会发生什么情况呢?


如上图所示, 401000 到 401048 将无限重复。
* 这些地址,如 401000 和 401048,在技术上被称为 Offset(偏移量),它们表示相对于内存中特定地址的相对地址。由于我们将会经常使用这些 Offset ,因此了解它们很有帮助。
HxD通过比较操作数据变更
开发人员写入的比较操作的值实际上被 HxD通过. 改变。

红色部分是实际的比较值,而上面的 GetLocalTime 则是获取当前时间。在上面的 PE 结构中,我发现 Base Code 的起始地址为 1000。而在上面的图中,我看到带有命令的十六进制 7D5 位于地址 401040。前面的 400000 含括进程的内存起始地址,由于实际代码基于 Base Code 从 1000 起始,如果你到达地址 HxD通过 1040,你会发现 .

你可以看到这一点。现在,我们可以将此值更改为当前年份,然后找到剩余的 0 和 20,将其更改为当前月份和日期。

如果再次运行 OllyDbg,您会看到

如您所见,值已被更改,并且成功通过了 CMP 比较操作。

※ 该过程通过使用变量、函数或数据来操作,这些变量、函数或数据引用在内存中分配的地址值。堆栈区从高地址开始,向低地址方向逐步构建。 LIFO(Last in First out) 结构。因此,如果您查看代码的起始地址, SUB 使用命令 ESP我减去 114, ESP它从堆栈区的底部(最后一个地址,可能会令人困惑,但顶部就是底部)减去 114。 由于它从上到下进行,且从高地址到低地址进行,因此它减去了该函数运行所需的内存量(114)。
评论
理解和利用刚刚启动的应用程序比上周的复杂网络更加困难……🤑法医学和逆向分析感觉就像是我没有最低限度的经验就无法轻易接触的东西,作为一个非专业人士,这对学习来说是一个很大的障碍,但我认为我还是成功地度过了本周……🤣当然,如果你问我是否理解了,那又是另一回事😅,但我会尝试通过在未来发布更多文章来回顾和总结我所学到的内容。
登录