Вы могли бы написать общий объект, который получает предварительно загруженный, когда программа начинает работать. В .so вы переопределили функцию libc open()
. Когда вызывающий (программа, обманутая) передает в качестве аргумента строку /etc/mysql/my.cnf
, вместо этого вы откроете ~/my.cnf
и вернете открытый дескриптор файла. Вызывающий не знал бы разницы.
Ваш общий объект, разумеется, должен был бы вызвать «реальный» open()
, чтобы открыть дескриптор файла; вы можете получить указатель на исходную функцию libc, используя dlsym()
.
Это кажется чрезмерно сложным, но на самом деле это не так, оно работает как шарм. Я использовал его несколько раз, когда мне приходилось обманывать программу, в которой у меня не было источников; и он просто работает как часовой механизм.
Если вы хотите увидеть доказательство концепции, ознакомьтесь с my blog, где я его написал. Счастливое кодирование!
Предполагая, что дескриптор файла доступен из обоих потоков, вы можете закрыть старый дескриптор, открыть новый дескриптор и использовать 'dup2()' – user590028
'ln -s /etc/mysql/my.cnf ~/my.cnf' ? –
Проблема в том, что я хочу получать доход от других программ и не знаю, к чему они будут обращаться. Кроме того, крайне важно, чтобы они не получали никакой информации из файла, который они изначально запрашивали. Это должно быть нечто вроде песочницы. – Koogle