当前位置: 首页 > 知识库问答 >
问题:

这个x86 mov是如何反向工作的?

袁炳
2023-03-14

我正在阅读《实用恶意软件分析》一书,其中出现了以下示例代码:

00401022 call ds:CoCreateInstance
00401028 mov eax, [esp+24h+ppv]

作者接着说:

返回的COM对象将存储在堆栈中IDA Pro标记为ppv的变量中,如图所示。

我的问题是,这是为什么?既然我们做了一个mov eax,[esp 24h ppv],这难道不是将[esp 24h ppv]内部的数据移动到eax并覆盖返回值,而不是将返回值存储在变量中吗?我认为在Intel格式中,mov操作数1、操作数2总是将第二个操作数放在第一个操作数中。

注意:顺便说一句,如果有人碰巧有这本书,那就是558页。

共有2个答案

万俟嘉珍
2023-03-14

从作者对代码的描述中可以清楚地看出,这些操作数在AT中

MOV src est(或)MOV est src?

鱼恩
2023-03-14

我对COM的经验很少,但是快速浏览一下MSDN的CoCreateInstance函数就会发现这个签名

HRESULT CoCreateInstance(
  _In_  REFCLSID  rclsid,
  _In_  LPUNKNOWN pUnkOuter,
  _In_  DWORD     dwClsContext,
  _In_  REFIID    riid,
  _Out_ LPVOID    *ppv
);

因此,CoCreateInstance确实返回了一个名为ppv的输出参数,该参数似乎也可以方便地由IDA Pro提取。

ppv输出值定义为

接收riid中请求的接口指针的指针变量的地址。成功返回时,*ppv包含请求的接口指针。失败时,*ppv包含NULL。

假设在EAX中返回的返回值只是这五个值之一:

  • S\u OK:已成功创建指定对象类的实例

返回的ppv值是指向COM对象的实际指针,然后使用

mov eax, [esp+24h+ppv]

指示因此,包含可能错误代码的返回值(S_OK以外的任何代码)立即被覆盖(因此假设COM调用成功)。

DWORD PTR[esp 24h ppv](不知何故)指向COM对象的基地址,将其加载到EAX中。

但我无法表示寻址模式。也许这是IDA Pro的一种特殊语法显示。

从这里开始,EAX中的这个指针用于访问COM对象,并且进一步访问其方法,如注释中所述。

这篇CodeProject文章可能会让您进一步了解。

 类似资料:
  • 我找到了下面的函数,它递归地反转链表: 我理解了涵盖基本情况的语句。 递归是如何反转列表的?有没有更简单的递归版本可以反向链表?作为参考,我正在解决LeetCode问题206。反向链表: 给定单链表的,反向该列表,并返回反向列表。

  • 这是来自SQLZOO.NET的问题

  • 我试图了解mysql查询在GROUP BY和不使用GROUP BY的情况下是如何工作的。 假设我有一个FILM_ACTORS表,其中每个ACTOR_ID都有一个相应的film_id。于是同一个演员参演了N部不同的电影。 我想选出参与20部电影的演员: 这个查询起作用,并返回参与20部电影的actor_id。但如果我只是: 为什么该查询仅在我将其等于film_actor表(5463)的大小时才返回值

  • Kotlin定义了自己的类: 该类的实例是通过中定义的内联函数构造的: null 我认为在编译之前必须进行某种代码预处理。 请随意用一个更贴切的标题编辑这个问题。

  • 我在一本书《做二进制搜索》中看到了这个方法,但无论我怎么尝试,我都无法理解它是如何工作的。有人能确切地向我解释一下它是如何工作的吗? 这本书的解释无助于: 这个想法是在我们靠近目标元素时跳跃并减慢速度。变量k和b包含数组中的位置和跳跃长度。如果数组包含元素x,搜索后x的位置将在变量k中。该算法的时间复杂度为O(log n),这是因为对每个跳转长度而言,同时循环中的代码最多执行两次。 我不明白的是k