我使用IDA Pro分解了一些代码并获得了伪代码。它显示如下内容。

for ( i = 0; i < 6; ++i )
{
  v7 = (int)&val_253;                         
  for ( k = 1; k < key[i]; ++k )
    v7 = *(_DWORD *)(v7 + 8);
  v4[i] = v7;
}


我不明白v7 = *(_DWORD *)(v7 + 8);行中发生了什么。执行此行后,v7的值将从0xC更改。我不明白这是怎么发生的。我认为该值应从0x8更改。

,我认为*(_DWORD *)应该返回一个值。但是,它返回另一个指针。这是怎么发生的(与0xc远离的&val_253和与0x8远离的&val_253的两个值均为零)。

评论

嗨,不确定我是否完全理解您的问题。也许这将有助于stackoverflow.com/questions/2995251/…&msdn.microsoft.com/en-us/library/cc230318.aspx

如果有人可以告诉我v7 = *(_ DWORD *)(v7 + 8)中发生了什么;代码行,它可以解决我一半的问题。.

*(DWORD *)= DWORD [地址] = 0x13371337 *(字符*)=字节[地址] = 0x7b *(某些类型*)=某些类型[地址] = 0x1234567890123456badf00d

对于初学者来说,这是C伪代码-并非如标签所建议的那样反汇编-如果您使用IDA,则可能使用了Hex-Rays反编译器插件。因此,请仔细考虑一下:您花几千美元或几欧元买了一些您似乎不太了解的东西?如果您以低于100美元的价格购买一本C书并学习理解反编译器插件的目标语言,则可能会解决一半的问题。

我知道这是伪代码。此处没有称为伪代码的标签,因为声誉不高,所以我无法创建该标签。所以我标记了Disassembly,以便有人看到。在这里我犯了一个错误。距离&val_253的内存0x8的值不为零。它指向另一个内存位置,该内存位置与&val_253相距0xC。我以前没看过虽然我认为*(_ DWORD *)应该返回一个值,但它返回一个指针。这就是为什么执行v7的值从0xC更改后的原因

#1 楼

v7 = *(_DWORD *)(v7 + 8);


方法:

v7 = *(v7 + 8)


或在组装中

MOV v7, DWORD PTR [v7 + 0x8]


(此仅出于理解目的,可能不是真的像上面的示例一样。

v7被分配了位于地址v7+8*sizeof(DWORD)的值。例如,如果v7 = 0xabcd0123,则v7 + 8*sizeof(DWORD) = 0xabcd0143。位于0xabcd0143的任何内容都将分配给v7

评论


错误。 v7不会等于0xabcd012b,而是0xabcd0143(换句话说就是0xabcd0123 + sizeof(DWORD)* 8)。如果愿意,v7 = *(v7 + 8)<=> v7 = v7 [8]。

– Spl3en
15年7月31日在10:58



嗯...“用C代码表示”?一些如何暗示它还不是C ...它是...?!

– 0xC0000022L♦
15年8月1日,12:55

固定。愚蠢的错误:)

– Hackndo
15年8月4日在6:37

因此,总之,这意味着读取地址v7当前指向后的第8个DWORD的内容吗?它怎么知道要读取多少字节?在这种情况下是否读取单个DWORD?还是取决于v7声明的类型?

–罗伯托·安德拉德(Roberto Andrade)
2015年11月6日,12:11



不,这意味着“将位于v7 + 0x8的DWORD移动到v7中”

– Hackndo
2015年11月9日在9:22