我正在阅读《实用恶意软件分析》一书,其中出现了以下示例代码:
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页。
从作者对代码的描述中可以清楚地看出,这些操作数在AT中
MOV src est(或)MOV est src?
我对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中返回的返回值只是这五个值之一:
返回的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