[JVM Bytecode] Hello World 분해해보기
한번 간단한 헬로월드 프로그램을 작성하고 바이트코드를 분석해보겠다.
코드는 간단하다.
실행도 잘 된다.
자 그럼 클래스 파일을 한번 읽어보자.
자바 클래스파일을 분석하는 데엔 굳이 별도의 툴이 꼭 필요하진 않다.
javap라는 녀석만 있으면 되기 때문이다.
클래스파일을 전달하면, 해당 파일의 구조를 읽어서 뿌려준다.
정의하지도 않은 Main() 생성자와 main 메서드가 있다고 한다.
저걸론 부족하다. 인스트럭션 단계까지 들어가보자. -c 플래그를 주면 된다.
이제야 그럴듯하게 뽑힌다.
Code: 레이블은 메서드의 코드임을 명시하고,
그 안의 숫자 레이블들은 해당 명령의 주소, 이어지는 aload_0 등의 단어들은 명령어다.
jvm의 명령어들은 각각 1~3바이트씩을 차지하기 때문에, 1~3의 간격으로 표시된다.
그래서 저길 보면 aload_0는 1바이트, invokespecial은 3바이트짜리 명령어인듯하다.
그리고 명령어의 피연산자들이 죄다 # 붙은 숫자들인데... 저걸 상수 풀(Pool)이라고 한다.
컴파일타임 상수에 숫자로 이름을 붙여서 관리하는 것이다.
저것까지 전부 보고 싶다면 javap를 호출할때 -v 플래그를 달아준다.
겁나 길어졌다.
하지만 -c만으로는 숨겨졌던 상수값 정보가 나타났다.
#18은 "Hello"이고 #18을#3에 넣었으니 #3가 "Hello"가 된 것이다.
그렇다.
참조
https://resources.infosecinstitute.com/java-bytecode-reverse-engineering/
https://resources.infosecinstitute.com/java-bytecode-reverse-engineering/
https://blog.overops.com/javap-usage-unfolds-whats-hidden-inside-your-java-class-files/
https://blog.overops.com/javap-usage-unfolds-whats-hidden-inside-your-java-class-files/