Извлечь java byte code из Oracle
От: C0s Россия  
Дата: 08.02.10 18:12
Оценка:
приветствую,

так вышло, что столкнулись с ситуацией, когда у одного java-класса, загруженного в oracle, потерялся исходник.
методом гугления нашёл запрос
select o.NAME, i.PIECE from obj$ o, sys.IDL_UB1$ i where o.type# = 29 and o.obj# = i.obj#

добавил к нему Like и нашёл даже интересуемый класс (замаплен в качестве реализации одной из хранимок).

однако, выяснилось, что содержимое этого объекта лишь похоже на байт-код, в реальности же им не являясь (отсутствует header CAFEBABE и вообще, первые примерно 300+ байт странные, когда остальное содержимое уже очень похоже на байт-код).

первые байты примерно такие:
0000000000: FF FC FE FA 01 00 00 00 │ 64 00 00 00 2B 1C 00 00
0000000010: 86 00 00 00 1D 00 00 00 │ 07 00 00 00 00 00 00 00
0000000020: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
0000000030: 00 00 00 00 AF 19 00 00 │ 02 00 00 00 1A 00 00 00
0000000040: 01 00 00 00 17 00 00 00 │ 10 00 00 00 00 00 00 00
0000000050: FE FF FF FF 22 00 00 00 │ 1E 00 00 00 FE FF FF FF
0000000060: 0E 00 00 00 00 00 00 00 │ FE FF FF FF 10 00 00 00
0000000070: 00 00 00 00 FE FF FF FF │ 13 00 00 00 00 00 00 00
0000000080: FE FF FF FF 16 00 00 00 │ 00 00 00 00 FE FF FF FF
0000000090: 13 00 00 00 00 00 00 00 │ FE FF FF FF 1A 00 00 00
00000000A0: 00 00 00 00 FE FF FF FF │ 0D 00 00 00 00 00 00 00
00000000B0: FE FF FF FF 2A 00 00 00 │ 16 00 00 00 FE FF FF FF
00000000C0: 10 00 00 00 00 00 00 00 │ FE FF FF FF 16 00 00 00
00000000D0: 00 00 00 00 FE FF FF FF │ 12 00 00 00 00 00 00 00
00000000E0: FE FF FF FF 1A 00 00 00 │ 00 00 00 00 FE FF FF FF
00000000F0: 27 00 00 00 13 00 00 00 │ FE FF FF FF 25 00 00 00
0000000100: 11 00 00 00 FE FF FF FF │ 30 00 00 00 1C 00 00 00
0000000110: FE FF FF FF 26 00 00 00 │ 12 00 00 00 FE FF FF FF
0000000120: 11 00 00 00 00 00 00 00 │ FE FF FF FF 10 00 00 00
0000000130: 00 00 00 00 FE FF FF FF │ 10 00 00 00 00 00 00 00
0000000140: FE FF FF FF 0F 00 00 00 │ 00 00 00 00 FE FF FF FF
0000000150: 14 00 00 00 00 00 00 00 │ FE FF FF FF 13 00 00 00
0000000160: 00 00 00 00 FE FF FF FF │ 13 00 00 00 00 00 00 00
0000000170: FE FF FF FF 1A 00 00 00 │ 00 00 00 00 FE FF FF FF
0000000180: FF FF FF FF FC FF FF FF │ FF FF FF FF FD FF FF FF


кто-нить может подсказать где искать настоящий байт-код или как подменить вышеуказанный хедер?
Re: Извлечь java byte code из Oracle
От: bl-blx Россия http://yegodm.blogspot.com
Дата: 09.02.10 04:09
Оценка: 8 (1)
Здравствуйте, C0s, Вы писали:

C0s>кто-нить может подсказать где искать настоящий байт-код или как подменить вышеуказанный хедер?

Недавно делал подобную штуку с 10.2.0. Но я, видимо, шёл по сложному пути.
1) В схеме DEV, где нужный мне класс находился, сделал так:
CREATE PACKAGE PKG_SERVERDUMP AS

