【问题标题】:Reverse Engineering, Left Bit shift by seven逆向工程,左位移七
【发布时间】:2011-04-19 22:40:12
【问题描述】:

我一直在尝试对游戏的功能进行逆向工程,但我有点困惑。我对逆向工程很陌生(我正在使用 ollydbg btw),所以我还不太了解所有技巧和细节。

无论如何,这是我的问题。当您在游戏中拾取任何物品时会调用此函数。然后它会计算项目的价值并将该价值添加到您的分数中。在调用该函数之前,会推送一个值,我非常确信它是项目的 ID。 这是让我困惑的代码:

SHL ESI,7
MOV CX,WORD PTR DS:[EDX+ESI+42]

ESI = 项目的 ID EDX = 恒定值 FE56A0

我猜测 EDX (FE56A0) 是项目数组的开始,ESI 是项目的索引,而 42 将是项目持有的值的索引。这有点奇怪,因为您将 ESI 向左位移 7。随着 ESI 的增加,位移值不会线性增长。

因此,如果 EDX 表示数组的开头并且 ESI 将是索引,则数组中的项目将不具有相同的大小。 这段代码的含义让我感到困惑。

有人知道这段代码可以代表什么吗?

【问题讨论】:

    标签: bit shift ollydbg


    【解决方案1】:

    该数组可能包含 128 字节长的结构。移位 7 将 ID 乘以 128,给出访问该 ID 的结构所需的偏移量。 42 将是结构的偏移量。

    这是有效的,因为乘法实际上线性增加了乘法索引:

    0 << 7 == 0
    1 << 7 == 128
    2 << 7 == 256
    3 << 7 == 384
    

    等等

    这段代码 sn-p 只是访问存储在数组中的结构的成员。

    【讨论】:

    • 非常感谢你们!两者都非常有帮助!你似乎是对的。我试图在使用您的信息调用函数之前预测结果,并且预测是正确的! EDX 指向数组的基数,条目长 128 字节,项的值位于偏移量 0x42。我一直在混淆十六进制和十进制数字,这让我很困惑。现在我要试着弄清楚这些条目还有什么^^谢谢!
    【解决方案2】:

    EDX 可能指向数组所属的某个结构的开头。数组前面的数据需要 42 个字节,数组中的每个元素需要 128 个字节。 (1

    // EDX points here
    struct GameItems
    {
       int numItems;
       int stuff;
       int moreStuff;
       char[30] data;
       GameItem[MAX_ITEMS] items;  // offset 42 bytes from start
    };
    
    struct GameItem
    {
       // 128-bit structure
    }
    

    【讨论】:

    • 谢谢!非常清楚的例子,你是对的,正如我对其他回应的评论,我可以继续扭转这个游戏!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多