2014-09-05 91 views
-2

我只是想加0x3C,但编译器将它转换为0x0F0。为什么??编译后生成的奇怪汇编代码

这是kernel32_base声明作为参数传递给函数:

DWORD * kernel32_base

而且这里的C代码和desassembled代码:

DWORD PE_shift=NULL; 
00DB212E mov   dword ptr [PE_shift],0 
    PE_shift = *(kernel32_base + 0x3C); //60=3Ch 
00DB2135 mov   eax,dword ptr [kernel32_base] 
00DB2138 mov   ecx,dword ptr [eax+0F0h] ; <----------------- 
00DB213E mov   dword ptr [PE_shift],ecx 

那个0F0h从哪里来?它应该是一个0x3C的权利?

回答

1

因为DWORD是一个四字节类型。你的C代码表示在基指针之后加载第4个字节数量的0x3C40x3C0xF0。如果你想获得DWORD字节偏移量0x3C,那么它需要:

PE_shift = *(DWORD*)((char*)kernel32_base + 0x3C); 
+0

MMMMM有趣。我应该怎么做,然后加上0x3C到kernel32_base中存储的地址?谢谢 – user1618465 2014-09-05 01:30:29

+0

甜蜜!很棒。 PD:两票否定票已经? :(谢谢 – user1618465 2014-09-05 01:32:29

+0

我必须等3分钟,我会尽快接受;)再次感谢 – user1618465 2014-09-05 01:33:42