Как передать CPP код в компилятор, минуя запись на диск?
Как можно передать сурс c++ проекта, минуя запись файла на диск.
Таким же образом как это происходит с dll при ManualMap, по идее нужно "кормить" какую-то из функций компилятора( на ваш выбор , с каким проще работать и что конкретно требуется делать , visual studio, gcc), передавая текст как байтовый массив( предварительно его декрептуя).
Нужно это для усложнения получения тех самых сурсов ( c++ проекта),если доступ машины( на которой он расположен) будет скомпромитирован.
Если есть какие то более универсальные решения таких проблем, буду рад услышать, спасибо за внимание.
devalone, Это своего рода и есть локальный сервер, и можно сказать 99% времени доступа к нему нету, но т.к. доступ возможно понадобится передать,либо зальют Шелл ( через одну из уязвимостей , о которых не известно) хотелось бы не оставлять сурс как есть, пусть лучше живёт в памяти пока сервер работает.
devalone, Дело в том что через этот сервер будет передаваться , скомпилированный исполняемый файл( но с некоторыми изменениями, в зависимости от входящих данных)
NighFury, хранить объектные файлы и вместо компиляции просто линковать их с ещё одним, в котором делать изменения? Ещё можно смонтировать область оперативной памяти https://en.wikipedia.org/wiki/Tmpfs храниться будет в RAM, но при ребуте стираться.
devalone, Ram будет доступен как обычный диск ?
Задача в том чтобы усложнить, возможный слив сурсов.То что живёт в памяти исполняемого процесса,не скопировать , пока не разберёшь программу в дизассемблере для нахождения нужного адреса.А вот всякие temp файлы и ram, изначально записываються в известное пространство, откуда скопировать проще и разобрать в дальнейшем( Можно хоть весь диск скопировать, а потом разбирать), поправь меня если я не прав ( взаимодействие между ram через тот же CreatFileA). На счёт распределения объектов и линковки , можно увидеть подробный пример ?
devalone, Интересный вариант, только вот мне нужно будет менять значение в
void doSomething(std::string value)
{
If(getsecretVal==ChangableVal)
std::cout << value << std::endl;
}
,main.o ,уже скомпилированн.
А напрямую к gcc не подключиться ?
Нету разве API или может другого более открытого компилятора,который можно использовать подобным образом ?
NighFury, получай changableVal через функцию из другого объектного файла, а можно его получать допустим при старте программы откуда угодно(хоть из файла на диске) и сохранять в память.
devalone, дело в том что changableVal приходит в ту программу которая управляет сборкой, и потом уже подсоввается в сурс .
Вариант конечно интересный и если дополнить обфускицией и всяким мусором, вполне сойдёт, но это не полное решение того что мне надо, понимаю что копать надо глубже и вникать тут всем лень, но хоть ссылки на то чем оперировать , могли бы и оставить. Manualmap тоже не сразу сделали( пришлось разбирать PE image и dos) у компилятора что то подобное должно быть и гораздо проще для обработки самого текста, вопрос в том как туда "подключиться" .
Ваш пайп сугубо консольное решение не так ли ? Мне нужно другое, без записи на диск, только работа в памяти.
Конкретно, принятие через сокет, байтового массива (сурсов),и создания отдельного потока для дещифрации и передачи в компилятор.
PS
Зачем менять тэги ?
P.S.S
Просто замечательный дизайн под мобилки , нажал редактировать удалил свой же комментарий, очень приятно.
kloppspb, Ну как нет если человек привел пример с консольной командой( Куда я буду пихать сурс - ShellExecute ? , Мне нужно чтобы все было в памяти процесса, без открытия консолей и записи на диск) , при том что все что она делает это создаёт temp файл на диск( я разве такое решение искал ?)
kloppspb , Если вы не знаете как решить задачу, не стоит ее назвать идиотской.IPC это обходной вариант, с компилятором все равно придется общаться через CMD, и каждый раз вызывать CreateFile,либо IO, а это вообще не здорово, ибо поставив обычный хук на вызов, можно все перехватить, не особо напрягаясь. Вся суть задачи в том чтобы не оставлять простой возможности получить сурс, используемый при компиляции ( некоторые значения переменных будут изменяться, в зависимости от запроса( внутри программы которая обрабатывает этот сурс) ) . А если этот сурс лежит на диске или записывается в тот же пайп стандартно, очень легко его оттуда стащить, не так ли ?
с компилятором все равно придется общаться через CMD
Что за дичь вы несете? Загляните в unistd.h, в нём определена функция для создания неименованного пайпа, что и использует shell в моём примере.
Создаёте пайп, вам 2 хендлера вернётся - на запись и на чтение. Записываете туда данные, закрываете один хендлер. Подсовываете пайп в качестве stdin компилятору и радуетесь.
А раз речь идёт о хуках, то можно вообще абсолютной любой вызов захукать через LD_PRELOAD. И ничто вас не спасёт в таком случае.
fshp использует shell ,
А ExecuteShell это не CMD и обращение к компилятору не через. CMD?
Лучше бы про LD preload и рассказал, раз оттуда можно вытащить ( как байтовый массив) то и закинуть можно, при том что входные данные могут быть левыми.
Меня интересует аналог manual map, всякие пайпы не интересуют для вас трудно дать ,то решение которое мне нужно, хоршо, но не надо меня убеждать в том чтобы использовать то что вам нравится.
kloppspb, человек ты адекватный ? Не знаешь что такое manualmap ?
Я узнать хотел у тех кто шарит, в том как передать сам текст минуя запись на диск, по средствам хуков, либо через другой компилятор типа clang, либо по другому. Не знаешь как это решить, зачем пишешь суда ?
fshp, Это все обычные command lines , что exec ,shell, cmd, я просто не думал что поставить хук, на хэндлер текста в gcc эта такая большая проблема. Либо переписать чутка LLVM clang чтобы оно умело работать с массивом байт вместо cindex ,то есть поставить API на уровень ниже, там вроде открытый код. На мой взгляд обеспечение изолированной архитектуры для взаимодействия с network данными и их компиляцией( без записи на диск), будет понадежнее чем то чем обычно все привыкли решать.
fshp, Так ведь все равно идёт обращение к CreateFile+WriteFile, для записи в пайп. Я хочу передавать именно в компилятор, а не в пайп, потом в компилятор( промежутков хочется избежать) .
Ну и ещё 1 важный момент тут, если к примеру нужно хранить cpp сурс закриптованным , на диске он таковым может быть, только вот при обращении к компилятору, сурс должен быть декриптован,пайп это или ramdisk, обычный хук на CreateFileA решит весь крипт , как будто его и не было( ибо компилятору нужен чистый хэндлер) А вот прямая работа с памятью , и передача только в условном месте, подразумевает что сурс будет, находится по надёжнее .