FUNCTION dumpClassToFile(Param1 VARCHAR2, Param2 VARCHAR2, Param3 VARCHAR2) 
  return VARCHAR2 
AS
  LANGUAGE java 
    NAME 'oracle.aurora.server.tools.dumpclass.ServerDump.dumpClassToFile(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';

end;

2) Поскольку требовался вывод в файл на джаве, в схеме SYS дал права на запись во все файлы схеме DEV:
DECLARE 
  GRANTEE VARCHAR2(32767);
  PERMISSION_TYPE VARCHAR2(32767);
  PERMISSION_NAME VARCHAR2(32767);
  PERMISSION_ACTION VARCHAR2(32767);
  KEY NUMBER;

BEGIN 
  GRANTEE := 'DEV';
  PERMISSION_TYPE := 'SYS:java.io.FilePermission';
  PERMISSION_NAME := '<<ALL FILES>>';
  PERMISSION_ACTION := 'write';
  KEY := NULL;

  SYS.DBMS_JAVA.GRANT_PERMISSION ( GRANTEE, PERMISSION_TYPE, PERMISSION_NAME, PERMISSION_ACTION, KEY );
  DBMS_OUTPUT.PUT_LINE('RET=' || KEY);
  COMMIT; 
END;


3) Задампил класс в файл (WinXP, локальный оракл):
DECLARE 
  CLASSNAME VARCHAR2(32767);
  USER VARCHAR2(32767);
  FILENAME VARCHAR2(32767);
  RETVAL VARCHAR2(32767);
BEGIN 
  CLASSNAME := 'appbase/tools/oracle/StringUtils';
  USER := 'DEV';
  FILENAME := 'c:\StringUtils.class';

  RETVAL := PKG_SERVERDUMP.DUMPCLASSTOFILE ( CLASSNAME, USER, FILENAME );
  DBMS_OUTPUT.PUT_LINE(RETVAL);
END;

В результате у меня получился файлик c:\StringUtils.class, который нормально JAD-ом декомпилировался.
El pueblo unido jamás será vencido.
Re[2]: Извлечь java byte code из Oracle
От: C0s Россия  
Дата: 09.02.10 07:19
Оценка:
Здравствуйте, bl-blx, Вы писали:

C0s>>кто-нить может подсказать где искать настоящий байт-код или как подменить вышеуказанный хедер?

BB>Недавно делал подобную штуку с 10.2.0. Но я, видимо, шёл по сложному пути.

спасибо, через пару дней опять у этих ребят буду в гостях, попробуем и такой вариант. потом отпишусь
Re[2]: Извлечь java byte code из Oracle
От: C0s Россия  
Дата: 11.02.10 15:14
Оценка:
Здравствуйте, bl-blx, Вы писали:

C0s>>кто-нить может подсказать где искать настоящий байт-код или как подменить вышеуказанный хедер?

BB>Недавно делал подобную штуку с 10.2.0. Но я, видимо, шёл по сложному пути.

у меня с наскоку не получилось разрулить ситуацию с правами, отчасти, возможно из-за того, что я не знал заранее и не посмотрел, какой из пользователей был реальным владельцем нужного мне класса, чтобы всё запускать из правильных мест.

но я покопался в пакете dbms_java и по концовке сделал существенно проще — без файлов:
  function extract_class return blob AS
    lblob_class BLOB;
  BEGIN
     DBMS_LOB.CREATETEMPORARY (lblob_class, FALSE);
     dbms_java.export_class('com.stupid.MyClass', lblob_class);
     return lblob_class;
  END extract_class;


Эту функцию я включил во временно созданный пакет, залил пакет под SYS (именно он оказался owner'ом нужного мне объекта), и в PL-SQL Developer выполнил Test функции. Полученный в окне PL-SQL Dev результат сохранил к себе на диск и успешно его заjadил.

в любом случае, спасибо за наводку на правильный пакет. до этого мне не доводилось заниматься программированием на java под oracle, теперь, видимо, немножко освою, т.к. извлечённый класс без исходника придётся воссоздать (jad не всё реконструировал, надо аккуратно теперь прописать обработчики исключений и проч.)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.