приветствую,
так вышло, что столкнулись с ситуацией, когда у одного 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
кто-нить может подсказать где искать настоящий байт-код или как подменить вышеуказанный хедер?
Здравствуйте, 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-ом декомпилировался.
Здравствуйте, bl-blx, Вы писали:
C0s>>кто-нить может подсказать где искать настоящий байт-код или как подменить вышеуказанный хедер?
BB>Недавно делал подобную штуку с 10.2.0. Но я, видимо, шёл по сложному пути.
спасибо, через пару дней опять у этих ребят буду в гостях, попробуем и такой вариант. потом отпишусь
Здравствуйте, 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 не всё реконструировал, надо аккуратно теперь прописать обработчики исключений и проч.)