x86 asm奇怪的循环数组

时间:2018-03-23 13:45:34

标签: assembly x86 reverse-engineering disassembly decompiling

我无法理解这段代码。它似乎是一个for循环迭代结构数组。但它一直在覆盖自己,因为指数没有跳得足够远。

                xor     edx, edx
                db      66h, 66h, 66h, 66h
                nop     word ptr cs:[eax+eax+00000000h]
loc_1808450:
                mov     esi, [eax+312]
                mov     esi, [esi+edx*4]
                mov     dword ptr [esi+12], 0
                movsd   xmm0, qword ptr ds:(loc_180815C - 180815Ch)[ecx]
                movsd   qword ptr [esi+4], xmm0
                mov     byte ptr [esi+64], 0
                mov     byte ptr [esi+82], 0
                mov     byte ptr [esi+65], 0
                mov     dword ptr [esi+40], 0
                mov     dword ptr [esi+44], 0
                mov     dword ptr [esi+48], 0
                mov     byte ptr [esi+66], 0FFh
                mov     dword ptr [esi+16], 0
                mov     dword ptr [esi+71], 0
                mov     dword ptr [esi+67], 0
                mov     byte ptr [esi+81], 0
                mov     word ptr [esi+79], 0
                mov     dword ptr [esi+75], 0
                mov     dword ptr [esi+87], 0
                mov     dword ptr [esi+83], 0
                mov     word ptr [esi+95], 0
                mov     dword ptr [esi+91], 0
                mov     byte ptr [esi+98], 100
                mov     byte ptr [esi+97], 100
                mov     byte ptr [esi+99], 0
                mov     byte ptr [esi+100], 0
                mov     byte ptr [esi+101], 0
                mov     dword ptr [esi+20], 0FFFFFFFFh
                mov     dword ptr [esi+24], 0FFFFFFFFh
                mov     dword ptr [esi+36], 0
                mov     dword ptr [esi+28], 0
                mov     dword ptr [esi+32], 0
                mov     dword ptr [esi+56], 0
                mov     dword ptr [esi+52], 0
                mov     dword ptr [esi+60], 0
                mov     dword ptr [esi+106], 0
                mov     dword ptr [esi+102], 0
                mov     dword ptr [esi+114], 0
                mov     dword ptr [esi+110], 0
                mov     byte ptr [esi+118], 0
                inc     edx
                cmp     edx, 23
                jnz     loc_1808450

这是我从代码中理解的:

mov esi,[esi + edx * 4] 似乎设置了数组和 inc edx 更新i ++

数组大小为119,i * 4永远不会有足够大的内存跳跃,所以它最终会覆盖   movsd xmm0,qword ptr ds:(loc_180815C - 180815Ch)[ecx]

1 个答案:

答案 0 :(得分:3)

此代码初始化一个包含23个项目指针的数组。

mov esi, [eax+312]

这里esi是一系列点的开头,在这里:

mov esi, [esi+edx*4]

esi是一个指针。您缺少[]运算符。 esi+edx*4显示指针的地址,该指针的值转到esiedx*4用于获取对象的下一个指针,而不是对象本身。现在这将被初始化。真正的代码应该是这样的(为了简单起见,我刚刚编写的程序集中没有调用):

struct _mystruct *arr[23];

void init_struct(struct _mystruct *item)
{
    ...
}

for (int i=0; i < 23; i++)
    init_struct(arr[i]));