Сейчас на форуме: Rio, johnniewalker, vsv1, Magister Yoda, Kybyx (+6 невидимых)

 eXeL@B —› Крэки, обсуждения —› Java получение байт кода
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 ноября 2011 14:55
· Личное сообщение · #1

Есть Java программа c зашифрованным байт кодом, никакой декомпилятор ее не берет, при запуске этот код передается на native метод для расшифровки, на выходе получаем объект типа Class<?>. Собственно вопрос как можно получить чистый байт код для последующей декомпиляции ?

Используется модифицированный classloader.

Кусок кода отвечающий за передачу шифрованного байт кода в native

Code:
  1.          private final Class<?> defineClassCond(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain, boolean verify) throws ClassFormatError
  2.          {
  3.                  protectionDomain = preDefineClass(name, protectionDomain);
  4.                  Class c;
  5.                  String source = defineClassSourceLocation(protectionDomain);
  6.                  try
  7.                  {
  8.                         c = ClassTransform.defineClass3(this, name, b, off, len, protectionDomain, source, verify);
  9.                  }
  10.                  catch(Exception e)
  11.                  {
  12.                         c = defineTransformedClass(name, b, off, len, protectionDomain, e, source, verify);
  13.                  }
  14.                  postDefineClass(c, protectionDomain);
  15.                  return c;
  16.          }


ClassTransform.defineClass3 - это тот самый native метод



Ранг: 3.0 (гость), 3thx
Активность: 0=0
Статус: Участник

Создано: 02 ноября 2011 08:39
· Личное сообщение · #2

Смотри частично здесь http://exelab.ru/f/action=vthread&forum=1&topic=19192

Используя stacktrace, ставь брейк на методе defineClassCond. Когда брейк сработает, получи все параметры через $m.args - возможно скопируй параметр byte[] b (поскольку он наверняка будет большим) и protectionDomain во внешние переменные, например так byteArray=$m.args[1]; после экспортируй его для внешнего использования :export byteArray

Все простые параметры можно либо также экспортировать, либо же записать на листочек и использовать позже

То же самое сделай с референсом на сам класс где нужный метод расположен, то есть если метод defineClassCond расположен в классе MyClass то получить референс на класс можно через
myClassRef=$m.object; после этого снова экпортируй через :export myClassRef

Дальше совсем просто набираем

DecryptedClass = myClassRef.defineClassCond(name, byteArray, ... все другие параметры);
bc=bytecode(DecryptedClass);
print(bc.data);




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 04 ноября 2011 18:06
· Личное сообщение · #3

как всё стало просто а мне приходилось asm-код перекомпилировать.
радует, что утилиты развиваются, и сорри за оффтоп


 eXeL@B —› Крэки, обсуждения —› Java получение байт кода
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати