2013-08-03 8 views
0

Найдено нескольких похожих должностей, но ни одна из них не касается моей конкретной проблемы.Определение размера структуры

Я пытаюсь прочитать структуру данных из памяти внешних процессов. Я использовал OpenProcess для получения дескриптора, и моя функция для чтения памяти довольно аккуратная, но после сборки первой прочитанной структуры, которая должна быть 0xC0 байт, я вызываю sizeof (structure) и получаю двойное значение. Структура ниже, если это помогает. Надеюсь, кто-то может указать мне в правильном направлении.

Благодаря

struct BattleListEntry 
{ 
    int CID; 
    wstring Name; 
    byte* unknown[16]; 
    int z, y, x; 
    byte* unknown2[8]; 
    int Direction; 
    int TimeLastMoved; 
    int rnd3, rnd4, rnd5, rnd6; 
    int isWalking; 
    byte* unknown3[12]; 
    int Outfit1, Outfit2, Outfit3, Outfit4, Outfit5; 
    byte* unknown4[24]; 
    int HpPct; // 40 * 4 from start 
    int rnd7; 
    int rnd8; 
    //byte* unknown5[12]; 
    int rnd9, rnd10, rnd11, rnd12, rnd13, rnd14, rnd15, rnd16, rnd17, rnd18; 
}; 
+0

Извинения, я, возможно, расширил структуру, так что удвоение общего размера фактически приведет к неправильному значению. Пожалуйста, проигнорируйте эту ошибку :) – XtrmJosh

+1

Вы, кажется, полагаете, что 'byte * unknown [16]' имеет размер 16 байт. Фактически, это '16 * sizeof (void *)' байт большой. Это не массив байтов, это массив указателей. Кроме того, 'sizeof (wstring)' очень зависит от реализации. Что заставляет вас думать, что EXE, о котором идет речь, была построена с той же версией того же компилятора, что и ваша программа? –

+0

Ничего, но я очень тщательно подобрал свои переменные в соответствии с размерами значений, которые нужно прочитать. Компилятор, используемый в исходной программе, становится очень очевидным, чтобы быть VS2010. Я знаю, что по моему опыту обратного проектирования приложения до и после выпуска VS2010 я видел, что они случайно реализовали ASLR ... Боль в заднице, которая оказалась. I sizeof'd wstring, чтобы подтвердить, что на самом деле он использует 32 байта. Я понимаю, что sizeof (byte) на самом деле 4, поэтому после деления этих значений и нескольких других модификаций я был бы ОЧЕНЬ близок к цели ... – XtrmJosh

ответ

1

Вы, кажется, полагаете, что byte* unknown[16] имеет размер 16 байт. Фактически, это 16*sizeof(void*) байт большой. Это не массив байтов, это массив указателей.

+0

Еще раз спасибо, Игорь, ваша помощь в значительной степени оценена! – XtrmJosh

0

типы, которые вы используете в структуры не все фиксированного размера. Например;

byte* unknown[16];

Вы можете попробовать минимизировать типы размеров вариантные и положить их до конца, и лучше использовать этикетку, чтобы объявить их размер.

+0

Привет, sgun, я верю, что wstring переполняется в указатель, когда он превышает 32 байта в структуре, так как он работает в целевой программе, и они используют похожий компилятор для моего. Спасибо, что указали на вопрос байта, хотя, как отметил Игорь Тандетник, указатели являются основной причиной проблемы. Thanks – XtrmJosh

+1

False. Длина фактического текста, который хранится в экземпляре 'wstring', никоим образом не влияет на значение' sizeof (wstring) 'и, следовательно, размер структуры, которая содержит' wstring' в качестве члена. –

+0

Итак, вы думаете, что вы можете получить размер байта wstring, просто используя 'sizeof (wstring)'? – sgun

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