Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вот так я взломал


Автор: Domestic Cat 28.2.2005, 04:52
Сабж

Код

import java.lang.reflect.*;

public class Test
{
public static void main(String [] ar) throws Exception
{
      A a = new A();
     Class b = Class.forName("A$B");
     Class a1 = Class.forName("A$1");
     Constructor[] bctor = b.getDeclaredConstructors();
     Object bimpl = bctor[1].newInstance(new Object[] {a, null});
     Method[] m = b.getDeclaredMethods();
     m[0].invoke(bimpl, new Object[] {});
}
}

class A
{
A(){}
       // А должен создавать объект Б, иначе не выйдет
       // где и как - по барабану
public void main()
{
     B b = new B();
}

private class B  // не такой уж он и приват
{
     void print()
     {
      System.out.println("Hello from hacked class!");
     }
}
}


Аутпут думаю, понятен.
java 1.5.0_01, win 2000, jikes.
Такая вот секьюрити smile

Автор: Zandr 28.2.2005, 08:41
j2sdk1.4.2_04:
Цитата

java.lang.IllegalAccessException: Class Test can not access a member of class A$B with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:268)
at Test.main(Test.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.intellij.rt.execution.application.AppMain.main(Unknown Source)
Exception in thread "main" Process terminated with exit code 1


Автор: Domestic Cat 28.2.2005, 08:59
Дык я ж говорю - jikes. javac на такое не ведется smile

В аттаче скомпиленное jikesом творение.

Автор: Sardar 28.2.2005, 09:41
Дык это на этапе компиляции только, после уже public/private не особо работают. Пример:
Код
public class jtest {
public void getPrivate() {
  jc j=new jc();
  System.out.println("Private field: "+j.privateField);
}
public static void main(String arg[]) {
  jtest j=new jtest();
  j.getPrivate();
}
}

Код

public class jc {
public String privateField="Private Test";
}

Компилим, запускаем, убеждаемся что работает. Меняем jc.java
Код

public class jc {
private String privateField="Private Test";
}

Компилим только jc.java, запускаем jtest, удивляемся smile
Компилятор: javac

Отсюда вывод, хак(системныe утилитy, мониторинг) нужно писать в опкодах на асме.

Автор: Domestic Cat 28.2.2005, 10:09
Цитата(Sardar @ 28.2.2005, 00:41)
Дык это на этапе компиляции только, после уже public/private не особо работают.


Прикол тот, что оба компилятора спокойно все компилят; только вот при запуске оказывается что jikes дал доступ к приватному классу, а javac - нет.

Автор: pompei 7.9.2007, 16:14
Хе а у меня на javac хакнулось

Я установил jdk6.1, используя far создал в папке D:\temp файл Test.java, вставил в него вышеприведенный код; запустил команду

D:\temp\>javac Test.java

В папке появились файлы
A.class
A$1.class
A$B.class
Test.class
ну и остался
Test.java

теперь даю команду
D:\temp\>java Test
Hello from hacked class!

 smile 

Может где-то у меня сикьюрити не так настроено?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)