을 우회하는 것은 :
는 1) 안전하지 않은, 내가 더 이상 보장이 없다는 입력 안전하고 JVM
그러므로
이 충돌 할 수 있음) ByteBuffers 또는 JNI
을 사용하여 유사한 작업을 수행 할 수 있음
3) Unsafe는 내부 클래스이므로 잘 사라질 수 있습니다.추출 데이터 (내가 뭐하는 거지 것을 충분히 알고 보안 Manager0
나는 이것을 실험 목적으로 만하고 있으며 그 결과를 알고 있습니다. 염두에두고
, 나는 배열로부터 데이터 사용하여 추출하기 위해 노력하고 안전하지 않은 반사 :내가 먼저 배열의 오프셋 (offset) 분야 찾습니다
public long findFieldOffset(Event event) {
try {
Class cl = event.getClass();
Field data_field = cl.getDeclaredField("data");
data_field.setAccessible(true);
long offset = unsafe.objectFieldOffset(data_field);
return offset;
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return 0;
}
가 나는 또한 기본을 추출을 배열의 위치 :
int base = unsafe.arrayBaseOffset(byte[].class);
내가 나중에 클래스 이벤트의 배열을 추출하려고하고,이 버퍼 (byte_offset
에 복사는의 결과입니다). 아래의 코드에서
은, 첫 번째 부분은 테스트 함수이고 올바른 문자열을 출력, 두 번째 부분 배열을해야 무엇을 추출하는 동안,하지만 테스트는 쓰레기 유니 코드 값을 반환 할 때 :
/* Testing */
active_buffer.getBuffer().position(1);
active_buffer.getBuffer().put(event.getData());
active_buffer.getBuffer().position(1);
active_buffer.getBuffer().get(tuple, 0, (int)tuple_size);
System.out.println("Test1: " + new String(tuple)) ;
/* Test1 prints out the correct string */
unsafe.copyMemory((Object) event, byte_offset + base, (Object) null, active_buffer.getAddress() + 1, tuple_size);
active_buffer.getBuffer().position(1);
active_buffer.getBuffer().get(tuple, 0, (int)tuple_size);
System.out.println("Test2: " + new String(tuple));
/* Garbage unicode values gets printed*/
사람을 수 이 코드에 잘못된 것이 있습니까? data
으로
HotSpot은 JNI를 사용하는 대신 많은 안전하지 않은 "원시"호출을 내장 함수로 변환합니다. 예 : 이것은 하나의 기계어 명령 일 수 있습니다. –