LINUX.ORG.RU

История изменений

Исправление wota, (текущая версия) :

1) надо выполнить свой код, это делается либо через конструктор статичной переменной, либо через перехват какой-нибудь используемой функции 2) после этого дело техники - сделать все что угодно

Вот пример через перехват функции (пример корявейший - по хорошему надо при первой возможности отвязываться и перехватывать управление через сигналы, но мне было лень):

~$ cat 1.cpp
#include <QtCore/QVariant>
#include <QtGui/QApplication>
#include <QtGui/QLabel>
#include <QtGui/QLayout>
#include <dlfcn.h>

typedef FILE* (*fopen_func)( const char*, const char* );
static fopen_func old_fopen = 0;

FILE* fopen( const char* path, const char* mode )
{
        if( !old_fopen )
                old_fopen = (fopen_func) dlsym(RTLD_NEXT, "fopen");

        for( QWidget* w : QApplication::topLevelWidgets() )
        {
                if( !w->property( "hacked" ).toBool() )
                {
                        QLayout* l = w->layout();
                        if( l )
                                l->addWidget( new QLabel( "<H1>FUCK M$</H1>" ) );

                        w->setProperty( "hacked", true );
                }
        }

    return old_fopen(path, mode);
}
~$ g++ -std=c++11 -shared -m32 -I/usr/include/qt4 1.cpp -o hook.so
~$ LD_PRELOAD=/home/igor/hook.so skype

результат:

http://i.piccy.info/i9/75e751fffe0cd41c6560d9624a135e42/1394541880/41096/6873...

Исходная версия wota, :

1) надо выполнить свой код, это делается либо через конструктор, либо через перехват какой-нибудь используемой функции 2) после этого дело техники - сделать все что угодно

Вот пример через перехват функции (пример корявейший - по хорошему надо при первой возможности отвязываться и перехватывать управление через сигналы, но мне было лень):

~$ cat 1.cpp
#include <QtCore/QVariant>
#include <QtGui/QApplication>
#include <QtGui/QLabel>
#include <QtGui/QLayout>
#include <dlfcn.h>

typedef FILE* (*fopen_func)( const char*, const char* );
static fopen_func old_fopen = 0;

FILE* fopen( const char* path, const char* mode )
{
        if( !old_fopen )
                old_fopen = (fopen_func) dlsym(RTLD_NEXT, "fopen");

        for( QWidget* w : QApplication::topLevelWidgets() )
        {
                if( !w->property( "hacked" ).toBool() )
                {
                        QLayout* l = w->layout();
                        if( l )
                                l->addWidget( new QLabel( "<H1>FUCK M$</H1>" ) );

                        w->setProperty( "hacked", true );
                }
        }

    return old_fopen(path, mode);
}
~$ g++ -std=c++11 -shared -m32 -I/usr/include/qt4 1.cpp -o hook.so
~$ LD_PRELOAD=/home/igor/hook.so skype

результат:

http://i.piccy.info/i9/75e751fffe0cd41c6560d9624a135e42/1394541880/41096/6873...