[목표]

 

 

프리다에서 제공하는 JavaScript API 중

자주 사용하는 JavaScript API 5 종류를

소개하며 사용법을 확인한다.

 

연습 예제 및 실전 활용에서

꾸준히 사용되는 각각의 API가

어떤 역할을 하는지 개념적으로 살펴보고

추후 실습을 통해 파악한 기능을 연습하며

몸으로 익혀본다.

 

 

 


 

 

[목차]

 

 

# 이론

1. Java.perform(fn)

2. Java.use(className)

3. Java.choose(className, callbacks)

4. Java.enumerateLoadedClasses(callbacks)

5. setImmediate(fn)

6. [추가] Overloading

 

 


 

 

 

1. Java.perform(fn)

 

  • 현재 스레드가 가상머신에 연결되어 있는지 확인하고 fn을 호출
  • 프리다를 활용하려면 반드시 해당 메서드를 통해 가상머신 또는

       단말기 연결을 확인해야 하므로 가장 많이 사용됨

 

# 기본 뼈대 구조

Java.perform(function() {     // 대소문자 주의!
/*
  ...
  do sth
  ...
*/
})
 

 

 

 

 

 

2. Java.use(className)

 

  • Java.use()는 변수와 메서드에 액세스 할 수 있는 클래스 객체를 반환

   예) Java.use(A)를 선언한 경우 지정한 A 클래스를 사용한다고 선언한 것!

       > 클래스의 인스턴스를 반환하는 것이 아닌 클래스의 객체를 반환한다!

       > 안드로이드 앱의 내부 코드 중 인스턴스를 반환하려면

       Java.choose라는 API를 사용해야 함

 

  • 메서드 구현을 변경하려면 새로운 메서드로 덮어 써야 함
  • 주의! 인스턴스를 반환하는 것이 아닌 클래스 객체를 반환함

      > 한 마디로 지정한 클래스를 사용하는 것!

 

 

# Java.use() 기본 뼈대 구조 확인

  • 앱에서 사용하는 클래스와 연동되는 myClass를 정의
  • .implementation : 앱에서 정의된 메서드의 구현 내용을 재작성
Java.perform(function() {                            // Java.perform으로 가상머신 연결 후 
   var myClass = Java.use(com.mypackage.name.class)  // 연결 되면 내부의 Java.use 메소드를 통해
                                                     // com.mypackage.name 이라는 클래스를 다룸
   myClass.myMethod.implementation = function(param) // myClass 내 myMethod라는 메소드를 다루는데
   {                                                 // implementation을 통해 myMethod 재작성 가능
       // do sth                                     
   }
}
 

 

 

# 정리

Java.use()는

변수와 메서드에 접근할 수 있는 클래스 객체를 반환하여

반환된 값을 활용해 내부에 있는 함수를 재작성 하는 기능을 함

 

 

 

 

3. Java.choose(className, callbacks)

 

  • 힙을 스캔하여 클래스에서 실행 중인 인스턴스화 된 객체 찾기 가능

     - callbacks : onMatch, onComplete

     - onMatch : 실시간으로 인스턴스에 대해 호출

     - onComplete : function()의 모든 인스턴스가 열거될 때 호출

 

 

 

# 기본 코드 뼈대 구조

java.perform(function() {                         // 가상머신 연결 확인되면 내부 Java.choose 코드 실행
   Java.choose(com.myPackage.name.class, {        // com.myPackage.name.class 라는 클래스의 instance를
      "onMatch" : function(instance){             // onMatch function 내부의 instance 인자로 받는다.
      // 프리다는 요청에 일치하는 것을 찾으면 하나 이상의 인수로 호출
            console.log(instance.toString())       // 찾은 instance 값을 문자열로 출력
       }
       "onComplete" : function() {}
       })
}) 
 

 

# 정리

Java.choose()는 힙을 스캔하여

className 이름을 가진 클래스의

실행 중인 인스턴스화된 객체를 찾아

callback에 넘겨주고 일치하는 것을

찾을 때마다 console.log로 출력

 

 


 

 

4. Java.enumerateLoadedClasses(callbacks)

 

  • 로드된 모든 클래스를 열거하고 모든 일치 항목을 출력

       - onMatch : 실시간으로 인스턴스에 대해 호출

       - onComplete : function()의 모든 인스턴스가 열거될 때 호출

 

Java.perform(function() {
   Java.enumeratLoadedClasses({      // 로그된 모든 클래스 열거 후
      "onMatch" : function(className) {     // className 이라는 인수로 받는다
          console.log(className)
      },
      "onComplete":function() {}
   })
})
 

 

 

 

 

5. setImmediate(fn)

 

  • Process terminated 오류 해결하기

 

자바스크립트 payload 작성 전 주의사항이 있는데

프리다는 emulation이 느려져 시간 초과가 되는 경우

연결을 자동으로 종료하는 경우가 있는데

 

이를 막기 위해 아래 코드처럼 스크립트를

setImmediate 함수로 포장한다.

 

setImmediate(function() { // prevent timeout!
   console.log("[+] 연결 종료 방지!!");

   Java.perform(function() {
      myClass = Java.use("com.takudaddy.name.class.name");
      myClass.implementation = function(v) {
         // do sth.
   }
})})
 

 

스크립트 수정 시

위와 같이 setImmediate 적용하면

에뮬레이터가 느려져 시간 초과되더라도

 

setImmediate가 프리다에서

스크립트를 백그라운드에서

자동으로 재실행 해주기 때문에

 

스크립트를 작성할 때

혹시 모를 상황을 대비해

함께 사용함!

 

 

 


 

 

6. Overloading

 

  • 메서드 구현을 재작성할 때 유의 사항 : 다형성

 

Java에서는 overloading이 존재하는데

overloading 이란 하나의 클래스에

같은 이름의 메서드가 여러 개 존재하는 것을

말한다.

 

다만 각 메서드마다 인자의 타입이나 개수는

다르며 달라야 한다.

 

예로 아래 코드를 보면 myClass라는 클래스에

takudaddy_method라는 동일한 이름의 메서드가

3개 존재하는데

 

myClass.takudaddy_method.overload().implementation = function() {
   // do sth
}

myClass.takudaddy_method.overload("[B", "[B").implementation = function(param1, param2) {
   // do sth
}

myClass.takudaddy_method.overload("android.context.Context", "boolean).implementation = 
function(param1, param2) {
   // do sth
}
 

overloading이 적용된 메서드가 여러 개 있는 경우

프리다에서 처리 방식은 위 코드와 같다.

 

첫 번째는 입력받는 인수가 없는 메서드

두 번째는 두 개의 바이트 배열을 인수로 입력 받는 메서드

세 번째는 앱의 context와 Boolean 형태의 인수로 입력받는 메서드!

 

 

 

# overload() 매개변수 카테고리

.overload()
.overload('int’)
.overload('boolean')
.overload('float')
.overload('[B') // byte array
.overload('[B', '[B', '[B')
.overload('java.io.File')
.overload('java.lang.String')
.overload('android.view.View')
.overload('android.app.Activity')
.overload('android.content.Context')
.overload('android.content.Context', 'java.lang.String')
.overload('java.lang.String', 'java.lang.String')
.overload('android.graphics.Bitmap')
.overload('java.util.List’)
.overload('android.content.Context', 'java.lang.String', 'java.lang.String')
.overload('android.app.Activity', 'int', 'int', 'int', 'boolean')
 

 


 

 

이 밖에 JavaScript API는 프리다 공홈

DOCS > JavaScript API에서 확인!

 

 

 

 

 

[도움 출처]

: 보안프로젝트 김태영 팀장

728x90

+ Recent posts