Добрый день. Занимаюсь исследованием Linux и Java для общего развития на будущее.
Прочел, что с помощью
LD_PRELOAD
можно осуществить перехват динамически-линкуемых функций, достаточно лишь экспортировать их в своей библиотеке и подключить ее с помощью
LD_PRELOAD
. А дальше кто первый объявит функцию, "того и тапки".
Решил заменить функции
Java_java_lang_ClassLoader_defineClass0
,
Java_java_lang_ClassLoader_defineClass1
,
Java_java_lang_ClassLoader_defineClass2
из
libjava.so
. Выбор сделан с целью в дальнейшем расшифровывать шифрованные ресурсы. Эту цель прошу оставить за рамках обсуждения.
Что ж. Написал "Hello world" на яве из трех классов и одного ресурса. Проверяю:
#java -cp . Main
Hello world
Пишу библиотеку. Поскольку в C++ я несколько плаваю, писать решил на FreePascal:
library run;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
procedure Java_java_lang_ClassLoader_defineClass0; cdecl; export;
begin
Writeln('LibRun Java_java_lang_ClassLoader_defineClass0');
end;
procedure Java_java_lang_ClassLoader_defineClass1; cdecl; export;
begin
Writeln('LibRun Java_java_lang_ClassLoader_defineClass1');
end;
procedure Java_java_lang_ClassLoader_defineClass2; cdecl; export;
begin
Writeln('LibRun Java_java_lang_ClassLoader_defineClass2');
end;
exports
Java_java_lang_ClassLoader_defineClass0,
Java_java_lang_ClassLoader_defineClass1,
Java_java_lang_ClassLoader_defineClass2;
initialization
Writeln('LibRun loaded');
finalization
Writeln('LibRun unloaded');
end.
Ожидаю увидеть одно из сообщений
LibRun Java_java_lang_ClassLoader_defineClass*
, а дальше ошибку, т.к. мои реализации ничего не делают.
Запускаю:
#LD_PRELOAD=/path/to/lib/librun.so java -cp . Main
LibRun loaded
Hello world
LibRun unloaded
Как видим, библиотека подключилась, но перехвата не произошло.
Вопрос, что не так?