2014-01-17 6 views
1

я следующий код:Compiler недоразумение

IMAGE_THUNK_DATA* ori_iat; 
ori_iat += sizeof(IMAGE_THUNK_DATA) 

generates the asm: 

MOV EAX, ORI_IAT; 
ADD EAX, 10h; 
MOV ORI_IAT; EAX 

Который не то, что я хотел, так как SizeOf из IMAGE_THUNK_DATA должно быть 8, Сейчас я стараюсь это:

IMAGE_THUNK_DATA* ori_iat; 
DWORD addr = (DWORD)ori_iat; 
addr += sizeof(IMAGE_THUNK_DATA) 
ori_iat = (IMAGE_THUNK_DATA)addr; 

generates the asm: 

MOV ADDR, ORI_IAT; 
ADD ADDR, 4; 
MOV ORI_IAT, ADDR; 

Опять неправильно, теперь давайте попробуем это:

IMAGE_THUNK_DATA* ori_iat; 
ori_iat += (DWORD)sizeof(IMAGE_THUNK_DATA); 

generates the asm: 

MOV EAX, ORI_IAT 
MOV ECX, 10h 
LEA EAX, [EAX+ECX*4] 

Очень плохо, я не знаю, как рассказать компилятору, я просто хочу добавьте 8 к текущему указателю и его действительно раздражает.

UPDATE: ищет Также на IMAGE_THUNK_DATA он имеет 4 DWORDs, который является размер 0x10h, но в зависимости от того, что я вижу на DUMP на OllyDbg относительно структуры IMAGE_THUNK_DATA его так:

C5 87 87 00 | 00 00 00 00 
DB 87 87 00 | 00 00 00 00 
F7 87 87 00 | 00 00 00 00 
0E 88 87 00 | 00 00 00 00 

Это приводит меня чтобы думать, что размер структуры на самом деле равен 8.

SOLVED: Спасибо за оператора ++. Я не привык работать с указателями, также IMAGE_THUNK_DATA структура его на самом деле размер 4. Каждый IMAGE_IMPORT_DESCRIPTOR указывает на следующий IMAGE_THUNK_DATA, так мне плохо :)

+0

Вы рассмотрели оптимизацию выравнивания кадров? Попробуйте '-O0' –

ответ

3

я думаю, что вы хотели это

ori_iat++ 

, потому что в C/C++

 ptr + i 

эквивалентно

 &(ptr[i]) 
+0

Спасибо, что в значительной степени делает это, у меня была неправильная длина также структуры, ее размер 4 :) – ffenix

1

sizeof возвращает байты. Добавление 1 к указателю увеличивает его по размеру типа данных.

ori_iat += sizeof(IMAGE_THUNK_DATA) 

В соответствии с такой же, как вы

ori_iat += 8 

Таким образом, это увеличивает ori_iat по 8 * sizeof(*ori_iat), которое должно быть 64, а не 16, показанный в сборе (0x10).

Так, sizeof(IMAGE_THUNK_DATA) должен быть квадратный корень из 16, что составляет 4.

И действительно, следующий фрагмент кода ассемблера показывает, что размер на самом деле 4, а не 8 (потому что вы не добавляя к указателю, а к нормальная целочисленная переменная, она просто добавит номер напрямую).

+0

Спасибо за ответ, у меня был неправильный размер для IMAGE_THUNK_DATA его размер 4, и каждый IMAGE_IMPORT_DESCRIPTOR указывает на следующая запись, но между IMAGE_THUNK_DATA по-прежнему существует пробел в 4 байта, не знаю почему. вероятно, для заполнения до 8 байтов ... – ffenix

+0

@ffenix Исправлен ответ, первая версия была неправильной (размер указателя не имеет к этому никакого отношения). – hyde

+0

Почему ollydbg показывает что-то еще, чем 4, я не знаю.То, что обычно понимается дополнением, включается в 'sizeof' структуры, потому что при использовании в массиве' sizeof' должно быть разделение между элементами массива. Возможно, это связано с выравниванием до 8 байтов, когда у вас есть одна структурная переменная или из-за гранулярности размера блока кучи, если она выделена в куче, или что-то в этом роде. – hyde

Смежные вопросы