Получения адреса секции в msvc
От: reider  
Дата: 12.10.18 10:54
Оценка:
Доброго времени суток.
Я в студии создал свою секцию, #pragma data_seg(".1111"), как получить в коде её адрес?
Компилирую по заданной базе и нахоху пока так:
DWORD dwImportDirectoryVA, dwSectionCount, dwSection = 0, dwRawOffset;
    LPVOID lpFile;
    PIMAGE_DOS_HEADER pDosHeader;
    PIMAGE_NT_HEADERS pNtHeaders;
    PIMAGE_SECTION_HEADER pSectionHeader;
    PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor;
    PIMAGE_THUNK_DATA pThunkData;
    lpFile = (LPVOID)0x00400000;
    pDosHeader = (PIMAGE_DOS_HEADER)lpFile;
    pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)lpFile + pDosHeader->e_lfanew);
    dwSectionCount = pNtHeaders->FileHeader.NumberOfSections;
    dwImportDirectoryVA = pNtHeaders->OptionalHeader.DataDirectory[1].VirtualAddress;
    pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pNtHeaders + sizeof(IMAGE_NT_HEADERS));
    pSectionHeader++;
    pSectionHeader++;
    pSectionHeader++;
DWORD ADDR = pNtHeaders->OptionalHeader.ImageBase + pSectionHeader->VirtualAddress;


Есть ли более человеческий способ?
Re: Получения адреса секции в msvc
От: Alexander G Украина  
Дата: 15.10.18 04:52
Оценка:
Здравствуйте, reider, Вы писали:

R>Доброго времени суток.

R>Я в студии создал свою секцию, #pragma data_seg(".1111"), как получить в коде её адрес?
R>Компилирую по заданной базе и нахоху пока так:
R>
R>DWORD dwImportDirectoryVA, dwSectionCount, dwSection = 0, dwRawOffset;
R>    LPVOID lpFile;
R>    PIMAGE_DOS_HEADER pDosHeader;
R>    PIMAGE_NT_HEADERS pNtHeaders;
R>    PIMAGE_SECTION_HEADER pSectionHeader;
R>    PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor;
R>    PIMAGE_THUNK_DATA pThunkData;
R>    lpFile = (LPVOID)0x00400000;
R>    pDosHeader = (PIMAGE_DOS_HEADER)lpFile;
R>    pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)lpFile + pDosHeader->e_lfanew);
R>    dwSectionCount = pNtHeaders->FileHeader.NumberOfSections;
R>    dwImportDirectoryVA = pNtHeaders->OptionalHeader.DataDirectory[1].VirtualAddress;
R>    pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pNtHeaders + sizeof(IMAGE_NT_HEADERS));
R>    pSectionHeader++;
R>    pSectionHeader++;
R>    pSectionHeader++;
R>DWORD ADDR = pNtHeaders->OptionalHeader.ImageBase + pSectionHeader->VirtualAddress;
R>


R>Есть ли более человеческий способ?


Как минимум, для получения pNtHeaders вызвать ImageNtHeader из Dbghelp.dll (документированная "отладочная" версия) или RtlImageNtHeader из ntdll.dll (недокументированная внутренняя версия)

Я ещё не вижу, зачем dwImportDirectoryVA , но если надо, то [Rtl]ImageDirectoryEntryToData[Ex]
Русский военный корабль идёт ко дну!
Re: Получения адреса секции в msvc
От: Alexander G Украина  
Дата: 15.10.18 04:58
Оценка:
Здравствуйте, reider, Вы писали:


R>Компилирую по заданной базе


R> lpFile = (LPVOID)0x00400000;


Да, базу можно узнать GetModuleHandle вызовом. Для exe просто передать NULL как имя, для DLL-запомнить в DLLmain, в общем случае GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS и передачей своей глобальной переменной.
Русский военный корабль идёт ко дну!
Отредактировано 15.10.2018 4:59 Alexander G . Предыдущая версия .
Re[2]: Получения адреса секции в msvc
От: reider  
Дата: 15.10.18 11:28
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, reider, Вы писали:



R>>Компилирую по заданной базе


R>> lpFile = (LPVOID)0x00400000;


AG>Да, базу можно узнать GetModuleHandle вызовом. Для exe просто передать NULL как имя, для DLL-запомнить в DLLmain, в общем случае GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS и передачей своей глобальной переменной.


