@pqgg7nwkd4

Как перехватить Java_java_lang_ClassLoader_defineClass0 из libjava.so?

Добрый день. Занимаюсь исследованием 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

Как видим, библиотека подключилась, но перехвата не произошло.
Вопрос, что не так?
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
@pqgg7nwkd4 Автор вопроса
Java загружает эти файлы через dlopen и dlsym, поэтому не перехватывается.
Необходимо перехватить dlsym.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rou1997
@Rou1997
Прочел, что с помощью LD_PRELOAD можно осуществить перехват динамически-линкуемых функций, достаточно лишь экспортировать их в своей библиотеке и подключить ее с помощью LD_PRELOAD. А дальше кто первый объявит функцию, "того и тапки".

Если бы так было просто, то зачем бы был нужен MSHookFunction (Cydia)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы