Компилирую следующий код: Код (Text): Imp = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; и соответственно Код (Text): mov edx, (IMAGE_NT_HEADERS PTR [edx]).OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress в результате генерируемый код расходится: Код (Text): mov eax, DWORD PTR _ntHeaders$[ebp] mov ecx, DWORD PTR [eax+128] mov DWORD PTR _Imp$[ebp], ecx и Код (Text): mov edx, DWORD PTR [edx+121] Что не так?
Stub В первом случае: DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] DataDirectory + IMAGE_DIRECTORY_ENTRY_IMPORT * sizeof(IMAGE_DATA_DIRECTORY) DataDirectory + 1 * 8 DataDirectory + 8 Во втором: DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] DataDirectory + IMAGE_DIRECTORY_ENTRY_IMPORT DataDirectory + 1 Отсюда разница в 7.
у Iczelion'а приблизительно так: Код (Text): assume edi:ptr IMAGE_NT_HEADERS .IF [edi].Signature == IMAGE_NT_SIGNATURE mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
Quantum, Asterix Спасибо за помощь - сделал Код (Text): mov edx, [edx].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY*IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress и теперь все нормально
Потому что это ассемблер, а не си. И в нём высчитывание смещений в таких конструкциях сделан упрощённо.