我正在努力弄清楚某个街区的运作方式。在堆上使用以下地址
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; 0 out eaxmov 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一起使用4h,但是它在循环中用它做了什么?
loopd short ntdll.77A701BF;所以这是一个"循环,而等于"但是我不确定在它上面用xor转换成什么。它会减少ecx吗?但随后它又跳回了lea线。
答案 0 :(得分: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更快,因为它不会跨越缓存行边界。
本质;整个循环可以简化为单个指令。