Допустим есть такое Код (Text): //................. char str[1024]; //................. Как можно узнать в каком байте PE файла начинается DWORD с RVA или VA,на эту переменную?
Код (Text): //................. __declspec(dllexport) char str[1024]; //................. Код (Text): //................. #pragma data_seg(push, "str") char str[1024]; #pragma data_seg(pop) //.................
никак если файл с релоками если без можно захардкодить адрес константой адрес массива адрес функции ничего не узнать пока загрузчик не пофиксит все ссылки на данные/функции например есть такой код void(*ppjo)() = &asdfgh; 0041161E C7 45 F0 5A 10 41 00 mov dword ptr [ppjo],offset asdfgh (41105Ah) если 0x00400000 это база то 1105a это смещение которое надо добавить к новой базе и исправить код если новая база будет например 0x10000000 то пофиксится так 0041161E C7 45 F0 5A 10 01 10 mov dword ptr [ppjo],offset asdfgh (1001105Ah)
В том то и дело что мне нужно узнать,что представляет из себя переменная пока её загрузчик не "пофиксил".
ну тогда бери va переменной/функции/массива вычитай из него базу получиш rva этих сущностей va глобального массива например char buf[]; &buf если релоков нет то он таким и останется
Сгенерить map-файл или отладочную информацию и пересчитать RVA в смещение в файле? Хотя если эта хрень на стеке, её в PE вообще не будет.
Если бы все так было тривиально Но меня интересует перменная статического TLS.При одной и той же базе загрузчик каждый раз пишет туда разные VA.Вот меня и интересует что там было до того как он пофиксил.
нет. osox прав. компилишь слитно секции, вычитаешь разницу с базы во время рантайма с учетом смещения на стадии компиляции.