Я имел ввиду некой прагмой или макросом
Re[3]: Получения адреса секции в msvc
От: EreTIk EreTIk's Box
Дата: 15.10.18 12:09
Оценка:
Здравствуйте, reider, Вы писали:

R>Я имел ввиду некой прагмой или макросом


__ImageBase
Re[4]: Получения адреса секции в msvc
От: reider  
Дата: 15.10.18 13:41
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>Здравствуйте, reider, Вы писали:


R>>Я имел ввиду некой прагмой или макросом


ETI>__ImageBase

А на секцию? Например .reloc
Re[5]: Получения адреса секции в msvc
От: EreTIk EreTIk's Box
Дата: 16.10.18 09:56
Оценка:
Здравствуйте, reider, Вы писали:

ETI>>__ImageBase

R>А на секцию? Например .reloc

Программное перечисление IMAGE_SECTION_HEADER'ов и сравнение их поля Name с требуемым.

Если интересуют именно reloc'и, то ImageDirectoryEntryToDataEx(..., IMAGE_DIRECTORY_ENTRY_BASERELOC, ...)
Re: Получения адреса секции в msvc
От: Pavel Dvorkin Россия  
Дата: 16.10.18 10:08
Оценка: +1
Здравствуйте, reider, Вы писали:

R>Есть ли более человеческий способ?


А такое не пойдет ?

#pragma data_seg(".1111")
int x = 5;
#pragma data_seg()

int main()

{
    int * px = &x;
}


Иными словами, взять указатель на первую переменную в секции. Для надежности можно сбросить 12 младших бит в указателе, хотя (сейчас попробовал) они и так сброшены.

Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть
With best regards
Pavel Dvorkin
Отредактировано 16.10.2018 10:12 Pavel Dvorkin . Предыдущая версия .
Re[2]: Получения адреса секции в msvc
От: flаt  
Дата: 16.10.18 13:36
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть


Дело не сколько в Vista, а в присутствии ".reloc" и флаге ASLR. Да и до неё ImageBase мог выставляться флагом линкера.
Re[3]: Получения адреса секции в msvc
От: Pavel Dvorkin Россия  
Дата: 16.10.18 14:50
Оценка:
Здравствуйте, flаt, Вы писали:

F>Дело не сколько в Vista, а в присутствии ".reloc" и флаге ASLR. Да и до неё ImageBase мог выставляться флагом линкера.


Со вторым согласен, а насчет первого сомнения. Зачем релокировать EXE, если с него загрузка и начинается ?
Во всяком случае я не слышал, чтобы до Vista hInstance не был равен 0x400000 без того, чтобы это установить в опциях линкера, что для EXE практически никто не делал.
With best regards
Pavel Dvorkin
Re[2]: Получения адреса секции в msvc
От: reider  
Дата: 17.10.18 11:47
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, reider, Вы писали:


R>>Есть ли более человеческий способ?


PD>А такое не пойдет ?


PD>
PD>#pragma data_seg(".1111")
PD>int x = 5;
PD>#pragma data_seg()

PD>int main()

PD>{
PD>    int * px = &x;
PD>}
PD>


PD>Иными словами, взять указатель на первую переменную в секции. Для надежности можно сбросить 12 младших бит в указателе, хотя (сейчас попробовал) они и так сброшены.


PD>Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть


Адрес базы у меня именно такой потому как я выключил reloc секции указав параметр "фиксированная база".
Так не получилось, так как в секции много переменных и линкер их перемешивает.
Re[2]: Получения адреса секции в msvc
От: reider  
Дата: 17.10.18 11:59
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, reider, Вы писали:


R>>Есть ли более человеческий способ?


PD>А такое не пойдет ?


PD>
PD>#pragma data_seg(".1111")
PD>int x = 5;
PD>#pragma data_seg()

PD>int main()

PD>{
PD>    int * px = &x;
PD>}
PD>


PD>Иными словами, взять указатель на первую переменную в секции. Для надежности можно сбросить 12 младших бит в указателе, хотя (сейчас попробовал) они и так сброшены.


PD>Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть




Спасибо, понял в чём ошибка. У меня секция была в отдельном cpp файле, который имел h файл с extern.
Так вот Адрес начала секции равен адресу присваиваемому первой переменной extern вне зависимости от её положения в секции

Но это укзатель на данные секции. А мне интересен адрес заголовка секции
Отредактировано 17.10.2018 12:03 reider . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.