Объявление нового сегмента программы C

у меня есть этот простой тестовый код кода:

#include <Windows.h>
#include <stdio.h>

/* Declare new sections to store encrypted code and shellcode data */
#pragma section(".code", execute, read, write)
#pragma comment(linker,"/SECTION:.code,ERW")

// From here executable code will go in .code section
#pragma code_seg(".code")


int test()
{
    printf("prova");
    return 0;
}

// .stub SECTION
#pragma section(".stub", execute, read, write)
#pragma code_seg(".stub")

int main(int argc, char *argv[]){
    test(); /* Call function which executes shellcode now that it is decrypted */
    return 0;
}

Может ли кто-нибудь сказать мне, почему, если я выгружаю этот файл, я получаю только этот раздел по умолчанию:

  • .данные
  • .rdata
  • .reloc
  • .rsrc
  • .заглушка
  • .текст

Сегмент .code не сгенерирован. Я думаю, что я делал это в каком-то предыдущем проекте, я делаю что-то не так?

-- Дальнейшие испытания --

  • При дампе файла .obj отображается раздел .code.
  • .stub показано, что он сбрасывает .exe или .obj
  • удаление #pragma comment(linker,"/SECTION:.code,ERW") не помогло
  • добавление #pragma comment(linker,"/SECTION:.stub,ERW") не изменило результат дампа на .exe, .stub все еще отображается
  • изменение имени с .code на .somethingelse тоже не помогло, тот же результат

person Luca Reccia    schedule 31.08.2018    source источник
comment
Вы сбрасываете исполняемый файл или объектный файл?   -  person Some programmer dude    schedule 31.08.2018
comment
я сбрасываю .exe   -  person Luca Reccia    schedule 31.08.2018
comment
В любом случае .stub создается @Someprogrammerdude   -  person Luca Reccia    schedule 31.08.2018
comment
Если скидывать объектный файл, раздел в нем есть? Возможно, в скрипте компоновщика по умолчанию есть кейс для разделов с именем .code? Или, возможно, у него есть проверка исполняемых разделов (которые вы устанавливаете с помощью параметра /SECTION с помощью прагмы, но только для .code)?   -  person Some programmer dude    schedule 31.08.2018
comment
Да, @Someprogrammerdude, в объекте есть раздел, я только что попытался использовать другое имя, но все равно тот же результат (показан в объекте и не отображается в exe). Н.Б. заглушка создается каждый раз   -  person Luca Reccia    schedule 31.08.2018
comment
Затем последний эксперимент: что произойдет, если вы сделаете #pragma comment(linker,"/SECTION:.stub,ERW")? Разделы .stub все еще существуют в исполняемом файле?   -  person Some programmer dude    schedule 31.08.2018
comment
ничего не изменилось @Someprogrammerdude, я даже пытался удалить #pragma comment(linker,"/SECTION:.code,ERW"). Заглушка есть, а кода нет. Я даже несколько раз проверял путь, копируя тот, что в выходных данных компиляции, и пытался очистить проект, но ничего не изменилось.   -  person Luca Reccia    schedule 31.08.2018
comment
К сожалению, я больше не могу вам помочь. Пожалуйста, отредактируйте свой вопрос, включив в него результаты этих экспериментов, и, надеюсь, кто-то более знающий сможет вам помочь.   -  person Some programmer dude    schedule 31.08.2018
comment
добавьте /MAP к опции компоновщика, это будет наиболее информативно. однако #pragma code_seg(".code") работает как исключение   -  person RbMm    schedule 31.08.2018


Ответы (1)


Используя следующие директивы, я смог ограничить весь код/переменную/константу сегментом .code, который был виден с помощью команды dumbin.

#pragma section(".code", execute, read)
#pragma section(".codedata", read, write)
#pragma comment(linker,"/SECTION:.code,ERW")
#pragma comment(linker,"/SECTION:.codedata,ERW")
#pragma comment(linker, "/MERGE:.codedata=.code")

#pragma code_seg(".code")
#pragma data_seg(".codedata")
#pragma const_seg(".codedata")
person Luca Reccia    schedule 12.09.2018