首页 文章

汇编内存数学和循环

提问于
浏览
0

我正在努力弄清楚某个块如何运作 . 在堆上使用以下地址

004B0000 73 6D 67 66 74 smgft

和以下程序集:

77A701B8 xor eax, eax
77A701BA mov ecx, 4
77A701BF lea edi, DWORD PTR DS:[ecx+4B0000]
77A701C5 xor DWORD PTR DS:[edi], ecx
77A701C5 loopd short ntdll.77A701BF

问题是在执行指令后以ASCII格式提供堆上五个字节的值 . 我可以从中理解如下

xor eax,eax; e out 0

mov ecx,4;设置ecx 4

lea edi,dword ptr ds:[ecx 4b0000];这加载到EDI中,无论存储在ecx 4b0000中,所以4b0004 . 我不确定这会抓到什么 . 我甚至不确定4b0000会得到什么,因为它是5个字节 . mgft,还是smgf?我觉得smgf? 4h如何影响这个?使它成为736D676678?

xor dword ptr ds:[edi],ecx;所以这将与edi中新加载的dword一起使用xh 4h,但它在循环中用它做什么呢?

loopd short ntdll.77A701BF;所以这是一个“循环而平等”,但我不确定在它之上用xor转换为什么 . 它会减少ecx吗?但随后又跳回了lea线 .

1 回答

  • 4

    lea edi, dword ptr ds:[ecx+4b0000] 将值 ecx+0x004b0000 加载到EDI中,根本不访问内存 . loop 指令类似于“ ecx = ecx - 1; if(ecx != 0) goto ntdll.77A701BF ” .

    并不是说这个代码可以展开,所以它变成:

    xor eax, eax
    
        lea edi, DWORD PTR DS:[4+0x004B0000]
        xor DWORD PTR DS:[edi], 0x00000004
    
        lea edi, DWORD PTR DS:[3+0x004B0000]
        xor DWORD PTR DS:[edi], 0x00000003
    
        lea edi, DWORD PTR DS:[2+0x004B0000]
        xor DWORD PTR DS:[edi], 0x00000002
    
        lea edi, DWORD PTR DS:[1+0x004B0000]
        xor DWORD PTR DS:[edi], 0x00000001
    
        xor ecx,ecx
    

    哪个可以更优化,所以它变成:

    xor BYTE PTR DS:[0x004B0004], 0x04
        xor BYTE PTR DS:[0x004B0003], 0x03
        xor BYTE PTR DS:[0x004B0002], 0x02
        xor BYTE PTR DS:[0x004B0001], 0x01
    
        xor eax, eax       ;May be unnecessary if value unused by later code
        mov edi,0x004B0001 ;May be unnecessary if value unused by later code
        xor ecx, ecx       ;May be unnecessary if value unused by later code
    

    通过组合XOR可以进一步优化:

    xor DWORD PTR DS:[0x004B0001], 0x04030201
    
        xor eax, eax       ;May be unnecessary if value unused by later code
        mov edi,0x004B0001 ;May be unnecessary if value unused by later code
        xor ecx, ecx       ;May be unnecessary if value unused by later code
    

    注意:是的,这是一个未对齐的XOR,但可能比现代CPU上的多个较小的对齐XOR更快,因为它不会跨越缓存线边界 .

    实质上;整个循环可以简化为单个指令 .

相关问题